OpenGL独立旋转
OpenGL independent rotation
我正在尝试在下方绘制这些形状:
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, 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);
}
但这是我得到的:
What I get
如果我只想使用 glLoadIdentity 和 glRotatef 进行旋转,您知道如何解决吗?
注意:
我不想使用 push/pop 或翻译
您必须围绕其中心旋转对象并将旋转的对象移动到其在世界中的位置。 glRotatef
rotates the vertices around (0, 0). Draw the object around (0, 0) and glTranslate
将对象移动到它在世界中的位置:
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
旋转矢量(参见 Rotation matrix). You need to invert the angle and convert it to Radians 因为 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);
}
我正在尝试在下方绘制这些形状:
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, 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);
}
但这是我得到的:
What I get
如果我只想使用 glLoadIdentity 和 glRotatef 进行旋转,您知道如何解决吗?
注意: 我不想使用 push/pop 或翻译
您必须围绕其中心旋转对象并将旋转的对象移动到其在世界中的位置。 glRotatef
rotates the vertices around (0, 0). Draw the object around (0, 0) and glTranslate
将对象移动到它在世界中的位置:
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
旋转矢量(参见 Rotation matrix). You need to invert the angle and convert it to Radians 因为 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);
}