Я создаю игру, в которой игрок может взобраться на любую поверхность.
Когда игрок сталкивается с поверхностью, я получаю нормаль этого столкновения. Это направление, в котором должен выровняться вектор игроков "вверх":
![enter image description here](https://i.stack.imgur.com/nyzEX.png)
Теперь 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](https://i.stack.imgur.com/zO7bm.png)
Но когда игрок сталкивается с поверхностью, где нормаль имеет только значение x, вектор вперед равен 0,0,0:
![enter image description here](https://i.stack.imgur.com/wpFeZ.png)
Я знаю, что для того, чтобы избежать этой ситуации, я должен учитывать x-компонент нормали, но я не уверен, куда его подключить.
Рассмотрим этот вопрос, основанный на Unity, который включает математические функции, предоставляемые движком, в отличие от чисто математических. Но любой ответ, конечно, оценивается.