Обращаюсь к гуру высшей математики!
Есть треугольник, лежащий в плоскости Z=0.
Есть единичный вектор (vx,vy,vz)
Нужно сделать матрицу 4x4 такую, чтобы при умножении каждой точки треугольника на эту матрицу, получался треугольник, повернутый вокруг точки (0,0,0) и перпендикулярный вектору.
Дайте плз формулу, а то у меня уже мозги совсем не варят
Здравствуйте, ZakkeR, Вы писали:
ZR>Обращаюсь к гуру высшей математики!
ZR>Есть треугольник, лежащий в плоскости Z=0.
ZR>Есть единичный вектор (vx,vy,vz)
ZR>Нужно сделать матрицу 4x4 такую, чтобы при умножении каждой точки треугольника на эту матрицу, получался треугольник, повернутый вокруг точки (0,0,0) и перпендикулярный вектору.
ZR>Дайте плз формулу, а то у меня уже мозги совсем не варят
Тебе случаем не матрицы афинных преобразований нужны?
... << RSDN@Home 1.1 beta 1 >>
Здравствуйте, ZakkeR, Вы писали:
ZR>Обращаюсь к гуру высшей математики!
ZR>Есть треугольник, лежащий в плоскости Z=0.
ZR>Есть единичный вектор (vx,vy,vz)
ZR>Нужно сделать матрицу 4x4 такую, чтобы при умножении каждой точки треугольника на эту матрицу, получался треугольник, повернутый вокруг точки (0,0,0) и перпендикулярный вектору.
ZR>Дайте плз формулу, а то у меня уже мозги совсем не варят
Слабо представляю, как ты собираешься умножить матрицу 4x4 на точку
Здравствуйте, ZakkeR, Вы писали:
ZR>Обращаюсь к гуру высшей математики!
ZR>Есть треугольник, лежащий в плоскости Z=0.
ZR>Есть единичный вектор (vx,vy,vz)
ZR>Нужно сделать матрицу 4x4 такую, чтобы при умножении каждой точки треугольника на эту матрицу, получался треугольник, повернутый вокруг точки (0,0,0) и перпендикулярный вектору.
ZR>Дайте плз формулу, а то у меня уже мозги совсем не варят
Единичный вектор z = <0,0,1> — нормаль к исходной плоскости P.
Единичный вектор v — нормаль к плоскости S.
Фактически, нам нужно аффинное преобразование, которое поворачивает плоскость P в S.
Или, для любой точки пространства, совершает поворот на угол между z и v.
(Затем в самой плоскости S можно еще совершить вращение — это уже "произвольная программа").
Матрица получится не 4*4, а 3*3 (из 3-мерного в 3-мерное); с учетом, что исходные точки лежат в плоскости P, можно отбросить 3-ю строку — получим матрицу 2*3.
Здравствуйте, 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
Все.
Здравствуйте, ZakkeR, Вы писали:
ZR>Обращаюсь к гуру высшей математики!
ZR>Есть треугольник, лежащий в плоскости Z=0.
ZR>Есть единичный вектор (vx,vy,vz)
ZR>Нужно сделать матрицу 4x4 такую, чтобы при умножении каждой точки треугольника на эту матрицу, получался треугольник, повернутый вокруг точки (0,0,0) и перпендикулярный вектору.
ZR>Дайте плз формулу, а то у меня уже мозги совсем не варят
Народ, спасибо, но теорию (в теории) я знаю

И что такое кватернионы, я тожа знаю. Но хочется без них. Хочется максимально быстро получить простую (надеюсь) формулу.
Я хотел получть что-то вроде: умножь это сюда, а вот это сюда, потом перемнож вот это и вот это и у тебя получится искомая матрица. Я ведь не зря обращался именно к гуру, для кого глянув на условие, не составляет труда прикинуть, как будет выглядеть формула. У меня на это уйдет пол дня. Сначала построю многоэтажную формулу, затем буду ее в поте лица упрощать... Чем я сейчас и займусь...
ps:
А что касается умноженя матрицы на точку, то я этого делать не собирался. А вот точку на матрицу буду и много раз:
Tochka = (x,y,z,1)
Matrica =
M11 M12 M13 M14
M21 M22 M23 M24
M31 M32 M33 M34
M41 M42 M43 M44
Tochka * Matrica = Tochka2
Правда, как справедливо заметил Кодт, тут хватит и меньшей размерности матрицы, но я в любом случае работаю с матрицами 4x4, т.к. мне еще и переносом заниматься надо.
Здравствуйте, ZakkeR, Вы писали:
ZR>Здравствуйте, ZakkeR, Вы писали:
ZR>>Обращаюсь к гуру высшей математики!
ZR>>Есть треугольник, лежащий в плоскости Z=0.
ZR>>Есть единичный вектор (vx,vy,vz)
ZR>>Нужно сделать матрицу 4x4 такую, чтобы при умножении каждой точки треугольника на эту матрицу, получался треугольник, повернутый вокруг точки (0,0,0) и перпендикулярный вектору.
ZR>>Дайте плз формулу, а то у меня уже мозги совсем не варят
Народ, всем отбой.
В моем случае искомой матрицей оказалась инвертированная видовая матрица. А таковая у меня уже имеется