0

iPadでGLKitを使用して立方体を描画および回転しようとしています。私の問題は、立方体が回転すると、縦横比が変化するように見え、回転すると圧迫されることです。私が言いたいことは、立方体が反時計回りに 90 度回転している次の 3 つの画像で見ることができます。最初(最初の画像)では、立方体の幅/高さの比率は約です。私が設定した1/2

GLKMatrix4 scaleMatrix=GLKMatrix4MakeScale(0.5, 1., 0.3);

それが回転すると、「絞られ」て pi/2 回転後に終了し、ベース (回転前) であった側が高さの 2 倍になります (3 番目の画像)。私の間違いは私が渡す引数にあるとGLKMatrix4MakePerspective思いますが、openGLメソッドへのすべての呼び出しとそれぞれが何をしているのかにあまり慣れていないので、それに何らかの関係があると思われるコードの一部を画像の後に置きます.

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

- (void)draw{
//just a quaternion that rotates the cube
GLKQuaternion glkq=GLKQuaternionMake(_quat.x,_quat.y,_quat.z,_quat.w);
GLKMatrix4 rotationMatrix=GLKMatrix4MakeWithQuaternion (glkq);

GLKMatrix4 scaleMatrix=GLKMatrix4MakeScale(0.5, 1., 0.3);
GLKMatrix4 translateMatrix = GLKMatrix4MakeTranslation(0.,0.,0.);

GLKMatrix4 modelMatrix =GLKMatrix4Multiply(translateMatrix,
                            GLKMatrix4Multiply(scaleMatrix,rotationMatrix));

GLKMatrix4 viewMatrix = GLKMatrix4MakeLookAt(0, 0, 5, 0, 0, 0, 0, 1 , 0);
effect.transform.modelviewMatrix = GLKMatrix4Multiply(viewMatrix, modelMatrix);


effect.transform.projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(45.0f), 3./4., 3, -5);

[effect prepareToDraw];

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, triangleVertices);

glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, triangleColors);

glDrawArrays(GL_TRIANGLES, 0, 36);

glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribColor);
}

ここで私が間違っていることを教えてくれるコードの他の部分が必要かどうかはわかりません...

4

1 に答える 1

0

一連の幾何学的変換としての行列の乗算は、右から左に機能し、可換ではありません。つまり、回転行列Rとスケール行列が与えられたS場合、積S x Rは「回転しRてからスケールする」ことを意味します。これは、「スケールしてから回転する」Sとは異なる結果です(積 で与えられる)。SRR x S

回転後にスケーリングします。立方体を直角プリズムに押しつぶしてから回転させるのではなく、立方体を回転させてから結果の画像を押しつぶします。scaleMatrixandの乗算を逆にするとrotationMatrix、期待どおりの結果が得られるはずです。

(また、translateMatrixゼロの平行移動を指定しているため、それをモデル ビュー マトリックスに乗算しても何も起こりません。ゼロ以外の場合、どの順序でモデル ビュー マトリックスに乗算する必要がありますか?)

于 2013-10-01T21:54:28.377 に答える