2010-12-06 41 views
1

私は単純なOpenGLアプリケーションを用意しています。私はx1, y1, x2y2をグローバル変数に格納します。2DでのOpenGLの回転

回転機能ではfeedbackの機能を使用します(hereおよび翻訳開始方法、hereを参照)。それは、その周りの線を回転させることを意図しています。ここで

コードです:


void rotate(float theta) 
{ 

    GLfloat* buff = new GLfloat[5]; 
    glFeedbackBuffer(5, GL_2D, buff); 
    glRenderMode(GL_FEEDBACK); 

    int center_x = x1 + (x2 - x1)/2; 
    int center_y = y1 + (y2 - y1)/2; 

    glPushMatrix(); 
     glTranslatef(-center_x, -center_y, 0); 
     glRotatef(theta, 0, 0, 1); 
     glTranslatef(center_x, center_y, 0); 
     line(); 
    glPopMatrix(); 

    x1 = (int)buff[1]; 
    y1 = (int)buff[2]; 
    x2 = (int)buff[3]; 
    y2 = (int)buff[4]; 

    delete[] buff; 
    glutPostRedisplay(); 
} 

しかし、2本の翻訳はほとんど影響を及ぼさないように見える - ラインはまだウィンドウの左下隅の周りを回転します。さらに、線が目に見える面に収まらない場合、線が切り取られます(これは翻訳がコメントアウトされた場合に発生しません。線が目に見える面の外に出た場合、単に移動を拒否します)。

なぜこのコードは機能しませんか?どのように2Dの中心(または任意の点)の周りの線を回転させるのですか?

答えて

2

あなたは間違った方向に翻訳しているように見え、原点は左下のビューポートの外側に配置されています。原点を移動したい点に移動したいので、原点が左下にある場合は、+ center_x、+ center_yを変換する必要があります。回転し、逆に翻訳(-center_x、-center_y)してから描画します。

+0

確かに、今、それは動作します、ありがとう!ただし、回転すると、線はウィンドウの左下隅に向かってゆっくりと移動します。これは避けることができますか? –

+0

対処する2つの異なる中心があります:ビューポートの中心と線の中間点です。ビューポートの中央に線の中間点を配置したいとします。したがって、実際にしたいことは、ビューポートの中心に移動し、回転させて、変換された原点(つまり、中心点が0,0の線)を基準にして線を描画します。 –

+0

okですが、新しい座標(平行移動+回転の結果)が可視領域外になると問題が発生します。この場合、フィードバックバッファには可視点のみが含まれます。私が戻ってくると、そのラインは切り取られます。私はラインを元に戻したいのです。 –