2009-08-12 28 views
1

iPhoneの画面にスプライトを描くことができますが、回転させようとすると奇妙な結果が出ます。スプライトがy軸(90度と270度)を指すように近づくほど、スプライトがy方向に伸びているようです。 x軸と-x軸(0度と180度)を指すと正しく表示されます。それは基本的に回転の代わりにせん断であるのと同じです。コードの本質は次のとおりです(投影行列はオルソです)。OpenGL ES glRotatefは、回転の代わりにせん断を実行しますか?

glPushMatrix(); 
    glLoadIdentity(); 
    glTranslatef(position.x, position.y, -1.0f);  
    glRotatef(rotation, 0.0f, 0.0f, 1.0f); 
    glScalef(halfSize.x, halfSize.y, 1.0f); 

    vertices[0] = 1.0f; 
    vertices[1] = 1.0f; 
    vertices[2] = 0.0f; 
    vertices[3] = 1.0f; 
    vertices[4] = -1.0f; 
    vertices[5] = 0.0f; 
    vertices[6] = -1.0f; 
    vertices[7] = 1.0f; 
    vertices[8] = 0.0f; 
    vertices[9] = -1.0f; 
    vertices[10] = -1.0f; 
    vertices[11] = 0.0f; 

    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
glPopMatrix(); 

誰でも私にこの問題を解決する方法を教えてもらえますか?

halfsizeは、スプライトのxとyの範囲のちょうど半分です。 glScalef呼び出しを削除しても差は生じません。

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(0, 320, 480, 0, 0.01, 5); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

OK、うまくいけば、このスクリーンショットは、何が起こっているのかを説明します:ここで

は私の行列のセットアップで

+0

あなたのglOrthoコールを表示できますか?それがそれに影響を与えるかどうかは疑問だ。 –

+0

halfSize.xとhalfSize.yは何ですか?あなたがglScalef行を削除してもまだ起こりますか? – Goz

+0

ここからすべてがよく見えます。私はいくつかのスクリーンショットを投稿します。 –

答えて

3

あなたはx、y方向に同じ量によってスケーリングされている場合あなたの投影は歪みを引き起こしています。

ちょうど勘違いですが、Ortho投影で320と480を交換してみてください。 (iPhoneのXとYが入れ替わった場合)

+0

うわー!それが答えでした、ありがとうございました。すべてが今働きます! –

+0

彼のポストAJを受け入れるのを忘れないでください。 – Goz

+0

私はそうしていますが、現時点でどのようにそれを行うのか分かりません。たぶん最低限の時間制限がある、あるいは私が登録されていないのでできないかもしれません。とにかく後で確認します。 –

関連する問題