Математика кватернионов для вращения?
-
11-09-2019 - |
Вопрос
Я рисую плоский диск, используя gluDisk()
в моей сцене. gluDisk()
рисует диск, обращенный к положительной оси Z, но я хочу, чтобы он был обращен к некоторой произвольной нормали, которая у меня есть.
Очевидно, что мне нужно использовать glRotate()
чтобы правильно развернуть диск, но каким должно быть вращение?Я помню, что это можно вычислить с помощью кватернионов, но, кажется, я не могу вспомнить математику.
Решение
Решение должно быть довольно простым и не должно требовать квартернионов.
Ось вращения, чтобы перейти от Нормали1 к Нормали2, должна быть ортогональна обеим, поэтому просто возьмите их векторный кросс-продукт.
Количество оборотов легко выводится из их точечный продукт.Это значение равно |A |.|B |.cos (тета), но поскольку два вектора нормали должны быть нормализованы, это даст cos (тета), поэтому просто возьмите обратный косинус, чтобы получить величину вращения.
Результирующий вектор и угол являются необходимыми параметрами для glRotate()
- нет необходимости самостоятельно вычислять фактическую матрицу вращения.
p.s.не забывай об этом glRotate()
необходим угол в градусах, но обычные тригонометрические функции C работают в радианах.
Другие советы
Вращение вокруг произвольной оси:Заданный угол r в радианах и единичный вектор u = ai + bj + ck или [a, b, c], определяют:
q0 = cos(r/2)
q1 = sin(r/2) a
q2 = sin(r/2) b
q3 = sin(r/2) c
и постройте из этих значений матрицу вращения:
( q0^2+q1^2 - q2^2 - q3^2 | 2*(q1*q2 - q0*q3) | 2*(q1*q3 + q0*q2) )
Q =( 2*(q2*q1 + q0*q3) | (q0^2 - q1^2 + q2^2 - q3^2) | 2*(q2*q3 - q0*q1) )
( 2*(q3*q1 - q0*q2) | 2*(q3*q2 + q0*q1) | q0^2 - q1^2 - q2^2 + q3^2 )
Чтобы найти поворот, который вам нужно выполнить, вы можете вычислить перекрестное произведение между текущим вектором и целевым вектором.Вы получите ортогональный вектор (который будет вашим вектором поворота для создания кватерниона), а длина этого вектора равна sin угла, который вы должны компенсировать, чтобы начальный и целевой векторы перекрывались.
Кватернионы описывают вращение вокруг оси. <w,x,y,z>
будет вращаться вокруг оси <x,y,z>
некоторая сумма, зависящая от баланса между величиной w
и величина вектора.
<cos θ/2, x*sin θ/2, y*sin θ/2, z*sin θ/2>, where |<x, y, z>| = 1
Например, повернув его так, чтобы он был обращен к положительной оси Y, вместо этого вам нужно повернуть его на 90 ° вокруг оси X.Вектор был бы <0, 1, 0>
, и кватернион был бы <cos 90°, 0, sin 90°, 0>
= <0, 0, 1, 0>
.
Чтобы повернуть фигуру из положения, обращенного к положительной оси Z, в положение, обращенное к вектору <x,y,z>
вам нужно найти вектор вращения и угол поворота.Чтобы найти ось вращения, вы можете взять перекрестное произведение текущего вектора и того, где вы хотите, чтобы он находился.
Если он обращен к положительной оси Z, текущий вектор будет равен <0, 0, 1>
.Если вы хотите, чтобы это столкнулось <x,y,z>
, ось вращения была бы <0, 0, 1> x <x, y, z> = <-y, x, 0>
, и угол был бы arctan(sqrt(x^2+y^2),z)
.Кватернион становится
<cos(θ/2), -y*sin(θ/2), x*sin(θ/2), 0>, where θ = arctan(sqrt(x^2+y^2), z)