Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

Помогите с камерой ПЛИЗ!!!!!   Найти похожие ветки 

 
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 вся ветка

Форум: "Media";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.038 c
14-1098458364
Gero
2004-10-22 19:19
2004.11.14
Программы для тестирования железа


14-1098709915
ArMellon
2004-10-25 17:11
2004.11.14
люди помогите найти дрова на видюху


14-1099035098
pppp
2004-10-29 11:31
2004.11.14
Информация к размышлению


1-1098818523
Yanis
2004-10-26 23:22
2004.11.14
С++ => Delphi


14-1098776503
ИМХО
2004-10-26 11:41
2004.11.14
Проиграть DVD на CD-ROM-е





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский