c++ - OpenGL使物体粘在相机上
问题描述
为了更好地理解 OpenGL 的矩阵和顶点数学到底发生了什么,我想看看是否可以让一个对象“粘”在我的“相机”前。我已经玩了几天了,感觉我已经接近了。
到目前为止,我已经设法让对象跟随相机的运动,除了它的旋转(我似乎无法弄清楚这个前矢量)。要创建对象的新位置,我有以下代码:
glm::mat4 mtx_trans = glm::mat4(1.0f);
mtx_trans = glm::translate(mtx_trans, camera->getPosition() + camera->getFront());
glm::vec4 cubePosVec4 = glm::vec4(0.0f, 0.0f, -3.0f, 1.0);
cubePosVec4 = mtx_trans * cubePosVec4;
cubePositions[9] = glm::vec3(cubePosVec4.x, cubePosVec4.y, cubePosVec4.z);
wherecamera->getPosition()
获取相机当前位置向量,camera->getFront()
获取相机当前前向量。
如前所述,我正在学习这里发生的一切,所以我可能把这一切都搞错了......在这种情况下,我应该如何去“锁定”一个距离物体有一定距离的物体相机?
解决方案
如果对象应该始终相对于相机位于相同的位置,那么您必须跳过视图矩阵的转换。
请注意,视图矩阵从世界空间转换为视图空间。如果对象应该始终放在相机前面,那么对象不必放在世界中,它必须放在视图中。因此,对象的“视图”矩阵是单位矩阵。
因此,在您的情况下,对象的常见模型视图转换是对象沿 z 轴在负方向上的平移。平移必须是负数,因为 z 轴指向视图之外(在视图空间中):
glm::mat4 mtx_trans = glm::mat4(1.0f);
mtx_trans = glm::translate(mtx_trans, glm::vec3(0.0f, 0.0f, -3.0f));
推荐阅读
- c# - 如何将组合框用作子过程参数中的对象?
- lucene - org.infinispan.lucene.FileCacheKey NotSerializableException 尝试在 Hibernate Search Cache 中复制数据时出现异常
- powershell - 在 PowerShell 的哈希表中使用正则表达式?
- python - Django 中的视图:使用字典发送数组
- delphi - 如何在 Android sdcard Delphi 中索引创建的文件
- python - 如何分别删除每列中的所有重复项?
- reactjs - 如何让 NavLink 观察区分大小写
- javascript - 添加连接第二个可排序列表的条件
- c# - 实现这一点而不是在 Session 中存储值的更好方法?
- angular - 有没有可以下载 Angular Material 样式的地方?