Форум: "Игры";
Текущий архив: 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.034 c