如何仅旋转特定对象而不影响 opengl 中的其他对象?
How to rotate only a specific object without affecting the others in opengl?
我正在用 OpenGL 制作一个风扇,里面有杆子和旋转的东西,当我尝试旋转它们时,所有的风扇都随着杆子旋转,我应该如何修复它,我使用glutPostRedisplay()
,同样当我在旋转中使用push和pup矩阵时,它根本不旋转,它只以我写的角度旋转一次,有什么建议帮助吗??
在旧式 opengl 中,您将封装一对 glPushMatrix(矩阵堆栈的存储状态)和 glPopMatrix(恢复先前的变换)调用之间的变换更改。
glPushMatrix();
glRotatef(45.0f, 0, 1, 0); //< or whatever your rotation is.
drawObjectToBeRotated();
glPopMatrix();
// now any objects drawn here will not be affected by the rotation.
在现代 OpenGL 中,您需要为绘制的每个网格上传一个单独的 ModelViewProjection 矩阵作为顶点着色器制服 (有几种方法可以做到这一点,可以在 Uniform 变量中, Uniform-Buffer-Object、Shader-Storage-Buffer 或一些实例化缓冲区输入)。
I use push and pup matrix in rotation, it doesnt rotate at all, it rotate only once
如果你使用glPushMatrix
/ glPopMatrix
,那么当前矩阵由glPushMatrix
存储在矩阵堆栈中,并在调用glPopMatrix
时恢复。其间应用的所有矩阵变换都将丢失。
要实现连续旋转,您必须使用增加的旋转角度。创建一个全局变量 angle
并递增它。例如:
float angle = 0.0f;
void draw()
{
// ...
glPushMatrix();
// apply rotation and increase angle
glRotatef(angle, 1.0f, 0.0f, 0.0f);
angle += 1.0f;
// draw the object
// ...
glPopMatrix();
// ...
}
我正在用 OpenGL 制作一个风扇,里面有杆子和旋转的东西,当我尝试旋转它们时,所有的风扇都随着杆子旋转,我应该如何修复它,我使用glutPostRedisplay()
,同样当我在旋转中使用push和pup矩阵时,它根本不旋转,它只以我写的角度旋转一次,有什么建议帮助吗??
在旧式 opengl 中,您将封装一对 glPushMatrix(矩阵堆栈的存储状态)和 glPopMatrix(恢复先前的变换)调用之间的变换更改。
glPushMatrix();
glRotatef(45.0f, 0, 1, 0); //< or whatever your rotation is.
drawObjectToBeRotated();
glPopMatrix();
// now any objects drawn here will not be affected by the rotation.
在现代 OpenGL 中,您需要为绘制的每个网格上传一个单独的 ModelViewProjection 矩阵作为顶点着色器制服 (有几种方法可以做到这一点,可以在 Uniform 变量中, Uniform-Buffer-Object、Shader-Storage-Buffer 或一些实例化缓冲区输入)。
I use push and pup matrix in rotation, it doesnt rotate at all, it rotate only once
如果你使用glPushMatrix
/ glPopMatrix
,那么当前矩阵由glPushMatrix
存储在矩阵堆栈中,并在调用glPopMatrix
时恢复。其间应用的所有矩阵变换都将丢失。
要实现连续旋转,您必须使用增加的旋转角度。创建一个全局变量 angle
并递增它。例如:
float angle = 0.0f;
void draw()
{
// ...
glPushMatrix();
// apply rotation and increase angle
glRotatef(angle, 1.0f, 0.0f, 0.0f);
angle += 1.0f;
// draw the object
// ...
glPopMatrix();
// ...
}