2017-02-19 9 views
2

を与え、私は次の座標によって定義されたキューブがあります。は私のOpenGLアプリケーションのために間違った結果

coords=new float [] {-0.5f,0.5f,0.5f,1f, 
    -0.5f,-0.5f,0.5f,1f, 
    0.5f,-0.5f,0.5f,1f, 
    0.5f,0.5f,0.5f,1f, 
    -0.5f,0.5f,-0.5f,1f, 
    -0.5f,-0.5f,-0.5f,1f, 
    0.5f,-0.5f,-0.5f,1f, 
    0.5f,0.5f,-0.5f,1f}; 

次の行列を表す:

-0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 0.5 
0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5 
0.5 0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 
1  1  1  1  1  1  1  1 

私は定義を回転行列:

float [] matrix=new float[16]; 
Matrix.setRotateM(matrix,0,90,1,0,0); 

は、だから私の行列は次のとおりです。

1 0 0 0 
0 0 -1 0 
0 1 0 0 
0 0 0 1 

私はMatrix.multiplyMM(coords,0,matrix,0,coords,0);と座標に回転を適用しようとすると、私は次のような結果を得る:

私にとって
-0,5 -0,5 0,5 0,5 -0,5 -0,5 0,5 0,5 
    -0,5 -0,5 -0,5 -0,5 0,5 -0,5 -0,5 0,5 
    0,5 -0,5 -0,5 0,5 -0,5 -0,5 -0,5 -0,5 
    1  1  1  1  1  1  1  1 

、そして同様に私の電卓によると、6日と7日の要素を2番目の行は間違っています(両方とも正でなければなりません)。 3行目の5番目と8番目の要素についても同じです。

問題がどこにあるか教えていただけますか?

+0

私が間違っている可能性が、どのように1は、1次元配列を使用して行列を表しているん:?マトリックスによってベクトルの集合を変換するには、適切なオフセットでMatrix.multiplyMVを繰り返し呼び出す必要がありますか – CKing

+2

@CKingこれは、行列が扱われる通常の方法です。 – QBrute

+0

@QBrute私は従いません。 OPは1D配列を作成しますが、データを2D配列として表しますか? – CKing

答えて

2

multiplyMMの解釈が間違っています。この関数は、4x4行列に別の4x4行列を乗算します。

Matrix.multiplyMM(coords,0,matrix,0,coords,0); 

を呼び出して関数は、第2のマトリックスとして、第1の行列として行列の最初の16台のフロートをCOORDSの最初の16台のフロートをとり、座標の最初の16台のフロートのすべてを記憶します。したがって、16日以降のすべての要素は決して触られません。

coordsの各ベクトルにmatrixの行列を掛けたかったと思います。このため、multiplyMMは完全に間違った関数です。なぜなら、行列時間行列ではなく行列時間行列乗算を行うからです。

for (int i = 0; i < 8; i++) 
{ 
    Matrix.multiplyMV(coords, 4 * i, matrix, 0, coords, 4 * i); 
}