OpenGL使对象粘在相机上

时间:2019-05-20 23:30:48

标签: c++ opengl matrix camera glm-math

在我的冒险中,为了更好地了解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);

camera->getPosition()获取摄像机的当前位置矢量,而camera->getFront()获取摄像机的当前前矢量。

如前所述,我正在学习这里发生的一切,所以我可能会遇到所有这些错误...在这种情况下,我应该如何“锁定”一个物体一定距离远离相机?

1 个答案:

答案 0 :(得分:1)

如果对象相对于相机应始终位于同一位置,则必须跳过视图矩阵的变换。

请注意,视图矩阵从世界空间转换为视图空间。如果应始终将对象放置在相机的前面,则不必将对象放置在世界中,而必须将其放置在视图中。因此,对象的“视图”矩阵就是恒等矩阵。

因此,在您的情况下,对象的常见模型视图转换是对象沿z轴沿负方向平移。平移必须为负,因为z轴指向视图之外(在视图空间中):

glm::mat4 mtx_trans = glm::mat4(1.0f);
mtx_trans = glm::translate(mtx_trans, glm::vec3(0.0f, 0.0f, -3.0f));