【问题标题】:What is wrong with my vector 3 speed-cap formula?我的向量 3 速度上限公式有什么问题?
【发布时间】:2019-05-17 19:19:46
【问题描述】:

3D 运动。如果玩家向左向后移动,他们将以任何其他方向的两倍速度前进。 MoveDirection.x 和 z 分别等于模拟摇杆方向,范围从 1 到 -1。

MoveDirection = Vector3(MoveDirection.x - (MoveDirection.z / 2 * MoveDirection.x), MoveDirection.y, MoveDirection.z - (MoveDirection.x / 2 * MoveDirection.z))

我认为如果沿对角线移动,结果会是 0.5、0、0.5,但事实并非如此。

【问题讨论】:

  • 对不起,只是想知道,你提到MoveDirection.xMoveDirection.z是模拟值(-1到1),MoveDirection.y的值是多少?另外,你得到了什么结果?
  • 左下以外的任何方向都是正常的。如果它被放下,速度会增加一倍。向量代表您前进的方向,例如 (0.5, 0, 0.5)(它可以是负值),当它起作用时,当它不起作用时,它要么稍微偏离,要么大约是双倍速度。 Movedirection.y 是您的向上和向下运动,例如跳跃和重力,并在其他地方处理,这不是问题。

标签: gdscript


【解决方案1】:

您确定它不会也出现在右后方向吗?我认为这可能与 Godot 如何处理算术顺序有关。例如,如果 Godot 在除法之前进行乘法运算(就像我认为的那样),那么假设我们使用整个值(1 或 -1),那么 Godot 会以这种方式处理代码中的第一个 Vector3 坐标::

Using - (MoveDirection.x - (MoveDirection.z / 2 * MoveDirection.x)
Substitute values for - (x,z)

FOR VALUES  (1 , -1)
(1) - (-1 / (2 * 1))
(1) - (-1) / (2)
(1) - (-0.5)
= 1.5       <<<<<<-----------    THIS IS YOUR PROBLEM (I THINK)

FOR VALUES  (-1, 1)
(-1) - (1 / (2 * -1))
(-1) - (1) / (-2)
(-1) - (-0.5)
= -0.5

FOR VALUES   (1 , 1)
(1) - (1 / (2 * 1))
(1) - (1) / (2)
(1) - (0.5)
= 0.5

FOR VALUES  (-1, -1)
(-1) - (-1 / (2 * -1))
(-1) - (-1) / (-2)
(-1) - (0.5)
= -1.5       <<<<<<-----------    THIS SHOULD ALSO BE A PROBLEM (I THINK)

如果我的数学有误,请原谅我,我现在是凌晨 5:00。如果我错了,请告诉我,我会删除这个答案。

编辑:事实证明算术顺序甚至无关紧要,它首先用除法做同样的事情。我的建议是找到一种方法从受影响的结果中减去 1(或加 1)。可能类似于:if (MoveDirection.x &gt; 0) AND (MoveDirection.z &lt; 0),从结果中减去 1。

【讨论】:

  • 感谢您的跟踪表,我想我理解了这个问题。双重减去结果是积极的,所以我的解决方案是:MoveDirection.x - (MoveDirection.z / 2 * (MoveDirection.x / MoveDirection.x) 但这意味着如果棒是中性的,那么我得到一个 div 0 错误。不知道我能从这里做什么,因为 godot 规范化方法也不能按照我想要的方式工作。现在我刚刚完成了“如果速度超过 1,将两个方向除以 1.5”,它可以工作,但会导致速度不太一致。答案不必删除,很有帮助。
  • 好的。我会留下它。我还将继续寻找解决方案,因为将来我可能需要知道类似的事情(我假设您正在尝试否定扫射速度加倍效果-第一人称运动中的经典挑战)。我知道在许多情况下,您可以使用 min() 和 max() 方法将值限制在 -1 和 1 之间,但我还不确定如何在 Godot 中实现它。也许你能想出来。 MoveDirection.z = max(MoveDirection.x, 1.0) 之类的东西我也认为(虽然我不确定)你可以使用这些方法来确保值永远不会为 0。
  • 实际上,不要介意我上一条评论中的最后两行 - 我使用了 x 和 z 当它们都应该相同时 - 但这没关系,因为你不想夹住无论如何,MoveDirection 的值,相反,您需要钳制第一个和第三个 Vector3 坐标 - 不知道该怎么做
  • 根据我从阅读该主题中收集到的信息,通常对向量进行归一化以防止其值超过 1。但是,由于结果值为 1 或 -1,这将不适用于模拟输入。对于模拟,我认为您可以通过在矢量计算后添加类似这样的内容来实现您想要的:if MoveDirection.length() &gt; 1: MoveDirection = MoveDirection / MoveDirection.length()。您可能需要将结果值乘以 delta(不确定)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多