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

C++ OpenGL-这是在舞台上绘制旋转环的正确方法吗?,c++,opengl,animation,3d,glut,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+=

我已经创造了旋转的绞丝,并把它们放在舞台上,这两种绞丝都可以旋转,但我只是想知道这是一种正确的方法,还是有一种更简单的方法

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

首先:您知道您正在使用不推荐使用的OpenGL命令,对吗?我知道为了学习OpenGL 1/2是可以的,但是你应该知道哪些特性是不推荐的(矩阵堆栈,我认为glut使用即时模式)

假设你这样做纯粹是为了教育目的:如果它保持那么简单,那没关系,但如果它是一个更大的程序的一部分,那么你可能应该推广

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

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();
}
但是请注意,您更改了该函数中的
旋转
值。此外,所有这些硬编码值(颜色、位置、大小、向量)仅在测试程序中允许。对于较大的项目,应使用场景描述格式


但对于包含大量元素的较大场景,建议使用场景图结构。此外,如果它到达该区域,则应将动画速度与绘制时间分离,并引入
tick()
函数,该函数将更新动画相对于经过的时间。如果您已经这么做了,那么您最好将其移植到更现代的OpenGL版本。

首先:您知道您正在使用不推荐使用的OpenGL命令,对吗?我知道为了学习OpenGL 1/2是可以的,但是你应该知道哪些特性是不推荐的(矩阵堆栈,我认为glut使用即时模式)

假设你这样做纯粹是为了教育目的:如果它保持那么简单,那没关系,但如果它是一个更大的程序的一部分,那么你可能应该推广

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

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();
}
但是请注意,您更改了该函数中的
旋转
值。此外,所有这些硬编码值(颜色、位置、大小、向量)仅在测试程序中允许。对于较大的项目,应使用场景描述格式


但对于包含大量元素的较大场景,建议使用场景图结构。此外,如果它到达该区域,则应将动画速度与绘制时间分离,并引入
tick()
函数,该函数将更新动画相对于经过的时间。如果您已经这么做了,那么您最好将其移植到更现代的OpenGL版本。

谢谢您的回答PeterTI看到许多人评论说命令不受欢迎,但是我还没有找到4.2版本。是这个吗?谢谢你的回答PeterTI看到很多人评论说命令不推荐使用,但是我还没有找到4.2版本。是这个吗?