Что не так с моей формулой ограничения скорости вектора 3? - PullRequest
1 голос
/ 17 мая 2019

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, если двигаться по диагонали, но это неэто не так.

1 Ответ

1 голос
/ 17 мая 2019

Вы уверены, что это также не происходит в обратном направлении?Я думаю, что это может быть связано с тем, как Годо обрабатывает арифметический порядок.Например, если 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 > 0) AND (MoveDirection.z < 0), вычтите 1 из результата.

...