0

単一の正方形を時計回りと反時計回りの両方で回転させるためのこのコードを作成しました。実際、これは jayway チュートリアルで回転させるためのサンプル コードです。コードは機能していません。

public void onDrawFrame(final GL10 gl) {

Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try{

                gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
                gl.glLoadIdentity();
                gl.glTranslatef(0.0f, 4.9f,-9.3f);
                //gl.glTranslatef(2.0f, 0.0f,0.0f);
                gl.glPushMatrix();
                gl.glRotatef(-angle, 0, 0, 1);  

                gl.glScalef(1.0f, 1.0f, 1.0f);
                square.draw(gl);
                gl.glPopMatrix();
                angle++;
                  Thread.sleep(5000);

            }
            catch(InterruptedException e){
            } 
           // To do
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            gl.glLoadIdentity();
            gl.glTranslatef(0.0f, 4.9f,-9.3f);
            //gl.glTranslatef(2.0f, 0.0f,0.0f);
            gl.glPushMatrix();
            gl.glRotatef(angle, 0, 0, 1);   

            //gl.glScalef(1.0f, 1.0f, 1.0f);
            square.draw(gl);    
            gl.glPopMatrix();
            angle++;
}   
});t.start(); 
4

1 に答える 1

0

OpenGL 関数は GLThread から呼び出す必要があります。つまり、opengl 関数は 3 つのメソッドで呼び出す必要があります。

> onDrawFrame
> onSurfaceChanged 
> onSurfaceCreated

あなたの例について

onDrawFrame は GLThread によって繰り返し呼び出されるため、新しいスレッドを作成せずに、角度を更新して正方形を直接描画できます。

public void onDrawFrame(final GL10 gl) {
    glClear(GL10.GL_COLOR_BUFFER_BIT);

    mAngle++; // update angle

    // draw with clockwise rotation
    glPushMatrix();
    {
        glTranslatef(100, 100, 0);
        glRotatef(+mAngle, 0, 0, 1);
        drawSquare();
    }
    glPopMatrix();

    // draw with anti clockwise rotation
    glPushMatrix();
    {
        glTranslatef(100, 200, 0);
        glRotatef(-mAngle, 0, 0, 1);
        drawSquare();
    }
    glPopMatrix();
}

それでも更新用の新しいスレッドを作成する場合は、次の例を参照してください。

float mAngle = 0;
boolean mExit = false;

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    Thread updateThread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!mExit) {
                mAngle++;
                SystemClock.sleep(20);
            }
        }
    });
    updateThread.start();
}


public void onDrawFrame(final GL10 gl) {
    glClear(GL10.GL_COLOR_BUFFER_BIT);

    // clockwise rotation
    glPushMatrix();
    {
        glTranslatef(100, 100, 0);
        glRotatef(mAngle, 0, 0, 1);
        drawSquare();
    }
    glPopMatrix();

    // anti clockwise rotation
    glPushMatrix();
    {
        glTranslatef(100, 200, 0);
        glRotatef(-mAngle, 0, 0, 1);
        drawSquare();
    }
    glPopMatrix();
}
于 2013-03-08T22:02:17.780 に答える