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

Вниз

OPENGL: Как повернуть ось системы координат на угол.   Найти похожие ветки 

 
DDS   (2003-11-10 07:05) [0]

OPENGL: Как повернуть ось системы координат на угол,
чтобы старые обьекты остались на месте, а новые рисовались
с новым положением осей. А может можно вторую системой координат создать. Если можно, то по подробней...

Не материтесь сильно, я еще только учусь.


 
NailMan ©   (2003-11-10 09:33) [1]

А нафига тебе это делать?

Не проще ли задать матрицу с повернутым положением объекта на нужные углы и по обычному отрисовать его?

Насколько я знаю мировая система координат не может изменяться.


 
DDS   (2003-11-10 16:33) [2]

А как повернуть матрицу?
Вот например:

glGetFloatv(GL_MODELVIEW_MATRIX,@mt);
Что то сделать с матрицей, массив 3x3
glLoadMatrixf(@mt);

И как ее повернуть. Какие то матем. функции применить
к ее элементам что-ли?


 
NailMan ©   (2003-11-11 10:30) [3]

Ну я вот так трансформирую матрицу. Правда пример для D3D приложения, посему некоторые функции тебе придется заменить на OGL аналоги.

procedure move_object(const yaw, pitch, roll: single;    // углы поворота
              var mat: TD3DXMatrix;                     // результат трансформации
              Const SIZE : TD3DXVector3
              );
begin
//Нормализация векторов(исключение SIZE)
 right.x := mat._11;
 right.y := mat._12;
 right.z := mat._13;
 up.x := mat._21;
 up.y := mat._22;
 up.z := mat._23;
 dir.x := mat._31;
 dir.y := mat._32;
 dir.z := mat._33;
D3DXMatrixRotationAxis(mat_yaw, up, yaw);
D3DXMatrixRotationAxis(mat_pitch, right, pitch);
D3DXMatrixRotationAxis(mat_roll, dir, roll);
D3DXVec3TransformCoord(dir, dir, mat_yaw);
D3DXVec3TransformCoord(right, right, mat_yaw);
       D3DXVec3TransformCoord(dir, dir, mat_pitch);
D3DXVec3TransformCoord(up, up, mat_pitch);
D3DXVec3TransformCoord(right, right, mat_roll);
D3DXVec3TransformCoord(up, up, mat_roll);
 dir := VectorNormalize(dir);
right := VectorNormalize(CrossProduct(up, dir));
up := VectorNormalize(CrossProduct(dir, right));
mat._11 := right.x;
mat._12 := right.y;
mat._13 := right.z;
mat._14 := 0.0;
mat._21 := up.x;
mat._22 := up.y;
mat._23 := up.z;
mat._24 := 0.0;
mat._31 := dir.x;
mat._32 := dir.y;
mat._33 := dir.z;
mat._34 := 0.0;
       D3DXMatrixScaling(mat_roll,size.x,size.y,size.z);
       D3DXMatrixMultiply(mat,mat_roll,mat);
end;


Поворот матрицы относительно локальной системы координат объекта. Углы в радианах. Если матрица единичная, то поворот будет считаться относительно глобальной системы координат(собсно они будут совпадать).

Это функция прямого задания матрицы:
function SetMatrix(const right, up, dir, pos: TD3DVector): TD3DMatrix;
begin
 result._11 := right.x;
 result._12 := right.y;
 result._13 := right.z;
 result._14 := 0;
 result._21 := up.x;
 result._22 := up.y;
 result._23 := up.z;
 result._24 := 0;
 result._31 := dir.x;
 result._32 := dir.y;
 result._33 := dir.z;
 result._34 := 0;
 result._41 := Pos.x;
 result._42 := Pos.y;
 result._43 := Pos.z;
 result._44 := 1;
end;


тут еще надо добавить умножение элементов по диагонали на вектор SIZE. У меня собсно эта функция не используется, но на всякий пожарный есть.


 
Стекляшкин   (2003-11-11 12:40) [4]

- Человек у вас просил средство от кашля, а вы что ему дали?
- Слабительное!
- Где он?
- Вон стоит, кашлянуть боится!

glLoadIdentity();
рисуешь
glRotate( angle, ox, oy, oz );
все что дальше рисуешь будет повернуто на angle


 
DDS   (2003-11-11 17:48) [5]

Спасибо, попробую...



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

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
3-1081222420
V-A-V
2004-04-06 07:33
2004.05.02
Пароль на базу Access


8-1075561020
GrayFace
2004-01-31 17:57
2004.05.02
Как убрать(и восстановить) звук в системе?


11-1064416393
Revolter
2003-09-24 19:13
2004.05.02
ComboBox... устал с ним бороться... помогите, plz


3-1081096181
Walker Hippi
2004-04-04 20:29
2004.05.02
InterBase в сети


1-1082130461
Zorlag
2004-04-16 19:47
2004.05.02
Плавное появление формы на экране