如何在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中实现形状的原位旋转和旋转状态下的移动?的主要内容,如果未能解决你的问题,请参考以下文章