Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вращение камеры по сфере

458
15 сентября 2005 года
DarkAngel
27 / / 20.01.2000
Меня интересует адекватное управление камерой с "клавиатуры-мышки" (хоть с чего-нибудь). Как корректно обрабатывать изменения положения "курсора" (условно говоря) в рабочем окне? Знаю формулы (да их все знают), как обрабатывать 2 угла. Условно говоря, это поворот по X-оси и по Y-оси. А как из передвижения мышки генерировать угол для поворота по Z?

Тут (http://www.gamedev.ru/forum/?group=0&topic=18588) предлагали "полярный вид", но как получить те 2 угла (a и b), что на входе?
6.7K
20 сентября 2005 года
Metalslave
37 / / 24.08.2004
Цитата:
Originally posted by DarkAngel
Меня интересует адекватное управление камерой с "клавиатуры-мышки" (хоть с чего-нибудь). Как корректно обрабатывать изменения положения "курсора" (условно говоря) в рабочем окне? Знаю формулы (да их все знают), как обрабатывать 2 угла. Условно говоря, это поворот по X-оси и по Y-оси. А как из передвижения мышки генерировать угол для поворота по Z?

Тут (http://www.gamedev.ru/forum/?group=0&topic=18588) предлагали "полярный вид", но как получить те 2 угла (a и b), что на входе?


Можно использовать такой способ:
указуем начальные углы поворота камеры X и Y, например X=0 и Y=0;
Читаем смещение мыши относительно старой позиции (dx dy), теперь эти смещени делим на некий коофициент (сам его подбираешь, это так называемая чуствительность мыши), результаты деления добавляем к углам X и Y. Теперь находим 3 квантериона по ТРЕМ углам мыши X, Y и Z (угол Z считаем константой, например =0).

D3DXQuaternionRotationAxis(QuaternionRotateX, D3DXVector3(0,0,1), X);
D3DXQuaternionRotationAxis(QuaternionRotateY, D3DXVector3(0,1,0), Y);
D3DXQuaternionRotationAxis(QuaternionRotateZ, D3DXVector3(1,0,0), Z); - возможно этот квантерион и не нужен, пробуй.

пермножаем квантерионы и получаем матрицу поворота

D3DXQuaternionMultiply(Q, QuaternionRotateX, QuaternionRotateZ);
D3DXQuaternionMultiply(Q, Q, QuaternionRotateY);
D3DXMatrixRotationQuaternion(MatRotate, Q);

Из матрицы поворота MatRotate можно получить вектор направления DirVector (по моему единичной длины).

D3DXVec3TransformCoord(DirVector, D3DXVector3(0,1,0), MatRotate);

умнож этот вектор на радиус твоей сферы(со знаком -) и получишь вектор положения глаза камеры.
Смотрит камера все туда же. Если объект передвигаеться в пространстве, то вектор глаза получаем по другому:
вычитаем из вектора позиции объекта вектор направления камеры с указанной длиной.

EyeVector := VectorSub(objVec, SetVectorLength(DirVector, Distance));

, где
objVec - вектор позиции объекта в центре сферы
DirVector - все тот же вектор направления камеры
Distance - радиус сферы.
Смотрим из EyeVector в objVec.
SetVectorLength - это моя функция,(не нашел я в библиотеке нужной мне, она устанавливает длину вектора)

Function SetVectorLength(vec:TD3DVector; len : single ): TD3DVector;
var
k : single;
CurLen : single;
Begin
CurLen := D3DXVec3Length(vec);
if CurLen <> 0 then k := len / CurLen else k:=1;
D3DXVec3Scale(Result, vec, k);
End;
--
Возможно кое-что можно и оптимизировать, буду рад выслушать.
У меня это работает. Правда я немного вырезал, дал только нужное. Возможно где и обшибся. ;)Если что пиши, разберем.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог