2012-04-21 124 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

你应该做的是更换

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

入栈/矩阵不会做任何改变矩形的变革,它不仅会防止矩形的变换影响三角形。

+0

谢谢,但是当我尝试它时,它们都停止了,这就是我不了解的。应该就像你告诉我的一样,但他们都停下来了。 – showbiz 2012-04-22 16:10:57

2

如果您不想旋转矩形,请在绘制矩形之前移除旋转调用glRotatef(0.09,0.0,0.0,0.09);。在绘制三角形,矩形之前,您需要先push-pop矩阵。要停止旋转,你必须删除旋转调用,而不是push-pop矩阵。

编辑:要旋转三角形,你需要改变角度。如果你保持固定的角度0.09那么将不会有动画。一种简单的方法是将角度作为一个全局变量。事情是这样的:

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 2012-04-22 16:11:06

+0

你的三角形在旋转吗?您在每个渲染步骤都使用固定角度。为了制作动画,您需要跟踪当前角度并在渲染步骤中应用该旋转角度。您需要根据您所需的旋转速度更改该角度的值。 – taskinoor 2012-04-22 17:38:19

+0

@showbiz,检查编辑。 – taskinoor 2012-04-22 17:42:48

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