OpenGL - 这是在舞台上绘制旋转环的正确方法吗?

时间:2012-01-06 03:13:20

标签: c++ opengl animation 3d glut

我创造了旋转扭曲并将它们放置在舞台上,它们都旋转它工作鳍但只是想知道这是否是一种正确的方式,或者是否有更简单的方法

glPushMatrix();
    glColor3ub(0,0,255);
    glTranslatef(110.0f,30.0f,-30.0f);
    glRotatef(torusRotation1,0.0f, 1.0f, 0.0f);
    glutSolidTorus(5.0, 30.0, 50, 50);

    torusRotation1+= -1.0f;

    if(torusRotation1 > 360.0f)
    {
        torusRotation1 = 0.0f;
    }
    glPopMatrix();

    glPushMatrix();
    glColor3ub(0,0,255);
    glTranslatef(80.0f,-80.0f,0.0f);
    glRotatef(torusRotation2,0.0f, 1.0f, 0.0f);
    glutSolidTorus(5.0, 30.0, 50, 50);

    torusRotation2+= 1.0f;

    if(torusRotation2 > 360.0f)
    {
        torusRotation2 = 0.0f;
    }
    glPopMatrix();

1 个答案:

答案 0 :(得分:1)

首先关闭:您知道您使用的是弃用的OpenGL命令,对吗?我知道,为了学习OpenGL 1/2的目的很好,但你仍然应该知道哪些功能被弃用(矩阵堆栈,我认为过剩使用立即模式)。

假设你纯粹出于教育目的而这样做:如果它保持那么简单那么它没关系,但如果它是一个更大的程序的一部分那么你应该概括。

为清楚起见,您可以将该代码放入函数中,例如:

drawRing(GLfloat px,GLfloat py,GLfloat pz,GLfloat &rotation)
{
    glPushMatrix();
    glColor3ub(0,0,255);
    glTranslatef(px,py,pz);
    glRotatef(rotation,0.0f, 1.0f, 0.0f);
    glutSolidTorus(5.0, 30.0, 50, 50);

    rotation+= -1.0f;

    if(rotation > 360.0f)
    {
        rotation = 0.0f;
    }
    glPopMatrix();
}

但请注意,您更改了该函数中的rotation值。所有这些硬编码值(颜色,位置,大小,向量)都只能在测试程序中容忍。对于较大的项目,应使用场景描述格式。

但是对于具有大量元素的大型场景,非常推荐场景图结构。此外,如果它到达那个区域,那么你应该将动画速度与绘制时间分离并引入一个tick()函数,该函数相对于已经过去的时间更新动画。如果你把它拿走那么远,你可以把它移植到更现代的OpenGL版本。