使用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_zR_yR_x 来计算旋转矩阵RR' = R_x * R_y * R_z

我建议您也阅读this 并更好地了解您在做什么以及一般轮换的潜在问题。

【讨论】:

感谢您的回答;但我测试了这段代码,输出中也没有任何内容:( 好的,我理解我的错误;在渲染相机之前,我弹出矩阵,所以我看不到输出中的旋转;非常感谢!

以上是关于使用OpenGL在C ++中同时围绕其(x,y&z)轴旋转对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opengl函数制作一个用于在c中绘制3D点的3D窗口?

在 PHP 中查找三个值中的最大值

通过滑块在世界空间中围绕轴 x、y、z 旋转图元

在数组的哈希上使用uniq

如何在 C++/OpenGL 中获取当前鼠标位置?

在prolog中将两个列表映射在一起