2017-11-19 4 views
1

私は大きなプラットフォームとキャラクターが複数のキューブで構成されている3Dプラットフォームに取り組んでいます。このキューブのグループを中心にどのように回転させるのですか?

しかし、文字キューブのY軸を回転しようとすると、中心点で回転しません。彼らは巨大な円の中でプラットフォームの周りを周回するだけです。私はglRotatefの順序が間違っていると推測していますが、キューブのグループを中心点の周りだけに回転させるためには、どのような順序にする必要があるのか​​分かりません。

それらを描画するための私のコードは次のとおりです。

for (int i = 0; i < Models.size(); i++){ // theres only one model this has to go through that stores the group of cubes for the character 
    glPushMatrix(); // set rotation for the whole group (I would expect...) 
    glRotatef(Models.at(i)->ModelRotation.X,1,0,0); 
    glRotatef(Models.at(i)->ModelRotation.Y,0,1,0); 
    glRotatef(Models.at(i)->ModelRotation.Z,0,0,1); 
    for (int j = 0; j < Models.at(i)->Parts.size(); j++) // For each cube in the character, 
     Models.at(i)->Parts.at(j)->Render(); // draw the cube 
    glPopMatrix(); 
} 

モデルは単に「ModelRotation」と呼ばれるのVector3と文字のためのすべてのキューブを保存する「部品」と呼ばれる法線ベクトルを持つ構造体です。キューブクラスのキューブをレンダリングするための

My機能は次のとおりです。

void Render(){ 
    glPushMatrix(); 
    glTranslatef( Position.X, 
        Position.Y, 
        Position.Z 
    ); 
    glColor3f(  Color.R, 
        Color.G, 
        Color.B 
    ); 
    glScalef(  Size.X, 
        Size.Y, 
        Size.Z 
    ); 

    // Render the front quad 
    //glBindTexture(GL_TEXTURE_2D, Faces[0]); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); glVertex3f( 1.0f, -1.0f, -1.0f); 
     glTexCoord2f(1, 0); glVertex3f(-1.0f, -1.0f, -1.0f); 
     glTexCoord2f(1, 1); glVertex3f(-1.0f, 1.0f, -1.0f); 
     glTexCoord2f(0, 1); glVertex3f( 1.0f, 1.0f, -1.0f); 
    glEnd(); 

    // Render the left quad 
    //glBindTexture(GL_TEXTURE_2D, Faces[1]); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); glVertex3f( 1.0f, -1.0f, 1.0f); 
     glTexCoord2f(1, 0); glVertex3f( 1.0f, -1.0f, -1.0f); 
     glTexCoord2f(1, 1); glVertex3f( 1.0f, 1.0f, -1.0f); 
     glTexCoord2f(0, 1); glVertex3f( 1.0f, 1.0f, 1.0f); 
    glEnd(); 

    // Render the back quad 
    //glBindTexture(GL_TEXTURE_2D, Faces[2]); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); glVertex3f(-1.0f, -1.0f, 1.0f); 
     glTexCoord2f(1, 0); glVertex3f( 1.0f, -1.0f, 1.0f); 
     glTexCoord2f(1, 1); glVertex3f( 1.0f, 1.0f, 1.0f); 
     glTexCoord2f(0, 1); glVertex3f(-1.0f, 1.0f, 1.0f); 
    glEnd(); 

    // Render the right quad 
    //glBindTexture(GL_TEXTURE_2D, Faces[3]); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); glVertex3f(-1.0f, -1.0f, -1.0f); 
     glTexCoord2f(1, 0); glVertex3f(-1.0f, -1.0f, 1.0f); 
     glTexCoord2f(1, 1); glVertex3f(-1.0f, 1.0f, 1.0f); 
     glTexCoord2f(0, 1); glVertex3f(-1.0f, 1.0f, -1.0f); 
    glEnd(); 

    // Render the top quad 
    //glBindTexture(GL_TEXTURE_2D, Faces[4]); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 1); glVertex3f(-1.0f, 1.0f, -1.0f); 
     glTexCoord2f(0, 0); glVertex3f(-1.0f, 1.0f, 1.0f); 
     glTexCoord2f(1, 0); glVertex3f( 1.0f, 1.0f, 1.0f); 
     glTexCoord2f(1, 1); glVertex3f( 1.0f, 1.0f, -1.0f); 
    glEnd(); 

    // Render the bottom quad 
    //glBindTexture(GL_TEXTURE_2D, Faces[5]); 
    glBegin(GL_QUADS); 
     glTexCoord2f(0, 0); glVertex3f(-1.0f, -1.0f, -1.0f); 
     glTexCoord2f(0, 1); glVertex3f(-1.0f, -1.0f, 1.0f); 
     glTexCoord2f(1, 1); glVertex3f( 1.0f, -1.0f, 1.0f); 
     glTexCoord2f(1, 0); glVertex3f( 1.0f, -1.0f, -1.0f); 
    glEnd(); 
    glPopMatrix(); 
}; 

