Главная страница
    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.46 MB
Время: 0.035 c
8-1091640838
miek
2004-08-04 21:33
2004.11.14
GLScene: вопросы


9-1090425892
Evgeniy_K
2004-07-21 20:04
2004.11.14
Шрифт


14-1098681277
[lamer]Barmaglot
2004-10-25 09:14
2004.11.14
Помогите с цветами...


14-1098344148
Игорь Шевченко
2004-10-21 11:35
2004.11.14
Ничего себе...


1-1098879165
Zloy_dima
2004-10-27 16:12
2004.11.14
Dll





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский