Форум: "Игры";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизПоворот сцены Найти похожие ветки
← →
lifo © (2004-07-26 01:20) [0]Как мне правельно повернуть мою сцену ( куб )
Я использую функцию D3DXMatrixRotationYawPitchRoll(&matWorld,y,x,z);
но оно поворачивает его еще под некоторым углом : например если поворачиваем по оси У то оно поворачивает под нек углом к оси ОХ
← →
lifo © (2004-07-26 10:09) [1]Блин ну что никто не знает ?????
← →
cyborg © (2004-07-26 10:15) [2]Оладьи, может не знают!
← →
NailMan © (2004-07-26 12:37) [3]Попробуй такую процедуру
procedure move_object(const yaw, pitch, roll: single;
var mat: TD3DXMatrix;
Const SIZE : TD3DXVector3
);
begin
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;
2 "Но" по этой процедуре:
- VectorNormalize надо заменить на D3DXVec3Normalize(чуть чуть изменить вид строк в вышеприведенном коде) и CrossProduct на D3DXVec3Cross. В примере используетя моя библиотека, которая более удобна для использования и оптимайзена для нескольких типов процов.
- процедура работает фактически не по абсолютным углам(от начала координат D3D), а по относительным углам(угловым скоростям), тоесть в локальной системе координат объекта.
Для постоянного вращения вокруг какой-то оси можно передавать соответсвенно константный угол. Скажем для постоянног вращения вокруг Z передаешь: move_object(0,0,1, mat, D3DXVector3(1,1,1));
(угол здесь в радинах)
---
WBR, NailMan aka 2:5020/3337.13
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c