【发布时间】:2016-09-17 02:26:21
【问题描述】:
我将尝试对此进行非常详细的描述。我现在正在编辑游戏,场景是 3D 区域。
我有一个初始角度,写为一个方向向量,还有另一个具有不同坐标的向量。我们知道,两个向量之间的角度由公式给出:Theta = ACos(DotProduct(vec1, vec2) / (VectorLength(vec1) * VectorLength(vec2)))
让我们来描述一下这个场景:我目前正在编写某种固定武器,一个步哨枪,这个东西慢慢地移动他的“头”,向敌人发射子弹。那个角度旋转是我的问题。
让我们想象一下:我的哨兵枪在一个空的 3D 区域上,一个“敌人”在那里生成。我目前可以得到我的哨兵视角的方向向量,以及我的哨兵和玩家之间的方向向量。让我们猜测,使用描述的公式,他的分离角是 45 度。我的哨枪每 0.1 秒思考一次(调用一个函数),我想在每个思考函数处移动他的头部 5 度,直到它到达玩家(即两个向量几乎相等),这意味着它将在 0.9 秒内到达玩家(如果玩家保持其位置......)(距离 45 度 5 度)
如何缓慢移动哨兵的视角直到它到达目标?在 2D 中很容易,但我知道我正在与 3D 场景作斗争,而我目前对此感到迷茫。
任何帮助将不胜感激,关于编码,我将不胜感激伪代码。谢谢! (对不起我的英语)
【问题讨论】:
-
如果您可以在 2D 中解决这个问题,您可以通过忽略在 2D 公式中使用的第三个坐标在 3D 中解决它,除非它在 3 个方向上旋转。
-
要使其缓慢旋转,您可以使用一些缓动公式,例如:
position = currentPosition + (finalPosition - currentPosition) / easingFactor,其中easingFactor是定义减速的整数。 -
您需要计算垂直于包含 vec1 和 vec2 的平面的向量——这定义了您将围绕其旋转哨兵的轴——枪的视线向量。围绕任意 3D 矢量执行旋转(例如,5°)的公式有些复杂,并且在整个网络上都有解释。例如:here。但是,如果您不需要角度在 vec1 和 vec2 之间线性变化,那么像 @rcdmk 这样的捏造解决方案就足够了,线性变化坐标而不是角度。
-
这将取决于两个向量之间的角度,@rcdmk。您的公式将其差异划分为小部分,但这些部分各不相同。考虑到“敌人”可以移动,这就是它不同的原因:它依赖于不断移动“哨兵”的头部,直到它到达目标。
-
谢谢@this-vidor,去看看
标签: math vector 3d game-physics angle