gpt4 book ai didi

c++ - 将物体固定到相机的问题

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:09 26 4
gpt4 key购买 nike

我在将枪支模型连接到相机时遇到了一些问题,因此当我的游戏中的玩家四处走动/环顾四周时,枪支始终指向前方(就像在大多数 FPS 游戏中一样)。

我可以将枪很好地平移到场景中的某个位置,也可以让它跟随玩家的移动,但代价是它的比例和旋转会恢复到默认值。

我可以将枪放在场景中,尺寸合适,枪尖向前并略微向上。我可以更改平移线,使枪跟随运动,但旋转和比例会重置。

最佳答案

通常, View 矩阵是相机所拥有的模型矩阵的逆矩阵。要始终将物体放置在相机前面,该物体的模型矩阵必须是相机模型矩阵乘以相对平移。

但这可以进行很多优化:让我们首先假设相机只能平移,不能旋转。我们将相机在世界空间中的位置作为 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,这意味着我们可以完全放弃所有 View 矩阵并且只使用一个模型矩阵与相机的相对翻译:

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) 之外的所有项再次消失。

总而言之,这意味着所有相机参数都与始终将物体放置在相机前面无关。我们可以不考虑 View 矩阵,让模型矩阵只包含相对于相机的变换。另一种方式是将其视为放置在原点的特殊相机,仅用于渲染枪支。有点像我们先拍一张我们想要看到的世界的照片,然后拍一张绿色房间里的枪的照片,最后用 Photoshop 将所有东西放在一起。

关于c++ - 将物体固定到相机的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41746298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com