すべてのヘルプは非常に高く評価されるだろう。 私はそれが単なる単純な間違いだと思っています。 必要な場合は、さらにコードを表示します。

おかげ

+0

移動'glTranslatef'操作の後、' render'関数へ 'glRotatef'操作を実行します – Rabbid76

+3

[マルチパートオブジェクトの回転]の可能な複製(https://stackoverflow.com/questions/46720166/rotating-a-multipart-object) – Rabbid76

答えて

0

あなたはそのローカル軸を中心にオブジェクトを回転させたい場合は、あなたがglRotatef操作の前にglTranslatef操作を実行する必要があります。

void Render() 
{ 
    glPushMatrix(); 
    glTranslatef(Position.X, Position.Y, Position.Z); 
    glRotatef(ModelRotation.Y,0,1,0); 

    .... 

    glPopMatrix(); 
} 

glTranslatefglRotatef操作が翻訳を作成したり、新たな平行移動または回転によって行列スタック上の現在の行列を乗算する。

glRotatef続いglTranslatefのこの意味はtranslate * rotate次のとおりです。glTranslatef続い反対glRotatef

translate * rotate

rotate * translateのようになります。

rotate * translate

Rotating a multipart object

も参照してください。
0

OpenGLが変換を適用する方法は、実際にコーディングする方法と逆のPopMatrix()PushMatrix()の間で、下から上に向かっています。あなたのコードで

は、あなたが呼び出しされる順序は次のように反転さ:

Rotatef(); 
Translatef(); 
Scalef(); 

それは次のようになります。つまり

Translatef(); 
Rotatef(); 
Scalef(); 

、あなたは(最後として常に翻訳したいです理由(特別なグラフィックエフェクトやシーンレンダリング)がない限り、コードを最初の行(PopMatrix()の後の最初の行)に配置することを意味します。スケーリングと回転の変換を適用してからワールド座標でオブジェクトを変換します。(あなたのケースのように)マルチパートオブジェクトを回転させるための

ここで説明したように、あなたはおそらく、二回を翻訳する必要がありますRotating a multipart object

だから、キューブクラス外のコードは可能性のようなもの:

for (int i = 0; i < Models.size(); i++){ 
    glPushMatrix(); 
    glTranslatef( 
     Models.at(i)->WorldPosition.X, 
     Models.at(i)->WorldPosition.Y, 
     Models.at(i)->WorldPosition.Z, 
    ); 
    glRotatef(Models.at(i)->ModelRotation.X,1,0,0); 
    glRotatef(Models.at(i)->ModelRotation.Y,0,1,0); 
    glRotatef(Models.at(i)->ModelRotation.Z,0,0,1); 
    for (int j = 0; j < Models.at(i)->Parts.size(); j++) 
     Models.at(i)->Parts.at(j)->Render(); // draw the cube 
    glPopMatrix(); 
} 
関連する問題