【问题标题】:OpenGL Make Object Stick to CameraOpenGL使物体粘在相机上
【发布时间】:2019-10-07 07:43:00
【问题描述】:

为了更好地了解 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()获取相机当前前方向量。

如前所述,我正在学习这里发生的一切,所以我可能会搞错这一切......在这种情况下,我应该如何将对象“锁定”一定距离远离相机?

【问题讨论】:

  • 您需要物体与其他物体发生碰撞还是刚好在镜头前?如果你不需要它发生碰撞,你可以使用一个单独的着色器,它不像普通着色器那样依赖世界位置。
  • 该对象需要存在于世界观中(我认为我正确使用了该术语)。类似于半条命 2 中重力枪的功能,你可以将一个物体从世界拉到屏幕中心,它会跟随相机的方向,然后你可以向新的方向发射它。跨度>

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


【解决方案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));

【讨论】:

  • 很好解释。这很有道理!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多