2016-12-21 9 views
1

私は、次のメカニックを使用して移動したいオブジェクトを持っています。左右の矢印は回転を変え、上矢印はその位置を増やします。 私の問題は、自分自身の周りのオブジェクトを回転させることができないか、それを見ている方向に動かすことができないということです。オブジェクトの周りを回転する

ドロー機能は次のとおりです。

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glScalef(SCALE, SCALE, SCALE); 
glTranslatef(x, 0, 0); 
glRotatef(rotationZ, 0, 0, 1); 
glTranslatef(-x, 0, 0); 

// Draw the object... 

glPopMatrix(); 

押し検出コード:

case GLUT_KEY_UP: 
     teclas.up = GL_TRUE; 
     glutPostRedisplay(); 
     break; 
case GLUT_KEY_LEFT: 
     teclas.left = GL_TRUE; 
     glutPostRedisplay(); 
     break; 
case GLUT_KEY_RIGHT: 
     teclas.right = GL_TRUE; 
     glutPostRedisplay(); 
     break; 

タイマー機能:

if (teclas.up) { 
    x++; 
} 

if (teclas.left) { 
    rotationZ++; 
} 
if (teclas.right) { 
    rotationZ--; 
} 

glutPostRedisplay(); 

私はこのことについて、複数のスレッドを見てきましたし、私はx変数の信号を変更しようとしましたが、何も動作していないようです。

編集(解決):

if (estado.teclas.up) { 

    homer.x+= (float)cos(homer.rotationZ * M_PI/180); 
    homer.y+= (float)sin(homer.rotationZ * M_PI/180); 
} 

そしてまた、私のDraw関数:

glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glScalef(SCALE, SCALE, SCALE); 
glTranslatef(x, 0, 0); 
glRotatef(rotationZ, 0, 0, 1); 

// Draw the object... 
glPopMatrix(); 
私はちょうどこれに前進する責任があるタイマー機能の一部を変更し

この方法では、オブジェクトは常に向いている方向に移動します

+0

概念的には、宇宙で個々のオブジェクトを回転させようとしているのですか、複数のオブジェクトを持つシーンの周りをカメラで回転しようとしていますか? –

+0

また、btwはgl行列演算がポスト乗算されていることに注意してください。つまり、あなたの変換は、それらの関数とは逆の順序でスケールが「起こります」回転します。つまり、xを平行移動し、回転させ、+ xを翻訳してから、その順序でスケールします。それはあなたの意図ですか? –

+0

@JasonC私は空間内の私の個々のオブジェクトを移動しようとしています、カメラは静的です。 2番目のコメントについてはわかりません。彼が正のX軸を向いているなら、上向きの矢印を押すと、彼はそのように移動します。私が彼を90度回転させると、彼はY軸に向かって移動します。それは理にかなっていますか? –

答えて

1

これはMoving Reference Frameに問題がある場合、それらはキーワードです。プロセスの物理学をシミュレートしない限り、OpenGLレンダリングのために私たちが心配しなければならないのは座標だけです。ここでは、時にはワールドフレーム(特にオブザーバもオブジェクトに対して相対移動する場合)と呼ばれる静止参照フレームと、オブジェクトに接続された移動参照フレーム(MRF)があります。 MRFは世界フレームに対して任意の回転と平行移動を行うことができ、それがどのように定義されるか伝統的な方法があります。

たとえば、地球の中心に原点として定義された地球儀MRFの場合、正のX軸は赤道と交差し、子午線は正のZ - 北極でYはそれらに相補的です。地球の地表面上の静止点(ローカル地理座標)に対しては、通常、Yは天頂に向けられ、正のZ - 水平面の北に向かって、そして正のX-は東に向かって正になります。移動する車両の場合、正のY軸またはピッチ軸は常に左を指し、正のZ軸またはヨー軸は常に上を指します。X - ロール軸はまっすぐ前方に向けられます。これはあなたのケースに合っているようです。

軸の指定にかかわらず、車両の回転はそれに対応する変更行列に相当します。それを変換行列と呼ぶことができます。ローカル座標では、車速v = {vx、0,0}は正のX軸と同一線上のベクトルです。しかし、世界では、それは

V」= Mの*のV Mは、MRFの変換行列である

に等しい座標。 vは単位時間当たりの座標の変化であるため、この式にも翻訳が必要です。これを解決するには2つの方法がありますが、従来のOpenGLを使用している場合、2つのオプションがあります。

最初に、恒等行列で開始し、すべての変換を適切な順序で再作成します。

  1. 単位行列を設定します。
  2. (ローカルコードで)必要な値によって翻訳
  3. 車両
  4. の回転が車両の最後の既知の位置の値によって翻訳適用します。
  5. 行列をOpenGLから(glGetFloatv(GL_MODELVIEW_MATRIX, ptr)によって)取得し、そこからオフセットを抽出することによって、車両の新しい位置を計算するか、変換を知るか、その値を読み取るかのいずれかです。

この方法の欠点は、OpenGLの関数を使用しなければならないことです。ここで、glTranslateまたはglRotateの各呼び出しは、逆の順序で他の行列と乗算される別の行列を作成します。それは余分な数学演算であり、その精度も鮮明ではありません。いくつかの参照フレーム、特にネストされている場合は、中国語でかなり面白いことがあります。

2番目の方法は、GLM(glm.h)などの数学ライブラリを使用して、参照の各フレームに行列を格納し、必要に応じて変更または再生成するなど、すべての行列計算を自分で行うことです。 glLoadMatrixによって、レガシーモードでもOpenGLに行列を直接供給することができます。パフォーマンスについて心配するなら、CPU上のすべての現代的な実装がこれで成し遂げられていることを知っておくべきです。GPUはもはやマトリックススタックで長時間動作しません。これは、オープンソースの実装を調べることで素早く見つけることができます。

最新の柔軟なパイプラインの場合、glScale、glTranslate、glRotateはまったく使用できません。 OpenGL 3では、マトリックススタック全体が廃止されました。第2の方法でしか実行できませんが、この場合は、ユニフォームを使用してシェーダープログラムに行列を供給します。

関連する問題