Я пытался понять математику (тригонометрию и линейную алгебру), стоящую за функцией transform.LookAt(). Я следовал учебнику и пытался изменить его в соответствии со своими потребностями, но пока мне это не удалось.
Я пытаюсь создать камеру (в трехмерном пространстве), которая следует за игроком с пользовательским смещением, но в то же время пользователь может увеличивать и уменьшать масштаб камеры, сохраняя при этом это смещение Vector3. Я также блокирую другие оси и просто хочу применить вращение только к оси X. Проблема с моим скриптом в том, что угол кажется зажатым между 45° и 90° градусами. я думаю, что я что-то упускаю
private void LookAt(Transform t)
{
Vector3 forward = _camPos - (t.position + new Vector3(0, t.GetComponent<CapsuleCollider>().height / 2, 0));
Debug.DrawRay(forward, -forward, Color.blue);
Vector3 right = Vector3.Cross(target.up, forward);
Debug.DrawRay(forward, right, Color.magenta);
Vector3 newUp = Vector3.Cross(Vector3.forward, right);
Debug.DrawRay(forward, newUp, Color.yellow);
float angle = Mathf.Atan2(forward.magnitude, newUp.magnitude) * Mathf.Rad2Deg;
mainCam.transform.rotation = Quaternion.Euler(angle, 0, 0);
}
Как видите, векторные расчеты такие же, как на скриншоте.
вперед, вправо и newUp векторы
Тем не менее, камера правильно фокусируется на персонаже только тогда, когда я уменьшаю коэффициент масштабирования, то есть приближаю камеру к нему:
Глядя на цель (правильно) только с расстояния
Что мне не хватает? Помощь очень ценится!
Я знаю, что есть Quaternion.LookRotation() и Transform.LookAt(), но я хотел знать математику, стоящую за ними, для учебных целей. Каждый пост, который я проверял, говорил одно и то же, но совсем не объяснял математику.
С математической точки зрения в Интернете можно найти углы между двумя точками.
Я бы удостоверился, что все векторы нормализованы. Я также презираю углы Эйлера, поэтому я бы просто установил ваши векторы вперед / вправо / вверх как строки / столбцы (я не буду искать ведьму) матрицы 4x4, которую затем можно преобразовать в кватернион (который, вероятно, также необходимо нормализовать ). Таким образом, вы можете быть уверены, что вращение точно соответствует вашим векторам, а не возиться с углами Эйлера.
_ "но я хотел знать математику, стоящую за этим, для учебных целей. Каждый пост, который я проверял, говорил одно и то же, но совсем не объяснял математику" - быстрый поиск . Смотрите также en.wikipedia.org/wiki/3D_projection
Спасибо JonasH за полезный ответ. Я попробую то, что вы сказали позже, и вернусь к вам, если это было решением!





Чтобы дать реальный ответ. Похоже, вы поняли правильную идею, т. е. взяли перекрестное произведение между направлением взгляда и произвольным восходящим вектором, а затем еще одно перекрестное произведение, чтобы убедиться, что все векторы ортогональны. Я не уверен, что точно понимаю, что делает смещение, но я предполагаю, что оно работает по назначению. Есть несколько вещей, которые я бы сделал:
Я настоятельно предпочитаю обрабатывать повороты как векторы, кватернионы или матрицы. Я нахожу углы Эйлера запутанными и сложными в использовании, поскольку существует несколько вариантов, в которых повороты применяются в разном порядке, и их трудно визуализировать.
Матрица вращения (то есть 3x3) на практике представляет собой всего три ортогональных вектора, это также очень полезный способ визуализации матриц. Я думаю, что каждый вектор должен соответствовать строке в матрице, но я не знаком с единицей, и соглашения могут быть разными.
А матрица 4х4 — это просто матрица поворота + столбец для перевода и лишняя строка. Так что просто используйте SetRow (или SetColumn) для каждого из ваших векторов вперед/вправо/вверх, используя 0 для w-значения вектора 4. Затем вы можете преобразовать матрицу в кватернион, я могу не финансирует такую встроенную функцию в единстве, и это кажется немного странным, но ссылка должна показывать принцип, и должно быть много других статей, которые показывают математику, стоящую за ним.
Спасибо за этот информативный ответ, особенно за ссылки и использование 0 для значений w, потому что я все еще только начинаю изучать математику для 3d. Я принял ваш ответ, потому что, основываясь на предоставленной вами информации, я смогу обойтись!
Разве это не всплыло на днях? В Unity есть множество примеров камер погони. Почти уверен, что в Standard Assets есть такой.