0

私のレンダラーには、次のものがあります。

private float[] MATRIX_VIEW = new float[16];
private float[] MATRIX_PROJECTION = new float[16];
private float[] MATRIX_VP = new float[16];

「onSurfaceChanged」で:

...
//Set projection
Matrix.orthoM(
  MATRIX_PROJECTION,0,
  -hDim,hDim,
  -vDim,vDim,
  1,100
);
//Set View
Matrix.setLookAtM(
  MATRIX_VIEW,0,
  cameraPosition[0],
  cameraPosition[1],
  cameraPosition[2],
  cameraFacing[0],
  cameraFacing[1],
  cameraFacing[2],
  cameraHook[0],
  cameraHook[1],
  cameraHOOK[2]
);
//SetView*Projection
Matrix.multiplyMM(
  MATRIX_VP,0,
  MATRIX_PROJECTION,0,
  MATRIX_VIEW,0
);
...

私は 1 つの形状の多くのクローンを持っているので、「ShapeSet_Set」クラスを次のように記述しました。

...    
private float[] MATRIX_ORIGIN = new float[16];
private float[] MATRIX_VPO = new float[16];

private float[] MATRIX_SCALE = new float[16];
...

/*
origin matrix is group of all shapes center position
scale matrix represents zoom
*/

および「ShapeSet_Element」は次のとおりです。

...    
private float[] MATRIX_POSITION = new float[16];
private float[] MATRIX_ROTATION = new float[16];

private float[] MATRIX_ALL = new float[16];
...

/*
position matrix is position of shape relative to origin position
rotation matrix is shape rotation arond its center
all matrix is matrix which will be passed to shader
*/

レンダラーの on "DrawFrame" では、ShapeSet_Set の "onDrawFrame" が呼び出されます。View*Projection*Origin マトリックスを計算します。

...
Matrix.multiplyMM(
  MATRIX_VPO,0,
  RENDERER.getVPMatrix(),0,
  MATRIX_ORIGIN,0
);
...

そして、以下を含む各 ShapeSet_Element の「onDrawFrame」を呼び出します。

...
//Get View*Projection*Origin matrix
System.arraycopy(
  SET.getVPOMatrix(),0,
  MATRIX_ALL,0,
  16
);
//Apply zoom
Matrix.multiplyMM(
  MATRIX_ALL,0,
  MATRIX_ALL,0,
  SET.getScaleMatrix(),0
);
//Apply element's position
Matrix.multiplyMM(
  MATRIX_ALL,0,
  MATRIX_ALL,0,
  MATRIX_POSITION,0
);
//Apply element's rotation
Matrix.multiplyMM(
  MATRIX_ALL,0,
  MATRIX_ALL,0,
  MATRIX_ROTATION,0
);
...

回転を適用するまで、すべて正常に動作します。これは要素の回転を設定するメソッドです:

public void setRotation(float xDeg,float yDeg,float zDeg)
{
  //Set new rotation values to open up actual values
  rotation_X = xDeg;
  rotation_Y = yDeg;
  rotation_Z = zDeg;
  //Set new rotation matrix
  Matrix.setIdentityM(MATRIX_ROTATION,0);
  //Rotate around x axis
  Matrix.rotateM(
    MATRIX_ROTATION,0,
    rotation_X,0,
    1,0,0
  );
  //Rotate around y axis
  Matrix.rotateM(
    MATRIX_ROTATION,0,
    -rotation_Y,0,
    0,1,0
  );
  //Rotate around z axis
  Matrix.rotateM(
    MATRIX_ROTATION,0,
    rotation_Z,0,
    0,0,-1
  );
}

要素を x 軸または y 軸を中心に回転すると正常に動作しますが、... z 軸を中心に回転すると、要素の高さ (元の y 寸法) が幾何学的に 0 まで縮小され、90 度回転すると元の値に拡大されます。度。

何が原因なのか、誰にもわかりませんか?

これが間違った行列乗算または間違った回転行列設定によって行われた場合、解決できません。

4

1 に答える 1

0

このhttp://tutorialrandom.blogspot.com/2012/08/how-to-rotate-in-3d-using-opengl-proper.htmlのような四元数なしでジンバルロックを回避できます

モデルビュー マトリックスの何かがおかしくなっているようです。上記のリンクのようにローテーションを実行すると、問題が解決する場合があります。

于 2013-02-18T09:06:36.957 に答える