Независимое вращение OpenGL

Я пытаюсь нарисовать эти формы вот так:

Что я хочу

Пробовал этот код:

    glLoadIdentity();
    glColor3f(0.98f, 0.83f, 0.73f);
    glBegin(GL_POLYGON);
    for (float i = 0; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i)-10;
        y = 115 * sin(i)+270;
        glVertex2f(x, y);
    }
    glEnd();

    glRotatef(-135.0f, 0.0f, 0.0f, 1.0f);   
    glColor3f(1.0f, 0.83f, 0.0f);
    glBegin(GL_POLYGON);
    for (float i = p; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i) - 10;
        y = 115 * sin(i) + 270;
        glVertex2f(x, y);
    }

Но вот что я получаю:

Что я получаю

Если я хочу использовать только glLoadIdentity и glRotatef для вращения, вы знаете, как это исправить?

Примечание: я не хочу использовать push / pop или перевод


person Sam Borov    schedule 27.12.2020    source источник


Ответы (1)


Вам нужно повернуть объект вокруг его центра и переместить повернутый объект на его позицию в мире. glRotatef вращает вершины вокруг (0, 0). Нарисуйте объект вокруг (0, 0) и glTranslate < / a>, чтобы переместить объект на его позицию в мире:

glTranslate(-10.0f, 270.0f, 0.0f);   
glRotatef(-135.0f, 0.0f, 0.0f, 1.0f);   
    
glColor3f(1.0f, 0.83f, 0.0f);
glBegin(GL_POLYGON);
for (float i = p; i <= (2 * p); i += 0.001) {
    x = 100 * cos(i);
    y = 115 * sin(i);
    glVertex2f(x, y);
}

Обратите внимание: операции с матрицами, такие как glRotate и glTranslate, определяют новую матрицу и умножают текущую матрицу на новую матрицу.


Если вам не разрешено использовать glTranslate, вы должны повернуть вектор перемещения (-10, 270) в противоположном направлении. Используйте тригонометрические функции sin и cos, чтобы повернуть вектор (см. Матрица вращения). Вам нужно инвертировать угол и преобразовать его в радианы, поскольку единицы измерения sin и cos - это радианы. .

float tx = -10.0f;   
float ty = 270.0f;
float angle = -135.0f;

float inv_angle_rad = -angle * M_PI / 180.0f;
float tx_rot = tx * cos(inv_angle_rad) - ty * sin(inv_angle_rad); 
float ty_rot = tx * sin(inv_angle_rad) + ty * cos(inv_angle_rad);  

glRotatef(angle, 0.0f, 0.0f, 1.0f);   
   
glColor3f(1.0f, 0.83f, 0.0f);
glBegin(GL_POLYGON);
for (float i = p; i <= (2 * p); i += 0.001) {
    x = 100 * cos(i) + tx_rot;
    y = 115 * sin(i) + ty_rot;
    glVertex2f(x, y);
}
person Rabbid76    schedule 27.12.2020