Знатоки 3D-графики! Нужна матрица поворота...
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [18.97.9.174] |
|
|
правила раздела Алгоритмы

Знатоки 3D-графики! Нужна матрица поворота...
|
Сообщ.
#1
,
|
|
|
|
... вектора направления камеры (т.е. чтобы смотреть не в начало координат)
|
|
Сообщ.
#2
,
|
|
|
|
Есть такая параметризация, называемая углами Эйлера phi, theta, psi. Сначала делаешь поворот в плоскости XY на угол phi
{{Cos[phi], -Sin[phi], 0}, {Sin[phi], Cos[phi], 0}, {0, 0, 1}}, потом в этой повернутой системе координат делаешь поворот в повернутой плоскости YZ на угол theta {{1, 0, 0}, {0, Cos[theta], -Sin[theta]}, {0, Sin[theta], Cos[theta]}}, а потом опять (уже сильно повернутой) в плоскости XY делаешь поворот на угол psi {{Cos[psi], -Sin[psi], 0}, {Sin[psi], Cos[psi], 0}, {0, 0, 1}}; В результате, искомая матрица поворота на Эйлеровы углы имеет вид {{Cos[phi] Cos[psi] - Cos[theta] Sin[phi] Sin[psi], -Cos[psi] Sin[phi] - Cos[phi] Cos[theta] Sin[psi], Sin[psi] Sin[theta]}, {Cos[psi] Cos[theta] Sin[phi] + Cos[phi] Sin[psi], Cos[phi] Cos[psi] Cos[theta] - Sin[phi] Sin[psi], -Cos[psi] Sin[theta]}, {Sin[phi] Sin[theta], Cos[phi] Sin[theta], Cos[theta]}} |
|
Сообщ.
#3
,
|
|
|
|
И что задают эти углы?
|
|
Сообщ.
#4
,
|
|
|
|
короче:каждый поворот объема можно разложить на 3 поворота по осям координат на некоторые углы
легче сделать так:берешь первую матрицу из пред. сообщения-это матрица поворота относительно первой оси;то же делаешь со второй и третьей осью ВОТ И ВСЕ |
|
Сообщ.
#5
,
|
|
|
|
void Perspective(float &sx,float &sy,float &sz)
{ sx = sx * dist / (sz + dist); sy = sy * dist / (sz + dist); } void rotate(float &x,float &y,float &z,int phi,int thet,int ksi) { float x_old, sx, sy; float ax, ay, az; ay =y*cos(phi*PI)-z*sin(phi*PI) ; az =y*sin(phi*PI)+z*cos(phi*PI) ; ax =az*cos(thet*PI)-x*sin(thet*PI) ; az =az*sin(thet*PI)+x*cos(thet*PI) ; x_old = ax; ax =x_old*cos(ksi*PI)-ay*sin(ksi*PI) ; ay =x_old*sin(ksi*PI)+ay*cos(ksi*PI) ; sx = ax; sy = ay; if(Perspective1) Perspective(&sx, &sy, &az); ax = sx; ay = sy; x=ax; y=ay; z=az; } |