2012-03-20 18 views
1

私は(翻訳、回転、翻訳)しましたが、原点を中心に回転します。私がしたのは、rキーを押すとトリックが始まります(翻訳、回転、翻訳)。その結果、それはまだあなたが行われ、最後の変換が頂点に適用される最初のものですので、あなたのglTranslate呼び出しの順序を切り替える必要があり OpenGL、点を中心とした回転は原点の周りではまだ機能しません

原点を中心
#include <gl/glut.h> 

void OnKeyPress(unsigned char key, int x, int y) 
{ 
    if (key == 27) 
     exit(0); 
    switch(key) 
    { 
    case 'r': 
    case 'R': 
     // trick start here ********************* 
     glTranslatef(-60,-20,0); 
     glRotatef(10, 0, 0, 1); 
     glTranslatef(60, 20, 0); 
     glutPostRedisplay(); 
     break; 
    }; 
} 

void OnDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0f,0.5f,1.0f); 

    glBegin(GL_TRIANGLES); 
    glVertex2f(20, 20); 
    glVertex2f(60, 20); 
    glVertex2f(20, 100); 
    glEnd(); 
    glFlush(); 
} 

int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv);  
    glutInitDisplayMode(GLUT_RGBA); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(800, 600); 
    glutCreateWindow("OpenGL Lab1"); 
    glutDisplayFunc(OnDisplay); 
    glutKeyboardFunc(OnKeyPress); 

    glClearColor(1.0, 1.0, 1.0, 0.0);  
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(-100, 100, -100, 100); 

    glutMainLoop(); 

    return 0; 
} 
+0

結果は何を使って初期化機能を仕上げてみ?また、副作用として 'gluLookAt'を見てください。 – jli

+0

結果はまだ原点を中心に回転しています – YoungSalafi

+2

@YoungSalafi質問を破棄しないでください。私はそれをロールバックした。あなたは答えを正しいものとしてマークしました。それは十分に示すべきである。 – Bart

答えて

4

を回転していることです。すべての変換は行列であり、現在の行列に乗算されます。最終的な位置を決定するために、得られた行列が頂点に乗算されます。

あなたが持っているのであれば:

glTranslatef(-60,-20,0); (T1) 
glRotatef(10, 0, 0, 1); (R) 
glTranslatef(60, 20, 0); (T2) 

とも前のフレームから格納されている古い行列のMoを持っているし、あなたが持っているでしょう:

M = (((Mo * T1) * R) * T2) 

最後に、このMはそれぞれ乗算され頂点Voを使用して最終位置を決定します。

V = M * Vo 

行列乗算は非可換ですが、これ括弧の順序は重要ではありません、連想され、そしてすべてのこれらの変換は、数学的に等価である:

V = Mo * T1 * R * (T2 * Vo) 

(T2 * Voは)T2(最後の翻訳)によって形質転換された頂点がある。なお。我々はV1、それを呼び出すと、私たちは持っている:

は今、別の頂点で、その結果、V1、T2によって形質転換された元の頂点は、(Rの*のV1)で回転Rにより形質転換された順番になっていることを参照してください

V = Mo * T1 * (R * V1) 
を翻訳され、次に回転される。式を右から左に解決し続けると、頂点に適用されたすべての変換が逆の順序でOpenGLコードで「呼び出された」位置に適用されます。

なぜあなたはあなたが望むポイントを中心に回転させるためにtranslate-rotate-untranslateをしなければならないと思いますが、「物」が原点を中心に回転していると言ったときに間違っています。コード。実際、注意を払うと、ポイント(-60、-20)を中心に回転していたことがわかります。

最後に、モデルビューマトリックスを使用していませんが、ほとんどのアプリケーションのように、フレームごとにリセットしていないため、パースペクティブマトリックスを使用してすべての変換を行います。これを行うべきではなく、GL_MODELVIEWを使用してこれらの種類の変換を行うべきです。それは周りの(+, rot, -)代わり(-, rot, +)

... 
    Set_Transformations(); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glutMainLoop(); 
} 
+0

あなたが参照しているものは既にSet_Transformations()関数内にあります – YoungSalafi

+0

最初に投稿したバージョンでは、Set_Transforms()はGL_MODELVIEWではなくGL_PROJECTIONを処理しました。 – lvella

+0

ああ..クールなthx私の悪い – YoungSalafi

1

フリップ:

#include <gl/glut.h> 

int angle = 0; 
void OnKeyPress(unsigned char key, int x, int y) 
{ 
    if (key == 27) 
     exit(0); 
    switch(key) 
    { 
    case 'r': 
    case 'R': 
     angle += 10; 
     glutPostRedisplay(); 
     break; 
    }; 
} 

void OnDisplay() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0f,0.5f,1.0f); 

    glClearColor(1.0, 1.0, 1.0, 0.0);  
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(-100, 100, -100, 100); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // trick start here ********************* 
    glTranslatef(60, 20, 0); 
    glRotatef(angle, 0, 0, 1); 
    glTranslatef(-60,-20,0); 

    glBegin(GL_TRIANGLES); 
    glColor3ub(0,0,255); 
    glVertex2f(20, 20); 
    glColor3ub(255,0,0); 
    glVertex2f(60, 20); 
    glColor3ub(0,0,255); 
    glVertex2f(20, 100); 
    glEnd(); 

    glFlush(); 
} 

int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv);  
    glutInitDisplayMode(GLUT_RGBA); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(800, 600); 
    glutCreateWindow("OpenGL Lab1"); 
    glutDisplayFunc(OnDisplay); 
    glutKeyboardFunc(OnKeyPress); 

    glutMainLoop(); 

    return 0; 
} 
関連する問題