Как сравнить 3D-направления как равноудаленные как по диагонали, так и по горизонтали/вертикалиC#

Место общения программистов C#
Ответить
Anonymous
 Как сравнить 3D-направления как равноудаленные как по диагонали, так и по горизонтали/вертикали

Сообщение Anonymous »

В настоящее время я использую Unity (и C#) в системе сравнения направлений, которую сейчас создаю. В качестве сокращенного примера, у меня есть несколько направлений:

Код: Выделить всё

{Up, {0,1,0}}, {UpRight, {1,1,0}}, {UpRightForward, {1,1,1}}, {Right, {1,0,0}}, {Down, {0,-1,0}}
От Вверх я хочу, чтобы между Up-UpRight и Up-UpRightForward был равный угол, однако при использовании простых углов это не так. Up-UpRIght составляет 45 градусов, а Up-UpRightForward — ~54,7 градуса. Аналогично, переход от UpRight-UpRightForward составляет ~ 35,3 градуса. Я понимаю, что это обычная математика, но для того, что я делаю, мне нужно, чтобы они были равны.
Изначально я перехожу к системе осевых шагов, в результате чего каждое «смежное» направление находится на расстоянии 1 шаг, используя это:

Код: Выделить всё

float GetAxisDistance(Vector3 direction, Vector3 targetDirection)
{
direction = AxisNormalise(direction);
targetDirection = AxisNormalise(targetDirection);
return Mathf.Abs(direction.x - targetDirection.x)
+ Mathf.Abs(direction.y - targetDirection.y)
+ Mathf.Abs(direction.z - targetDirection.z);
}
Vector3 AxisNormalise(Vector3 direction)
{
if (direction == Vector3.zero)
return Vector3.zero;
return direction / Mathf.Max(Mathf.Abs(direction.x), Mathf.Abs(direction.y), Mathf.Abs(direction.z));
}
В основном это работает, однако есть пара проблем, которые меня все еще не устраивают. Во-первых, Up-UpRightForward остается 2 шагами (должно быть 1), а Up-Down — 2 шагами (должно быть 4).
В настоящее время я ищу способы переработать эту систему, используя поиск пути в соседнем направлении (поэтому, чтобы перейти от Up-Down, ему придется искать путь через соседние направления, пока он не достигнет его, а затем вернуть самый быстрый путь, что приведет к 4 шагам), но я изо всех сил пытаюсь полностью разобраться в математике для это.
Будем очень признательны за любую помощь или предложения. Я не против изменения определения моих направлений, поскольку знаю, что {0,1,0} короче, чем {1,1,0}.

Подробнее здесь: https://stackoverflow.com/questions/799 ... ontal-vert
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»