OpenGL 独立旋转

问题描述

我正在尝试在下面绘制这些形状:

What I want

试过这个代码

    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,1.0f);   
    glColor3f(1.0f,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);
    }

但这就是我得到的:

What I get

如果我只想使用 glLoadIdentity 和 glrotatef 进行旋转,您知道如何解决吗?

注意: 我不想使用推送/弹出或翻译

解决方法

您必须围绕其中心旋转对象并将旋转后的对象移动到它在世界中的位置。 glRotatef 围绕 (0,0) 旋转顶点。在 (0,0) 和 glTranslate 周围绘制对象以将对象移动到它在世界中的位置:

glTranslate(-10.0f,270.0f,0.0f);   
glRotatef(-135.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);
}

注意,glRotateglTranslate 等矩阵运算指定一个新矩阵并将当前矩阵乘以新矩阵。


如果不允许使用 glTranslate,则必须将平移向量 (-10,270) 向相反方向旋转。使用三角函数 sincos 旋转向量(参见 Rotation matrix)。由于sincos 的单位是弧度,因此您需要反转角度并将其转换为Radians

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,1.0f);   
   
glColor3f(1.0f,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);
}