Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Вниз

Геометрия: перенос точек   Найти похожие ветки 

 
Goorus ©   (2005-08-29 18:04) [0]

В пространстве задана плоскость (нормаль) и несколько точек на ней. Мне надо перенести эти точки в плоскость x0y, т.е. надо повернуть все точки относительно данной (0, 0) так, чтобы они сохранили свою позицию относительно друг-друга и координата z у всех была бы одинаковой. Я понимаю, что для этого достаточно к каждой точке применить матрицу поворота, но вот как её получить?

Матрицу можно получить из кватерниона, который в свою очередь получиться из оси вращения и угла, а где взять эту ось и угол?

Помогите, пожалуйста, в создании второго Хавока :)


 
NE_Parovoz ©   (2005-08-29 18:15) [1]

можно узнать для чего это надо?
возможно всё проще.


 
XProger ©   (2005-08-29 19:19) [2]


s := sin(angle);
c := cos(angle);
...
RotMatrix
c  s  0  0
-s  c  0  0
0  0  1  0
0  0  0  1


 
Goorus ©   (2005-08-30 04:26) [3]

>> можно узнать для чего это надо?
Хочу узнать точное время пересечения сферы и куба, в данном случае проверяю пересечение движущейся сферы и ребра, что равносильно проверке на пересечение движущейся точки с капсулой (капсула радиуса первоначальной сферы), теперь из вектора движения и отрезка, образующего капсулу (две вершины начального бокса), векторным произведением получаю нормаль к плоскости. Теперь достаточно проверить, чтобы в этой плоскости пересеклись движущаяся точка и капсула (теперь это уже надо сделать на плоскости, а не в пространстве!), вот мне и надо перенести из пространства на плоскость движущуюся точку, две точки капсулы и вектор скорости точки. На плоскости я уже всё реализовал, а вот как туда всё перенести пока не придумал.

>>XProger
Со всем уважением - Гениально!! А что ты этим хотел сказать? И какой угол ты имел в виду?

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


 
MBo ©   (2005-08-30 07:17) [4]

В первом посте не определено однозначно, как именно преобразовывать плоскость.

Если так:
>Осью вращеия в данном случае будет линия пересечения данной плоскости и плоскости x0y

то простая логика подсказывает:

>Я не знаю как получить эту прямую

Пусть плоскость задана уравнением
aX+bY+cZ+d=0
подставляем z=0 - и уравнение прямой, лежащей в плоскости x0y - готово.

> и этот угол.

Через скалярное или векторное произведение нормали к плоскости и орта z (0,0,1)

В общем же случае для получения матрицы аффинного преобразования  M нужно сопоставить точкам исходного образа (X) (трем неколлинеарным - для плоскости, четырем некопланарным в 3D) точки конечного (X") и решить систему ЛАУ (X)*(M)=(X")


 
Goorus ©   (2005-08-30 10:18) [5]

Ой! Я тут случайно подумал, и, кажется, решил :)
Ось вращения получу как векторное произведение нормали данной плоскости и нормали к x0y (т.е. (0, 0, 1)), а косинус угла будет равен z-составляющей нормали :)


 
Goorus ©   (2005-08-30 13:02) [6]

А нет.. кватернион не этой осью задаваться должен..


 
XProger ©   (2005-08-30 14:27) [7]

Тебе нужно расчитать матрицу переноса, и домножить на неё координаты вершин. Никаких углов определять не надо!


 
XProger ©   (2005-08-30 14:41) [8]

Up - нормаль к целевой плоскости
Dir - направление (вниз-вверх, как хочешь)
// Находим 3 базис-вектора
Left := V_Cross(Dir, Up);
Dir  := V_Cross(left, Up);
Dir  := V_Normalize(Dir);
Left := V_Normalize(Left);
// Расчёт матрицы
m[0][0] := Dir.X;  m[0][1] := Dir.Y;  m[0][2] := Dir.Z;  m[0][3] := 0;
m[1][0] := Up.X;   m[1][1] := Up.Y;   m[1][2] := Up.Z;   m[1][3] := 0;
m[2][0] := Left.X; m[2][1] := Left.Y; m[2][2] := Left.Z; m[2][3] := 0;
m[3][0] := 0;      m[3][1] := 0;      m[3][2] := 0;      m[3][3] := 1;

Далее умножаешь матрицу m на радиус-векторы вершин :)


 
Goorus ©   (2005-08-31 14:51) [9]

XProger, спасиб большое :)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.038 c
4-1133630611
Bolek
2005-12-03 20:23
2006.02.19
работа со службой


2-1138977069
буржуй
2006-02-03 17:31
2006.02.19
Как мне удалить себя внутри себя?


2-1138892204
Silver__Dragon
2006-02-02 17:56
2006.02.19
Перехват нажатия Minimize


6-1131291763
Volf_555
2005-11-06 18:42
2006.02.19
Как программно щёлкнуть на ссылку в Internet Explorer?


2-1138550619
13
2006-01-29 19:03
2006.02.19
ActionMainMenuBar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский