将对象固定到相机的问题

时间:2017-01-19 15:59:34

标签: c++ opengl camera

我有一些问题将枪型附加到相机上,因此当我的游戏中的玩家走路/环顾四周时,枪总是指向前方(如在大多数FPS游戏中)。

我可以将枪转换到场景中的位置,并且也可以跟随玩家的移动,但是以它的比例和旋转为代价来恢复默认值。

我可以将枪放在具有正确尺寸的场景中,并指向前方并稍微向上。我可以改变平移线,使枪跟随移动,但旋转和缩放被重置。

1 个答案:

答案 0 :(得分:2)

通常,视图矩阵是相机所具有的模型矩阵的逆矩阵。要将对象始终放在摄像机前面,此对象的模型矩阵必须是相机模型矩阵乘以相对平移。

但是这可以进行很多优化:让我们假设一开始,相机只能翻译,但不能旋转。我们将照相机在世界空间的位置捐赠为T_C。现在相机矩阵将是View = Translate(-T_C)

现在让我们假设我们总是希望在相机前面装有t_G个单位的枪。然后枪对象的世界空间位置为T_G = T_C + t_G,模型矩阵为Model = Translate(T_G)

现在让我们记下在尝试渲染枪对象时会发生什么:

MVP = Projection * View * Model
    = Projection * Translate(-T_C) * Translate(T_G)
    = Projection * Translate(-T_C) * Translate(T_C + t_G)

由于翻译可以在几个连续的翻译中吐出,我们可以写

    = Projection * Translate(-T_C) * Translate(T_C) * Translate(t_G)

,我们看到第二个和第三个矩阵从Translate(-T_C) * Translate(T_C) = Identity开始相互抵消,这意味着我们可以完全放弃所有视图矩阵,只需使用带有相机平移的模型矩阵:

MVP = Projection * Translate(t_G)
    = Projection * ModelRelative

当考虑到摄像机的旋转时,相同的基本原理也适用。然后,我们将翻译T_C和三个旋转R_Cx, R_Cy, R_Cz描述为相机。然后,相机矩阵再次是相机模型矩阵的逆矩阵。 (我现在将使用T()进行翻译,使用Rx()进行沿轴的旋转):

View = inverse(T(T_C) * Rz(R_Cz) * Ry(R_Cy) * Rx(R_Cx))
     = Rz(-R_Cz) * Ry(-R_Cy) * Rx(-R_Cx) * T(-T_C)

再次放置在相机前方恒定距离的物体必须具有与上述类似的模型矩阵:

Model = T(T_C) * Rz(R_Cz) * Ry(R_Cy) * Rx(R_Cx) * T(t_G)

现在将MVP的所有内容相乘时,除了T(t_G)之外的所有字词都会消失。

总之,这意味着所有相机参数与将物体始终放在相机前面无关。我们可以放弃视图矩阵,让模型矩阵只包含相对于相机的变换。另一种想到它的方法是放置在原点的专用相机,仅用于渲染枪。当我们第一次拍摄世界的照片时,我们想要看到它,然后是绿色房间里的枪和照片,最后一起拍照。