OpenGL - это правильный способ рисовать вращающиеся кольца на сцене? - PullRequest
1 голос
/ 06 января 2012

Я создал вращающиеся пружины и поместил их на сцену, которая вращает обе части, работает плавно, но просто хотел узнать, является ли это правильным способом или есть более простой способ

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 Ответ

1 голос
/ 06 января 2012

Прежде всего: вы знаете, что используете устаревшие команды 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();
}

но учтите, что вы изменили значение rotation внутри этой функции. Кроме того, все эти жестко заданные значения (цвета, позиции, размеры, векторы) допускаются только в тестовых программах. Для больших проектов следует использовать формат описания сцены.

Но для больших сцен с кучей элементов очень рекомендуется структура сценографа. Кроме того, если он попадет на эту территорию, то вы должны отделить скорость анимации от времени рисования и ввести функцию tick(), которая обновляет анимации относительно общего времени, которое прошло. Если вы зайдете так далеко, вы можете перенести его на более современную версию OpenGL.

...