Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
15-1138389157
tesseract
2006-01-27 22:12
2006.02.19
Проблемы у Reactos


2-1138499061
einstein
2006-01-29 04:44
2006.02.19
Функция Shellexecute()


2-1138628408
Scavenger
2006-01-30 16:40
2006.02.19
Возвратить системное время.


3-1134919989
Express
2005-12-18 18:33
2006.02.19
Обязательное поле....


15-1138400646
GanibalLector
2006-01-28 01:24
2006.02.19
Прочее вместо "Потрепаться"