3D Math: Рассчитать угол крена (крена) из ортогональных векторов Look and Up

Я надеюсь, что это подходящее место для того, чтобы задать этот вопрос, который такой же, как этот, но выраженный в виде чистой математики, а не графически (по крайней мере, я надеюсь, что я перевел проблему в математику правильно).

Принимая во внимание:

  • два вектора, которые являются ортогональными: Up ​​(ux, uy, uz) и Look (lx, ly, lz)
  • плоскость P, которая перпендикулярна Look (следовательно, включая Up)
  • Y1, который является проекцией Y (вертикальная ось) вдоль Посмотрите на P

Вопрос: каково значение угла между Y1 и Up?

Как согласятся математики, это очень простой вопрос, но я почесал голову, по крайней мере, две недели, не имея возможности визуализировать, как проецировать Y на P... возможно, сейчас слишком стар, чтобы находить решения для школьных упражнений.

Я ищу тригонометрическое решение, а не решение с использованием матрицы. Благодарю.

Редактировать: я обнаружил, что мне нужно было определить знак угла относительно оси вращения, которая должна была смотреть. Я разместил окончательный код на связанном вопросе (см. Ссылку выше). Спасибо тем, кто помог. Я ценю ваше время.

5 ответов

Решение

Я просто делаю это на бумаге. Я надеюсь, что это правильно.

Предположим, что Up и Look нормализованы, то есть длина 1. Предположим, что плоскость P содержит начало координат, а L - его нормаль. Y является (0, 1, 0)

Чтобы спроецировать Y на P, найдите его расстояние до P...

d = Y dot L = ly

... и затем масштабируйте нормаль на -d, чтобы получить Y1 (то есть проекцию Y на P)

Y1 = (lx * ly, ly * ly, lz * ly)

Теперь нормализуйте Y1, то есть масштабируйте его до (1 / длина). Если его длина была 0, то вам не повезло.

Точечное произведение Y1 и Up = косинус угла. Так

angle = acos(Y1 dot Up)
  • два вектора, которые являются ортогональными: Up ​​(ux, uy, uz) и Look (lx, ly, lz)
  • плоскость P, которая перпендикулярна Look (следовательно, включая Up)
  • Y1, который является проекцией Y (вертикальная ось) вдоль Посмотрите на P

Я предполагаю, что Up и Look являются единичными векторами. Пусть Y=(0,1,0).
Давайте найдем Y1.

Y1 = Y - (Y * Смотри) * Смотри Y1 = Y - ly * Смотри Y1 = (-lylx, 1-ly ly, -ly * lz)

Обратите внимание, что Y1 будет (0,0,0), когда Look равен (0,1,0) или (0,-1,0).

Как сказал Детмар, найдите угол между Y1 и Up, нормализуя Y1 и найдя арккос Y1*Up (где * - скалярное произведение)

Если Y = (0,1,0), то

Y1 = (-lylx, 1- lyly, -ly * lz)

| Y1 | = sqrt (Y1x ^ 2 + Y1y ^ 2 + Y1z ^ 2)

| Вверх | = sqrt(Upx^2 + Upy^2 + Upz^2)

Угол банка = (Y1xUpx + Y1y Upy + Y1zUpz) / (| Y1 || Up |)

Вы должны знать о векторах в трехмерном пространстве. Я думаю, что фундаментальное понимание этих, особенно точечных и перекрестных продуктов, поможет вам разобраться. Ищите учебник элементарных векторов.

два вектора, которые являются ортогональными: Up ​​(ux, uy, uz) и Look (lx, ly, lz)

Ортогональные векторы имеют произведение нулевой точки.

плоскость P, которая перпендикулярна Look (следовательно, включая Up)

Если вы возьмете перекрестное произведение Look in Up, вы получите третий вектор, который вместе с Up определяет плоскость, перпендикулярную Look.

Y1, который является проекцией Y (вертикальная ось) вдоль Посмотрите на P

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

Это относительно простая проблема с использованием векторной математики. Используйте уравнение для векторной проекции, чтобы получить Y1, затем тригонометрическое уравнение для точечного произведения, чтобы получить угол между Y1 и Up.

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

Другие вопросы по тегам