c++ - OpenGL - 对象轴方向;glm::translate 和 glm::rotate 的顺序
问题描述
我发现将物体倾斜(23.4 度)会使局部或物体空间改变相同的角度。以下代码出现在渲染循环之前。
model[1] = glm::mat4(1.0f);
...
spheres[1].m_currentPosition = glm::vec3(65.0f, 0.0f, -60.0f);
...
model[1] = glm::translate(model[1], spheres[1].m_currentPosition);
model[1] = glm::rotate(model[1], glm::radians(-23.4f), glm::normalize(glm::vec3(0.0f, 0.0f, 1.0f)));
在渲染循环中,除了围绕我在渲染循环之前指定的内容进行常规旋转之外,我几乎没有代码,
rotationAxis[1] = glm::normalize(glm::vec3(0.0f, 1.0f, 0.0f));
这将导致围绕倾斜 23.4 度的轴旋转,以下图像是静态屏幕截图:
线在世界坐标 (0, 0, 0) 处相交的位置。
===
如果我颠倒前两行,即,
model[1] = glm::rotate(model[1], glm::radians(-23.4f), glm::normalize(glm::vec3(0.0f, 0.0f, 1.0f)));
model[1] = glm::translate(model[1], spheres[1].m_currentPosition);
===
在渲染循环中,我可以围绕指定的 旋转球体rotationAxis[1]
,尽管在这两种情况下,旋转都是围绕一个倾斜的 23.4 度轴穿过球体的蓝色顶部和底部。
球体 (x, y, z) 位置的任何其他变化都与这个现在倾斜的参考系有关,在这两种情况下也是如此。
我想要的是通过计算新的(x,y,z)坐标,然后通过与前一个(x,y,z)坐标的差异进行平移,使球体在水平线的平面中“绕行”。这种倾斜会导致我不得不调整倾斜的坐标。虽然这几乎是不可能的,但我正在寻找一个更直接的解决方案,并更好地了解正在发生的事情。
我已经阅读了 OpenGL 中平移和旋转的顺序,但更改顺序并不能解决我的问题。
解决方案
推荐阅读
- postgresql - 有没有一种在注释或其他中在休眠/JPA 中发出唯一约束的好方法?
- node.js - SyntaxError:位置 1 处 JSON 中的意外标记 o - 简单错误
- javascript - W3 滑块 - 未捕获的类型错误:无法读取未定义的属性“类名”
- c# - Automapper - 快速自定义地图
- php - Laravel 模型 save() 方法没有返回正确的 ID?
- javascript - 在 Promise 中移除事件监听器
- nearprotocol - NEAR 上的智能合约有事件还是我需要轮询链来获取数据?
- spring - Spring security JWT 过滤器抛出 500 和 HTML 而不是 401 和 json
- python-3.x - python3:字节与字节数组,并转换为字符串和从字符串转换
- php - Laravel邮件,不能将变量传递给主题,但它可以在正文中使用