Поворот трехмерного вектора на 90 градусов относительно другого трехмерного вектора - PullRequest
0 голосов
/ 28 августа 2018

Я создаю игру, в которой игрок может взобраться на любую поверхность.

Когда игрок сталкивается с поверхностью, я получаю нормаль этого столкновения. Это направление, в котором должен выровняться вектор игроков "вверх":

enter image description here

Теперь Unity предоставляет удобный метод для преобразования двух векторов в поворот:

Quaternion.LookRotation(forward, up);

Требуется вектор вверх и вектор вперед. Как я уже говорил, у меня уже есть восходящий вектор Моя проблема в том, как мне получить вектор вперед.

Мое текущее решение состоит в том, чтобы вычислить прямой вектор, переворачивая некоторую ось в нормали:

normal = collision.contacts[0].normal;
Vector3 forward = Vector3.zero;
forward = new Vector3(0, -normal.z, normal.y);    
transform.rotation = Quaternion.LookRotation(forward, normal);

В большинстве ситуаций это выглядит нормально:

enter image description here

Но когда игрок сталкивается с поверхностью, где нормаль имеет только значение x, вектор вперед равен 0,0,0:

enter image description here

Я знаю, что для того, чтобы избежать этой ситуации, я должен учитывать x-компонент нормали, но я не уверен, куда его подключить.

Рассмотрим этот вопрос, основанный на Unity, который включает математические функции, предоставляемые движком, в отличие от чисто математических. Но любой ответ, конечно, оценивается.

1 Ответ

0 голосов
/ 28 августа 2018

Проверка величин компонент вектора.

Затем создайте компонент с наименьшим абсолютным значением, равным нулю, и поменяйте местами самый большой и второй компоненты, отрицая наибольшие. Этот подход дает действительный перпендикуляр для всех ненулевых векторов

Например, для дела

Abs(n.x) >= Abs(n.z) >= Abs(n.y)
make
Perp = (n.z, 0, -n.x)
...