3D Math: Рассчитать угол крена (Roll) из ортогональных векторов Look and Up - PullRequest
2 голосов
/ 17 июня 2010

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

Учитывая:

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 18 июня 2010

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

Давайте предположим, что 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)
1 голос
/ 18 июня 2010
  • два вектора, которые являются ортогональными: Up ​​(ux, uy, uz) и Look (lx, ly, lz)
  • плоскость P, которая перпендикулярна Look (следовательно, включая Up)
  • Y1, который является проекцией Y (вертикальная ось) вдоль Look на P

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

Y1 = Y - (Y * Look) * Look Y1 = Y - ly * Look Y1 = (-ly lx, 1 - ly ly, -ly * lz)

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

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

0 голосов
/ 18 июня 2010

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

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

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

| Up |= sqrt (Upx ^ 2 + Upy ^ 2 + Upz ^ 2)

Угол банка = (Y1x Upx + Y1y Upy + Y1z Upz) / (| Y1| | Вверх |)

0 голосов
/ 18 июня 2010

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

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

0 голосов
/ 17 июня 2010

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

два вектора, которые ортогональны: вверх (UX, UY, UZ) и Look (lx, ly, lz)

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

плоскость P, которая перпендикулярна Смотри (следовательно, включая Вверх)

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

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

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

...