1

約 0,0,0 回転する回転オブジェクトがあります。私は今、別のオブジェクトを他のオブジェクトの周りで回転させたいと思っています。地球が太陽の周りを回転し、月が地球の周りを回転するようなものです。これについてどうすればよいかわかりません。

void earth(){
glPushMatrix();
    glRotatef(anglee, 1.0f, 0.0f, 0.0f);
    glTranslatef(0.0,20,0);
    glutSolidSphere(0.8,50,50);
glPopMatrix();

glPushMatrix();
    glRotatef(anglee, 0.0f, 0.0f, 0.0f);
    glTranslatef(0.0,20.0,8);
    glutSolidSphere(0.4,50,50);
glPopMatrix();
anglee+=4.0f;
}

最初のローテーションは正しくできましたが、2 番目のローテーションはどうすればよいかわかりません。

4

4 に答える 4

1

ここにヒントがあります..ディスプレイコールバック関数でこれを行います:

void display()
{
    glClearColor(0,0,0,0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(10,10,10, 0,0,0, 0,1,0);

    /* current position is by default the origin */

    //draw sun
    glutSolidSphere(1,100,100);

    //draw planet
    glRotated(angle1,0,1,0);        //rotates position by angle1
    glTranslated(0,0,5);            //translates position by sun-planet distance
    glutSolidSphere(0.7,100,100);   //draw planet at this new position

    //draw moon
    glRotated(angle2,0,1,0);        //rotates position by angle1+angle2
    glTranslated(0,0,2);            //translates position by planet-moon distance
    glutSolidSphere(0.3,100,100);   //draw moon at this new position

    glutSwapBuffers();

    angle1 += 0.2;
    angle2 += 0.2;
    if(angle1 > 360) angle1 = 0;
    if(angle2 > 360) angle2 = 0;
}

描画する惑星と月の部分の両方からいくつかの行にコメントを付けてみて、違いを確認してください。理解するのに役立ちます。

お役に立てれば!

于 2012-11-12T04:10:21.527 に答える
1

2回目のローテーションで抱えている問題:

glRotatef(anglee, 0.0f, 0.0f, 0.0f);

NoRotation Axis を指定していないのですか!!

試す:

glRotatef(anglee, 0.0f, 1.0f, 0.0f);

Y軸を中心に回転します!!!

于 2014-10-19T04:17:52.500 に答える
0

ここにいくつかの擬似コードがあります:

タイムフロートを宣言します。

更新/描画ループで .01 のような小さな値でインクリメントします

変換 X 値に対して Math.cos(time) * (目的の半径) を実行し、変換 Y 値に対して Math.sin(time) * (目的の半径) を実行します。これにより、ゼロ付近の時間進行率に基づいて周回します。

「中心オブジェクト」の位置だけオフセットする必要がある場合は、最初のオブジェクトの移動を各移動軸に追加するだけです。

于 2012-11-11T13:46:25.067 に答える
0

あなたが実際に行っているのは、2 つの球体を両方とも空間的に変換することです。あなたがする必要があるのは、地球の位置に対する月の配置を行うことです->地球と月の描画の間に glPopMatrix() を実行しないでください。そうすることで、opengl 変換マトリックスをリセットするようなものです。

私は次のように試してみます:

  1. 0/0/0 に月を描く
  2. 月を 0/0/0 を中心とした軌道に変換する
  3. 0/0/0 に地球を描く
  4. 地球を太陽の周りの軌道に変換する

つまり、すべてを GPU 上で行うことができます...

PS: 私はあなたのコードを試していません。そのため、期待どおりに動作させるために、コードをさらに変更する必要がある可能性があります...

于 2012-11-11T14:11:52.577 に答える