Re: Посчитать матрицу
От: lazyden  
Дата: 05.09.03 16:14
Оценка:
Здравствуйте, ZakkeR, Вы писали:

ZR>Есть треугольник, лежащий в плоскости Z=0.

ZR>Есть единичный вектор (vx,vy,vz)
ZR>Нужно сделать матрицу 4x4 такую, чтобы при умножении каждой точки треугольника на эту матрицу, получался треугольник, повернутый вокруг точки (0,0,0) и перпендикулярный вектору.
Надо использовать поинтер :) с названием Quaternion.
Другими словами надо совместить z с v, поворачивая z вокруг n, где n --- нормаль к плоскости (z-o-v). Если при этом одновременно поворачивать и плоскость
(x-o-y) вместе с треугольником :), то после поворота он будет
ориентирован согласно условию задачи.

...z...v..............
...|../...............
...|./................
...|/ ................
...o-------------y
../.\.................
./...\................
n.....\...............
.......x..............

Т.е. нам надо построить матрицу поворота вокруг оси n на угол
alpha между векторами z и v. Для решения таких задач (и не
только:) существует штука — Quaternion. Подробно на
http://www.flipcode.com/documents/matrfaq.html

Документе читать в таком порядке (хотя лучше прочитать все:)
— Q47. What are quaternions?
Грубо говоря кватерион --- четверка чисел |x y z w|. Их интерпретация зависит от применения.
Для нашей задачи (очень условно) |x y z| — вектор n, w — угол поворота.
— Q56. How do I convert a rotation axis and angle to a quaternion
Как получить |x y z w| зная вектор вращения n и угол поворота alpha.
— Q52. How do I normalise a quaternion?
— Q54. How do I convert a quaternion to a rotation matrix?
Тут получаем требуемую матрыцю :)

Для Q56 есть две подзадачи
— получить вектор n
— sin(alpha/2) и cos(alpha/2)
Вектор n получаем как векторное произведения z и v.
cos(alpha/2)=sqrt( (1+cos(alpha)) / 2 )
sin(alpha/2)=sqrt( (1-cos(alpha)) / 2 )
Значение cos(alpha) получаем как скалярное произведение z и v

Все.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.