使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象
Posted
技术标签:
【中文标题】使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象【英文标题】:Roatating an Object around its (x,y&z) axis contemporaneously in C++ using OpenGL 【发布时间】:2013-10-23 08:58:57 【问题描述】:我想编写一个函数,用于同时围绕其轴旋转对象,同时将每个角度围绕其 x、y 和 z 轴传递;我读了here,但我没有完全理解。例如,为了围绕我的形状的轴旋转,我必须将哪些参数传递给 glTranslatef() 以及乘以 [0 1 0] 的矩阵(用于计算新的 y 轴)是如何创建的?
我不明白为什么当我多次调用 glRotatef() 时,我只看到输出中的第一个调用;我在代码前后测试了 gltranslatef 和 glPushMatrix 和 glPopMatrix;但他们都没有帮助我; 理解这个话题的解决方案对我来说非常重要。
这是我的代码,但它不起作用!
glPushMatrix();
glRotatef(90,1,0,0); // rotate around X Axis
glPopMatrix();
glPushMatrix();
glRotatef(90,0,1,0); // rotate around Y Axis
glPopMatrix();
glPushMatrix();
glRotatef(90,0,0,1); // rotate around Z Axis
glPopMatrix();
如果你这样做了,告诉我你的方式。
【问题讨论】:
您能否更好地描述您的问题,我似乎不明白您的问题是什么。 没有什么比得上“轴”了。按照惯例,几何应该在对象空间中定义。这个空间有一组三个基向量。如果您自己不指定固定轴或指定临时旋转轴,则底座是您唯一拥有的东西。你能发布一些代码吗?您的问题非常复杂和令人困惑。 是的!我想在openGL屏幕中绘制一个相机形状,用户可以确定相机的位置和它围绕x、y、z轴的角度;我想将这 6 个参数传递给这个函数,但是使用 glRotatef() 函数我不能同时改变围绕轴的 3 个角度;每次我只看到其中一个的效果; 【参考方案1】:您上面的代码实际上并没有做任何可见的事情,因为您在更改当前活动矩阵后没有渲染任何内容。以下代码段效果如下(假设当前栈为MODELVIEW
):
glPushMatrix(); // push the stack down one matrix and copy the current matrix
glRotatef(90,1,0,0); // multiply the current matrix M by a rotation matrix R -> M' = M * R
// usually you would render stuff here using the current model-view matrix
glPopMatrix(); // pop the top matrix off the stack
如您所见,通过将一个新矩阵推入堆栈,您可以保留推入之前位于顶部的矩阵。然后以某种方式操作当前顶部矩阵,渲染内容,然后弹出顶部矩阵以恢复之前的状态。
我想你现在可以明白为什么上面的代码根本没有做任何事情——除了造成不必要的开销。
如果您坚持使用旧版 GL,则使用矩阵堆栈通常是正确的,因为您不希望您的修改影响随后渲染的几何体。但是,您真正想要的是简单的矩阵连接。假设您要执行和外在旋转,即在z-y-x
中围绕world-space
的固定基础旋转,您需要执行以下操作:
glPushMatrix();
glRotatef(90,1,0,0);
glRotatef(90,0,1,0);
glRotatef(90,0,0,1);
// render camera
glPopMatrix();
以上在数学上等同于通过连接各个旋转R_z
、R_y
和R_x
来计算旋转矩阵R
:R' = R_x * R_y * R_z
。
我建议您也阅读this 并更好地了解您在做什么以及一般轮换的潜在问题。
【讨论】:
感谢您的回答;但我测试了这段代码,输出中也没有任何内容:( 好的,我理解我的错误;在渲染相机之前,我弹出矩阵,所以我看不到输出中的旋转;非常感谢!以上是关于使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象的主要内容,如果未能解决你的问题,请参考以下文章