使用 glm 根据光标位置旋转模型视图矩阵

Posted

技术标签:

【中文标题】使用 glm 根据光标位置旋转模型视图矩阵【英文标题】:Using glm to rotate the modelview matrix based on the cursor position 【发布时间】:2015-08-25 13:59:37 【问题描述】:

我正在渲染一个对象的 3D 模型,我希望用户能够通过拖动鼠标来围绕该对象进行旋转。为此,我想使用光标位置来不断更新模型视图矩阵。

首先,我的模型视图矩阵是:

1 0 0 0
0 1 0 0
0 0 1 -100
0 0 0 1

所以相机正在观察物体的原点,距离它 100 个单位。假设鼠标现在移动到屏幕的右侧。这意味着我希望相机围绕对象旋转 - 例如 90 度。

为了计算新的模型视图矩阵,我采用单位矩阵,将其旋转 90 度,然后使用 glm::translate() 沿相机的 z 轴远离对象。

但是,我遇到的问题是glm::translate() 似乎相对于世界坐标系移动矩阵,而不是相机坐标系。因此,“沿相机的z轴远离物体”不成立,因为旋转后世界的z轴和相机坐标系不再对齐。

请有人解释我应该如何实现这一目标?

谢谢你:)

【问题讨论】:

【参考方案1】:

一般来说,矩阵乘法是不可交换的。这意味着A*B != B*A

这意味着,当translate*rotate 沿全局轴移动时,rotate*translate 将沿局部轴移动。

请注意,在 OpenGL 和 glm 中,您必须以相反的顺序思考,因为向量是在矩阵之后编写的。 A*B*v (A,B 矩阵, v 向量) 转换为首先应用矩阵 B,然后应用矩阵 A。

【讨论】:

以上是关于使用 glm 根据光标位置旋转模型视图矩阵的主要内容,如果未能解决你的问题,请参考以下文章

从旋转和位置获取前向向量

GLM 中的模型矩阵

使用 GLM 功能放大 OpenGL 中的当前鼠标位置

GLSL 中的正常旋转

如何在缩放投影矩阵Opengl的同时平移光标位置

相机 旋转