2017-04-25 11 views
0

私は動いている間にオブジェクトを回転しようとしていますが、移動させたいポイントに沿って回転させることはできません。openglを使ってcで動くオブジェクトを回転させることができません

struct point { 
    int x; 
    int y; 
}; 

// A line between two points. 

struct line { 
    struct point start; 
    struct point end; 
}; 

float j = 100.0; 
float rotationAngle = 0.0f; // The angle of rotation for our object 

void rotateObjectWithMovement(void functionToDrawObject(), struct point pivot, float rotationAngle) { 
    glPushMatrix(); 
    glTranslatef(pivot.x, pivot.y, 0.0f); 
    glRotatef(rotationAngle, 0.0f, 0.0f, 1.0f); 
    functionToDrawObject(); 
    glPopMatrix(); 
} 

void rotateObjectWithoutMovement(void functionToDrawObject(), struct point pivot, float rotationAngle) { 
    glPushMatrix(); 
    glTranslatef(pivot.x, pivot.y, 0.0f); 
    glRotatef(rotationAngle, 0.0f, 0.0f, 1.0f); 
    glTranslatef(-pivot.x, -pivot.y, 0.0f); 
    functionToDrawObject(); 
    glPopMatrix(); 
} 

void rocket() { 

    struct point allPoints[2] = { 
     { 100, 100}, 
     { 150, 150} 
    };  
    struct line line1 = {allPoints[0], allPoints[1]}; 
    glColor3f(1.0, 1.0, 0.0); 
    drawLines(&line1, 1); 
} 

void display() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    struct point pivot={j,100}; 
    rotateObjectWithoutMovement(rocket,pivot,rotationAngle); 
    //rotateObjectWithMovement(rocket,pivot,rotationAngle); 

    //reference line 
    glBegin(GL_LINES); 
    glVertex2f(0, 100); 
    glVertex2d(1000, 100); 
    glEnd(); 

    j += 1; 

    rotationAngle += 0.5f; // Increment our rotation value 
    if (rotationAngle > 360.0f) // If we have rotated beyond 360 degrees (a full rotation) 
     rotationAngle -= 360.0f; // Subtract 360 degrees off of our rotation 
    glutSwapBuffers(); // Swap our buffers 
} 

void myinit() { 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, 988.0, 0.0, 999.0); 
    glClearColor(0.5f, 0.5f, 1, 1); 
    glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char *argv[]) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE); 
    glutInitWindowSize(700, 500); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("OpenGL Hierarchical Modeling 2D Example"); 

    myinit(); 

    glutDisplayFunc(display); 
    glutIdleFunc(display); 

    glutMainLoop(); 
    return 0; 
} 

rotateWithMoment()関数は、オブジェクトを回転させる必要があり、ピボットとしてSTATIS共ordinatsでそれを回転するオブジェクト、静的座標及び角度をとります。

rotateWithoutMovement()関数は、オブジェクトを回転させなければならない座標と角度を変更し、変更する座標をピボットとして回転させます(例:線を回転させるとホイールが回転しているように見えます)。この関数は、ラインを回転させるようになっています。

私はそれを2日間働かせようとしていて、どこが間違っているのか分からない。

送信したオブジェクトを(x、y)点に移動し、指定された角度で回転させようとしています。これを行うには、オブジェクトを回転させて移動させるための関数を受け入れることで、これを行う関数を作成しようとしていました。

rotateWithoutMovementは、一定の座標を送信するとうまくいきます。

+0

"動作しない"を定義してください。 –

+0

'main(...)'関数はどこにありますか? – ryyker

+0

私はC++タグを理解していません。あなたのタイトルには「C」言語があります。彼らは異なる言語です。たとえば、C++には 'std :: vector'と' std :: string'があり、Cではそうではありません。 C言語では、エラーなく変数 "クラス"に名前を付けることができます。 –

答えて

2

あなたの機能は、あなたが開示していないことを前提にしているか、必要以上に少ないパラメータしか持っていないようです。特に、オブジェクトの座標に対して、を回転させたい軸は指定されていません。

