如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?

Posted

技术标签:

【中文标题】如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?【英文标题】:How do you implement the rotation of the shape in place and the movement in a rotated state in OpenGL? 【发布时间】:2018-11-23 07:51:04 【问题描述】:

如何实现形状的原地旋转和旋转状态下的移动? 我想将旋转后的形状移向我看到的屏幕的 x 和 y 轴。

我已经让形状在我按键的时候沿x轴和y轴的方向移动了。 但我不能按照我想要的方式移动。有点奇怪。 如何设置代码以按照我想要的方式移动? 我先把代码放上来。

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(100, 0.0, 0.0, 1.0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glTranslatef(-2.5+puzX1, -2+puzY1, 0); 

我编写了代码以使其原地旋转。

代码顶部和底部的代码是移动到形状中心然后将其返回其位置的代码。

我应该添加什么? 应该修改哪一部分?

我英语不好。 我很抱歉 你能帮帮我吗?

【问题讨论】:

【参考方案1】:

请注意,由glBegin/glEnd 序列绘制的固定函数管道矩阵堆栈几十年来已被弃用。 阅读Fixed Function Pipeline 并查看Vertex Specification 和Shader,了解最先进的渲染方式。


如何在原地实现形状的旋转?

如果阴影应该在其局部轴上旋转,那么您必须在平移之前进行旋转。在代码中,这意味着旋转指令必须在平移指令之后:

glTranslatef(2.5 + puzX1, 2 + puzY1, 0);
glRotatef(puzang1, 0.0, 0.0, 1.0);
glRotatef(100, 0.0, 0.0, 1.0);

另见OpenGL translation before and after a rotation

说明:

翻译:见glTranslate的文档:

glTranslate 通过x y z 生成翻译。当前矩阵(见glMatrixMode)乘以这个平移矩阵,乘积替换当前矩阵。

轮换:见glRotate的文档:

glRotate 产生围绕向量 x y z 的角度旋转。当前矩阵(参见glMatrixMode)乘以旋转矩阵,乘积替换当前矩阵。

平移矩阵如下所示:

Matrix4x4 translate;

translate[0] : ( 1,  0,  0,  0 )
translate[1] : ( 0,  1,  0,  0 )
translate[2] : ( 0,  0,  1,  0 )
translate[3] : ( tx, ty, tz, 1 )

围绕 Z 轴的旋转矩阵如下所示:

Matrix4x4  rotate;
float      angle;

rotate[0] : ( cos(angle),  sin(angle), 0, 0 )
rotate[1] : ( -sin(angle), cos(angle), 0, 0 )
rotate[2] : ( 0,           0,          1, 0 )
rotate[3] : ( 0,           0,          0, 1 )   

translate * rotate 的结果是这样的:

glTranslate( ..... );
glRotate( ..... );

model[0] : ( cos(angle),  sin(angle), 0,  0 )
model[1] : ( -sin(angle), cos(angle), 0,  0 )
model[2] : ( 0,           1,          0,  0 )
model[3] : ( tx,          ty,         tz, 1 )

rotate * translate 的结果是:

glRotate( ..... );
glTranslate( ..... );

model[0] : ( cos(angle),                     sin(angle),                     0,  0 )
model[1] : ( -sin(angle),                    cos(angle),                     0,  0 )
model[2] : ( 0,                              0,                              1,  0 )
model[3] : ( cos(angle)*tx - sin(angle)*tx,  sin(angle)*ty + cos(angle)*ty,  tz, 1 )

【讨论】:

以上是关于如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在OpenGL中实现按住鼠标左键就可以旋转图形的功能

如何在opengl的3d空间中旋转单个形状?

在使用 C++ 在 OpenGL 中移动形状时按时间自动旋转形状

OpenGL入门07.实现摄像机的旋转和移动

OpenGL入门07.实现摄像机的旋转和移动

尝试在 3D 空间中旋转 2D 形状时出现问题