Вопрос

Я рисую плоский диск, используя 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top