オブジェクトの中心を通過する軸回りの回転のみがオブジェクトのネット移動なしであり、頂点重心に関する回転は重心を保存します。 (仮想)質量の中心についての質量は質量中心を維持する。 glRotatef()を介して印加されるOpenGLの回転はそれほど一般的に、あなたはこの操作の論理的なシリーズを実行する必要があり、原点を通ら軸の周りに常にある:

  1. 所望の回転軸上に存在するポイントP0(例えば頂点を選択してくださいセントロイド)。

  2. P0を原点に移動する変換を適用します。

  3. 希望の回転を適用します。

  4. 原点をP0に戻す翻訳を適用します。

追加の翻訳と組み合わせて、オブジェクトの移動を実行できます。いずれか

  • (1)、(1)/(2)、又は
  • 後、またはと組み合わせて、それを実行時にそれを占める前に変換を行う(4)。

私たちはあなたのfunctionToDrawObject()が所望の回転軸が既に原点を通過するように座標で描画可能なオブジェクトを定義すると仮定した場合 - その後、(1)及び(2) - あなたが実際に想定しているようだとして、必要な翻訳がゼロであるため、不要です。それ以外の場合は、ワールド座標系でオブジェクトの希望する場所とは別に、オブジェクトの座標系に必要なピボットポイントを指定する必要があります。その前提を作りましょう。私たちは関数を記述する前に

は、私たちが知っている必要があります一つの他の事:OpenGLは左の上の座標を乗算一つとして、現在の行列を定義していますMatrix = X' * X、あなたは新しい変換を適用(回転、平行移動、またはスケール)である場合、その行列は、の現在の行列と組み合わせて、Current * M = Newとなります。実際には、行列を適用するプログラム順序は、グラフィックス座標に適用する論理順序の逆であるか、またはプログラムの構造が行列式の構造を反映していることを意味しますそれはエンコードする。

ご希望の機能は、このようにこのフォームを持っているでしょう:

void rotateObjectWithoutMovement(void functionToDrawObject(), struct point pivot, 
     float rotationAngle) { 
    glPushMatrix(); 
    // No translation needed, because we're rotating around the object's 
    // natural origin (thus pivot is unused) ... 
    glRotatef(rotationAngle, 0.0f, 0.0f, 1.0f); 
    functionToDrawObject(); 
    glPopMatrix(); 
} 

void rotateObjectWithMovement(void functionToDrawObject(), struct point pivot, 
     float rotationAngle) { 
    glPushMatrix(); 

    // Translate to the desired position after rotating to orient the object 
    // as desired. No additional translation is needed because we did not 
    // apply any before the rotation. 
    glTranslatef(pivot.x, pivot.y, 0.0f); 
    glRotatef(rotationAngle, 0.0f, 0.0f, 1.0f); 
    // No _initial_ translation needed, because we're rotating around the object's 
    // natural origin ... 
    functionToDrawObject(); 
    glPopMatrix(); 
} 

注意をも回転前に適用されるいかなる翻訳が描かれたオブジェクトの最後の向きに影響を与えないこと - などの翻訳は、シーン内のオブジェクトのみの位置に影響を与えます(もちろん、の回転後にを適用した翻訳にも当てはまります)。

しかし私の前の仮定は実際にあなたがしたいものではないと思われます。その場合、実際に何が欲しいのでしょうか?

void rotateObjectWithMovement(void functionToDrawObject(), struct point pivot, 
     float rotationAngle, struct point translation) { 
    glPushMatrix(); 
    glTranslatef(pivot.x + translation.x, pivot.y + translation.y, 0.0f); 
    glRotatef(rotationAngle, 0.0f, 0.0f, 1.0f); 
    glTranslatef(-pivot.x, -pivot.y, 0.0f); 
    functionToDrawObject(); 
    glPopMatrix(); 
} 

void rotateObjectWithoutMovement(void functionToDrawObject(), struct point pivot, 
     float rotationAngle) { 
    static const struct point zero = { 0, 0 }; 
    rotateObjectWithMovement(functionToDrawObject, pivot, rotationAngle, zero); 
} 
+0

私はこのアプローチを試みました。それは動作しません。私は同じ出力を得ています。オブジェクトは画面全体を回転します。 –

+0

両方のバリエーションは、適切な入力があれば、@ NaseeruddinVNの私にとってうまく動作します。最初のバリエーションは、完全な例を提供する前に準備されていたことに注意してください。その後の質問の編集では、私が疑ったように、実際には2番目のパターンが代わりに必要なことが示されています。正しい引数を渡すようにしてください。 –

関連する問題