Форум: "Игры";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.027 c