アルゴリズム:
- ModelMatrix * playerCentreから現在のモデル位置(x、y、z)を取得します
- ModelMatrixをIdentityMatrixに設定します
- オブジェクトを0,0,0に変換します
- wrtz軸を0に回転します
- y軸に沿ってdsで平行移動します
- zAngleの全回転まで回転します
- 手順3、4、5、6を使用してModelMatrixを設定します
- 手順1を繰り返します
- 手順2を繰り返します
- オブジェクトを0,0,0に変換します
- z軸をzAngleに回転させます
- ステップ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