Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.052 c
3-1097758099
star
2004-10-14 16:48
2004.11.14
сортировка


14-1098790632
Мирон
2004-10-26 15:37
2004.11.14
Помогите с Novell ом


14-1098720165
Александр1
2004-10-25 20:02
2004.11.14
Настройка сети


14-1099073229
Zacho
2004-10-29 22:07
2004.11.14
Что-нибудь свеженькое из фантастики


3-1097573006
Aser
2004-10-12 13:23
2004.11.14
Помогите пожалуйста с SQL-запросом