1

立方体を描いています。オブジェクト空間で回転させたいです。以下のコードは、立方体をそれ自身以外の軸を中心に移動させます。ですから、どんな提案でも事前に感謝します。

    public void onSurfaceCreated(GL10 unused, EGLConfig config){
    // Set the background frame color
    GLES20.glClearColor(0.5f, 0.2f, 0.1f, 1.0f);

    Matrix.setLookAtM(viewMatrix, 0, 0.0f, 0.0f, -5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    cube = new Cube();     
}           

//  @Override
public void onSurfaceChanged(GL10 unused, int width, int height){
    GLES20.glViewport(0, 0, width, height);        
    float ratio = (float) width / height;
    float angle, near, far, bottom, top,left, right;
    angle = 45.0f;
    near = 1.0f;
    far = 10.0f;

    top = near * (float)Math.tan(angle*(Math.PI/360.0));
    bottom = -top;
    left = bottom * ratio;
    right = top * ratio;

    Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, near, far);
}

//@Override 
public void onDrawFrame(GL10 unused) {        
    // Draw background color
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    Matrix.setRotateM(rotationXMatrix, 0, mAngleX, 1.0f, 0.0f, 0.0f);
    Matrix.setRotateM(rotationYMatrix, 0, mAngleY, 0.0f, 1.0f, 0.0f);
    Matrix.multiplyMM(rotationMatrix, 0, rotationXMatrix, 0, rotationYMatrix, 0);
    Matrix.multiplyMM(modelViewMatrix, 0, rotationMatrix, 0, viewMatrix, 0);
    Matrix.multiplyMM(ModelViewProjectionMatrix, 0, projectionMatrix, 0, modelViewMatrix, 0);

    cube.draw(ModelViewProjectionMatrix, modelViewMatrix);      
}
4

1 に答える 1

1

アルゴリズム:

  1. ModelMatrix * playerCentreから現在のモデル位置(x、y、z)を取得します
  2. ModelMatrixをIdentityMatrixに設定します
  3. オブジェクトを0,0,0に変換します
  4. wrtz軸を0に回転します
  5. y軸に沿ってdsで平行移動します
  6. zAngleの全回転まで回転します
  7. 手順3、4、5、6を使用してModelMatrixを設定します
  8. 手順1を繰り返します
  9. 手順2を繰り返します
  10. オブジェクトを0,0,0に変換します
  11. z軸をzAngleに回転させます
  12. ステップ1のモデル位置+ステップ8のモデル位置にオブジェクトを変換します

コード:

