Главная страница
    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.042 c
5-1125610209
TStas
2005-09-02 01:30
2006.02.19
Не получается перекрыть SetWidth


2-1138784272
dabreezy
2006-02-01 11:57
2006.02.19
Вопрос по TiniFile


3-1134983176
Виталий Панасенко
2005-12-19 12:06
2006.02.19
Не "догоню" поведение ADOCommand/ADOQuery


1-1137487731
$Инъектор
2006-01-17 11:48
2006.02.19
Компонент TDFUnRar кто-то использовал ?


15-1138736188
Kerk
2006-01-31 22:36
2006.02.19
Доминантность





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский