2012-04-21 24 views
1

は私のコードです:OpenGLの三角形の回転 - 簡単な修正を必要とする

#include <stdio.h> 
#include "glut.h" 

float width = 800.0; 
float height = 600.0; 

void changeSize(int w,int h){ 
    if(h==0) 
     h=1; 
    width = w; 
    height = h; 
    GLdouble ratio = 1.0f*w/h; 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glViewport(0,0,w,h); 

    gluPerspective(45,ratio,1,1000); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0,0,10, 
       0,0,-1, 
       0,1,0); 
} 

void renderScene(){ 
    glClearColor(0,0,255,1); 
    glClearDepth(1.0f); 
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 

    //glPushMatrix(); 


    glRotatef(0.09,0.0,0.0,0.09); 
    glColor3f(1.0,0.0,0.0); 
     glBegin(GL_QUADS); 
     glVertex3f(-1.0f,-1.0f,0.0f); 
     glVertex3f(1.0f,-1.0f,0.0f); 
     glVertex3f(1.0f,1.0f,0.0f); 
     glVertex3f(-1.0f,1.0f,0.0f); 
    glEnd(); 
    //glPopMatrix(); 


    glPushMatrix(); 
    glColor3f(0.0,1.0,0.0); 
    glTranslatef(-3.0,0.0,0.0); 

    glRotatef(0.09,0.0,0.0,-1.0); 
    glBegin(GL_TRIANGLE_STRIP); 
     glVertex2f(-1,-1); 
     glVertex2f(0,1); 
     glVertex2f(1,-1); 
     glEnd(); 

    glPopMatrix(); 



    glutSwapBuffers(); 

} 

int main(int argc, char **argv){ 

    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
    glutInitWindowPosition(100,200); 
    glutInitWindowSize(width,height); 
    glutCreateWindow("OpenGL"); 

    glutDisplayFunc(renderScene); 
    glutIdleFunc(renderScene); 

    glutReshapeFunc(changeSize); 

    glutMainLoop(); 

    return(0); 

} 

私は四角形と三角形を描きます。

両者は現在回転していますが、長方形を静止させて三角形のみを回転させたいとします。私はここで間違って何をしていますか?私はプッシュポップの線などを変更する必要がありますか? 多くの組み合わせを試しましたが、できません。

答えて

1

行列が長方形の変革への変更を行うことはありませんポップ/プッシュ

glColor3f(1.0,0.0,0.0); 
    glBegin(GL_QUADS); 
    glVertex3f(-1.0f,-1.0f,0.0f); 
    glVertex3f(1.0f,-1.0f,0.0f); 
    glVertex3f(1.0f,1.0f,0.0f); 
    glVertex3f(-1.0f,1.0f,0.0f); 
glEnd(); 

glRotatef(0.09,0.0,0.0,0.09); 
glColor3f(1.0,0.0,0.0); 
    glBegin(GL_QUADS); 
    glVertex3f(-1.0f,-1.0f,0.0f); 
    glVertex3f(1.0f,-1.0f,0.0f); 
    glVertex3f(1.0f,1.0f,0.0f); 
    glVertex3f(-1.0f,1.0f,0.0f); 
glEnd(); 

を交換され、それが唯一の意志矩形の変形が三角形に影響しないようにします。

+0

ありがとう、しかし私はそれを試して、彼らは両方停止、それは私が理解していないものです。それはちょうどあなたが私に言ったようにすべきですが、彼らは両方停止します。 – showbiz

2

矩形を回転させたくない場合は、矩形を描画する前に回転呼び出しglRotatef(0.09,0.0,0.0,0.09);を削除してください。三角形、四角形の描画の前後にプッシュポップする必要があります。回転を止めるには、プッシュポップマトリックスではなく、回転呼び出しを取り除く必要があります。

編集:三角形を回転するには、角度を変更する必要があります。固定角度を0.09のままにすると、アニメーションが表示されません。 1つの簡単な方法は、角度をグローバル変数として追跡することです。このような何か:あなたが何をすべきか

double ang = 0; // global variable 

void renderScene(){ 
    // other codes 

    glRotatef(ang++,0.0,0.0,-1.0); // use and change ang instead of using fixed 0.09 
    glBegin(GL_TRIANGLE_STRIP); 

    // remaining codes 
} 
+0

を感謝が、私はそれをしようとすると、彼らは両方とも停止し、それは私が理解していないんですよ。それはちょうどあなたが私に言ったようにすべきですが、彼らは両方停止します。 – showbiz

+0

あなたの三角形は前に回転していましたか?すべてのレンダリングステップで固定角度を使用しています。アニメーションするには、現在の角度を把握し、レンダリングステップでその回転角度を適用する必要があります。あなたは、あなたが望む回転速度に基づいてその角度の値を変更する必要があります。 – taskinoor

+0

@showbiz、編集を確認してください。 – taskinoor

0

あなたの問題は、正方形の周りの回転が実際にすべてのフレームを合成している唯一の問題です。三角形の周りに回転を押す/ポップするので、描画するたびにデフォルト状態にリセットされます。

時間の経過とともに回転させるのではなく、小さな回転とポッピング(回転を取り除く)だけで、次のフレームを描画するときにはまったく同じ小さな回転を行うので、それが動くように見える、それはちょうど同じ回転状態で毎回描画します。

クワッドの周りに回転をポップしないので、それは各フレーム上で合成されます。あなたがしたいことは、各フレームごとに変数をインクリメントし、変数の量だけ回転させることです。

まず、クラスのメンバー変数としてfloat rotationAngleを定義します。このような何かを実行ドローコールでその後

、:

rotationAngle += rotationSpeed; 
glPushMatrix(); 
    //do quad specific transformations 
    //draw quad 
glPopMatrix(); //remove quad specific transforms from stack 

glPushMatrix(); 
    glRotatef(rotationAngle, 0, 0, 1); 
    //do other triangle specific rotations 
    //draw triangle 
glPopMatrix(); //remove triangle's rotation and other transforms 
関連する問題