Текущий архив: 2004.11.14;
Скачать: CL | DM;
ВнизПомогите с камерой ПЛИЗ!!!!! Найти похожие ветки
← →
NOX (2004-08-10 14:33) [0]На форуме игры никого нет потому решил попытать счастья здесь...
Здраствуйте. Изучаю я Direct3D и надо сделать вращающуюся вокруг модели камеру (как в 3DMax при движении мыши)
и столкнулся с такой проблемой:
предположим камера в точке (0.0, 3.0, -0.2) и вращается вокруг оси Х т.е. (камера как бы двигается вдоль оси Z и все ближе к оси Х
и точке Z=0). Так вот когда камера пересекает ось Х т.е. Z меняет знак, камера поворачивается вокруг оси Y и сцена оказывается
вверх тормашками. Я понимаю что конкретно для этого случая нужно поменять компоненту z в третьем векторе в процедуре
SetViewMatrix на 1, но тогда начинают сбоить две другие оси. А так как вращение не в одной (тогда бы проблем не было), а в 3-х
плоскостях, то я запутался. Кто сталкивался помогите ПЛИЗ!!! Подскажите алгоритм или ссылку где почитать.
Заранее спасибо.procedure RotateCamera(dx, dy : integer); // смещение указателя мыши
var matView : TD3DMatrix;
begin
Alpha:=Alpha - dx / 360;
if Alpha >= _2Pi then Alpha:=Alpha - _2Pi;
if Alpha < 0 then Alpha:=Alpha + _2Pi;
Beta:=Beta + dy / 360;
if Beta >= _2Pi then Beta:=Beta - _2Pi;
if Beta < 0 then Beta:=Beta + _2Pi;
ViewVector.x:=Distance * cos(Beta) * cos(Alpha);
ViewVector.z:=Distance * cos(Beta) * sin(Alpha);
ViewVector.y:=Distance * sin(Beta);
SetViewMatrix(matView, ViewVector, D3DVector(0, 0, 0), D3DVector(0, 0, 0));
Device.SetTransform(D3DTS_VIEW, matView);
end;
← →
Sapersky (2004-08-10 17:09) [1]С векторами всегда будут какие-то скачки при переходах через 0 (или нужно ограничивать).
Можно матрицами:
(Пришлось кое-что подправить, поэтому обещать на 100% что заработает не могу. Ну, общий принцип...)
Type
TVector = TD3DVector;
TMatrix = TD3DMatrix;
// построение матрицы вращения относительно произвольной оси (из framework"а к D3D7, вроде)
procedure MatrixRotateVec(Const vDir: TVector; fRads: Single; Var DestM : TMatrix);
Var
v : TVector;
BufSin, BufCos : Extended;
begin
SinCos(fRads, BufSin, BufCos);
v := VectorNormalize(vDir); // нормализация - найти длину и разделить на неё все компоненты
With DestM do begin
_11 := ( v.x * v.x ) * ( 1.0 - BufCos ) + BufCos;
_12 := ( v.x * v.y ) * ( 1.0 - BufCos ) - (v.z * BufSin);
_13 := ( v.x * v.z ) * ( 1.0 - BufCos ) + (v.y * BufSin);
_21 := ( v.y * v.x ) * ( 1.0 - BufCos ) + (v.z * BufSin);
_22 := ( v.y * v.y ) * ( 1.0 - BufCos ) + BufCos ;
_23 := ( v.y * v.z ) * ( 1.0 - BufCos ) - (v.x * BufSin);
_31 := ( v.z * v.x ) * ( 1.0 - BufCos ) - (v.y * BufSin);
_32 := ( v.z * v.y ) * ( 1.0 - BufCos ) + (v.x * BufSin);
_33 := ( v.z * v.z ) * ( 1.0 - BufCos ) + BufCos;
_41 := 0.0; _42 := 0.0; _43 := 0.0; _44 := 1.0;
end;
end;
// просто умножение матриц
procedure MatrixMul(const Src1, Src2: TMatrix; Var Dest : TMatrix);
var i,j,k : Integer;
begin
Dest:=ZeroMatrix;
for i := 0 to 3 do
for j := 0 to 3 do
for k := 0 to 3 do
Dest.m[i,j] := Dest.m[i,j] + (Src1.m[k,j] * Src2.m[i,k]);
end;
// ViewMatrix - текущая видовая матрица, OffsRel - смещение мыши по осям
procedure MatrixRotateByMouse(Var ViewMatrix : TMatrix; MouseOffsRelX, MouseOffsRelY : Single);
Var v : TVector;
mx, my, m, buf : TMatrix;
begin
v.x:=PrevMatrix._12; v.y:=PrevMatrix._22; v.z:=PrevMatrix._32;
// получаем текущую вертикальную (для зрителя) ось
MatrixRotateVec(v, MouseOffsRelX * Pi, True, mx);
// крутим относительно неё
// то же для горизонтальной
v.x:=PrevMatrix._11; v.y:=PrevMatrix._21; v.z:=PrevMatrix._31;
MatrixRotateVec(v, MouseOffsRelY * Pi, my);
MatrixMul(mx, my, m); // получаем общую матрицу поворота
MatrixMul(ViewMatrix, m, Buf); // умножаем на неё видовую матрицу
ViewMatrix:=buf;
end;
← →
NOX (2004-08-10 20:45) [2]Спасибо. Попробую разобраться, но если у кого идеи попроще скажите плиз!
← →
NOX (2004-08-11 19:45) [3]А что такое PrevMatrix?
← →
Sapersky (2004-08-11 20:49) [4]Пардон, там ViewMatrix должно быть.
Страницы: 1 вся ветка
Текущий архив: 2004.11.14;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.036 c