1

これが私のコードです:

#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);

}

長方形と三角形を描きます。

両方とも現在回転していますが、長方形を静止させて三角形のみを回転させたいです。ここで何が間違っていますか?プッシュ ポップ ラインなどを変更する必要がありますか。色々組み合わせてみたけど無理。

4

3 に答える 3

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
}
于 2012-04-21T13:04:44.210 に答える
1

あなたがすべきことは交換することです

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();

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();

マトリックスをプッシュ/ポップしても、長方形の変換は変更されません。長方形の変換が三角形に影響を与えるのを防ぐだけです。

于 2012-04-22T15:20:09.713 に答える
0

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

時間の経過とともに回転させるのではなく、小さな回転を行ってポップし (回転を削除します)、次のフレームを描画するときにまったく同じ小さな回転を行うため、三角形はそのようには見えません。毎回同じ回転状態で描画するだけです。

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

まずfloat rotationAngle、クラスのメンバー変数として a を定義します。

次に、描画呼び出しで、次のように実行します。

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
于 2012-04-22T17:29:20.073 に答える