private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {
    Matrix.setIdentityM(GLES20Renderer._RMatrix, 0);

    //Matrix.rotateM(GLES20Renderer.RMatrix, 0, xAngle, 0, 1, 0);
    //Matrix.rotateM(GLES20Renderer.RMatrix, 0, yAngle, 1, 0, 0);
    Matrix.rotateM(GLES20Renderer._RMatrix, 0, zAngle, 0, 0, 1);
    _ds = upDown - GLES20Renderer._upDown;

    float[] RMatrix         = new float[16];
    float[] TMatrix         = new float[16];
    float objX              = 0.0f;
    float objY              = 0.0f;
    float objZ              = 0.0f;
    float objTempTranslateX = 0.0f;
    float objTempTranslateY = 0.0f;
    float objTempTranslateZ = 0.0f;

    //////////////////////////////////////
    // transformations for nozzle start //
    //////////////////////////////////////
    Matrix.multiplyMV(GLES20Renderer._uNozzleCentreMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0, GLES20Renderer._uNozzleCentre, 0);
    //collision parameter
    objX    = GLES20Renderer._uNozzleCentreMatrix[0];
    objY    = GLES20Renderer._uNozzleCentreMatrix[1];
    objZ    = GLES20Renderer._uNozzleCentreMatrix[2];

    Log.d("ZAXIS", "OBJY: " + GLES20Renderer._uNozzleCentreMatrix[1]);

    Matrix.setIdentityM(GLES20Renderer._ModelMatrixNozzle, 0);
    Matrix.setIdentityM(TMatrix, 0);
    Matrix.translateM(TMatrix, 0, 0, (float)GLES20Renderer._ds/10, 0);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixNozzle, 0, TMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixNozzle, 0, GLES20Renderer._RMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0);
    Matrix.multiplyMV(GLES20Renderer._uNozzleCentreMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0, GLES20Renderer._uNozzleCentre, 0);

    objTempTranslateX   = GLES20Renderer._uNozzleCentreMatrix[0];
    objTempTranslateY   = GLES20Renderer._uNozzleCentreMatrix[1];
    objTempTranslateZ   = GLES20Renderer._uNozzleCentreMatrix[2];

    Matrix.setIdentityM(GLES20Renderer._ModelMatrixNozzle, 0);
    Matrix.setIdentityM(TMatrix, 0);
    Matrix.setIdentityM(RMatrix, 0);
    Matrix.translateM(TMatrix, 0, 0, 0, 0);
    Matrix.rotateM(RMatrix, 0, 0, 0, 0, 1);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixNozzle, 0, RMatrix, 0, TMatrix, 0);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixNozzle, 0, GLES20Renderer._RMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0);
    Matrix.setIdentityM(TMatrix, 0);
    if( Math.abs(GLES20Renderer._ds) > 0 ) {
        Matrix.translateM(TMatrix, 0, (objX + objTempTranslateX), (objY + objTempTranslateY), (objZ + objTempTranslateZ));          
    }
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixNozzle, 0, TMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0);

    Matrix.multiplyMM(GLES20Renderer._MVPMatrixNozzle, 0, GLES20Renderer._ViewMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0);
    Matrix.multiplyMM(GLES20Renderer._MVPMatrixNozzle, 0, GLES20Renderer._ProjectionMatrix, 0, GLES20Renderer._MVPMatrixNozzle, 0);
    /////////////////////////////////////
    // transformations for nozzle end  //
    /////////////////////////////////////

    ////////////////////////////////////
    // transformations for body start //
    ////////////////////////////////////
    Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
    //collision parameter
    objX    = GLES20Renderer._uBodyCentreMatrix[0];
    objY    = GLES20Renderer._uBodyCentreMatrix[1];
    objZ    = GLES20Renderer._uBodyCentreMatrix[2];

    Matrix.setIdentityM(GLES20Renderer._ModelMatrixBody, 0);
    Matrix.setIdentityM(TMatrix, 0);
    Matrix.setIdentityM(RMatrix, 0);
    Matrix.translateM(TMatrix, 0, 0, 0, 0);
    Matrix.rotateM(RMatrix, 0, 0, 0, 0, 1);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixBody, 0, RMatrix, 0, TMatrix, 0);
    Matrix.setIdentityM(TMatrix, 0);
    Matrix.translateM(TMatrix, 0, 0, (float)GLES20Renderer._ds/10, 0);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixBody, 0, TMatrix, 0, GLES20Renderer._ModelMatrixBody, 0);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._RMatrix, 0, GLES20Renderer._ModelMatrixBody, 0);
    Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);

    objTempTranslateX   = GLES20Renderer._uBodyCentreMatrix[0];
    objTempTranslateY   = GLES20Renderer._uBodyCentreMatrix[1];
    objTempTranslateZ   = GLES20Renderer._uBodyCentreMatrix[2];

    Matrix.setIdentityM(GLES20Renderer._ModelMatrixBody, 0);
    Matrix.setIdentityM(TMatrix, 0);
    Matrix.setIdentityM(RMatrix, 0);
    Matrix.translateM(TMatrix, 0, 0, 0, 0);
    Matrix.rotateM(RMatrix, 0, 0, 0, 0, 1);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixBody, 0, RMatrix, 0, TMatrix, 0);
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._RMatrix, 0, GLES20Renderer._ModelMatrixBody, 0);
    Matrix.setIdentityM(TMatrix, 0);
    if( Math.abs(GLES20Renderer._ds) > 0 ) {
        Matrix.translateM(TMatrix, 0, (objX + objTempTranslateX), (objY + objTempTranslateY), (objZ + objTempTranslateZ));          
    }
    Matrix.multiplyMM(GLES20Renderer._ModelMatrixBody, 0, TMatrix, 0, GLES20Renderer._ModelMatrixBody, 0);

    Matrix.multiplyMM(GLES20Renderer._MVPMatrixBody, 0, GLES20Renderer._ViewMatrix, 0, GLES20Renderer._ModelMatrixBody, 0);
    Matrix.multiplyMM(GLES20Renderer._MVPMatrixBody, 0, GLES20Renderer._ProjectionMatrix, 0, GLES20Renderer._MVPMatrixBody, 0);
    ///////////////////////////////////
    // transformations for body end  //
    ///////////////////////////////////

    GLES20Renderer._upDown  = upDown;
    //collision parameter
    Matrix.multiplyMV(GLES20Renderer._uPlayerCentreMatrix, 0, GLES20Renderer._ModelMatrixNozzle, 0, GLES20Renderer._uPlayerCentre, 0);
}

ここで、upDownは、クリック可能なUIビュー(UIボタンなど)が押されて、頭が指す場所に沿って立方体を移動した回数の現在の値です。実際、上記のコードIには、上用と下用の2つのボタンがあります。 2つのキューブノズルとボディがあります

与えられたコードにobjYの自動インクリメントを引き起こすエラーがあるため、自分でアルゴリズムを実装してみてください

時間がないので、コードはすぐに使用できるように編集されていません。つまり、私のアプリからです。

同じ質問を投稿しましたが、返信を待っています。アルゴリズムは完全に正しいので、コードにエラーがあります。

これが私の質問です: https ://stackoverflow.com/questions/11817450/rotation-about-local-z-axis

于 2012-08-06T20:51:29.473 に答える