Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2011, 19:45   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Вращение камеры gluLookAt

Добрый вечер. Я сделал(пока не полностью) комнату и хочу передвигать в ней камеру. Для этого выбрал функцию gluLookAt. Нашел интересную статью. Там есть такой код.
Код:
        
            public void Rotate_View(float speed)
        {
            Vector3D vVector;// Полчим вектор взгляда
            vVector.x = mView.x - mPos.x;
            vVector.y = mView.y - mPos.y;
            vVector.z = mView.z - mPos.z;

            

            mView.z = (float)(mPos.z + Math.Sin(speed) * vVector.x + Math.Cos(speed) * vVector.z);
            mView.x = (float)(mPos.x + Math.Cos(speed) * vVector.x - Math.Sin(speed) * vVector.z);
        }
В нем очень много связанных функций, а мне хочется узнать что нужно только для этого, точнее для вычисления координат взгляда.
Следующем кодом устанавливается камера.
Код:
Glu.gluLookAt(Position.x, Position.y, Position.z, //Позиция самой камеры
                        View.x, View.y, View.z,             //Куда смотрим
                        Up.x, Up.y, Up.z);                  //Верх камеры
Заранее благодарю.
P.S. Вот статья

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 29.11.2011, 15:29   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

1) Кватернионы http://www.gamedev.ru/code/articles/...nad_kvaternion
2) Сферическая система координат
3) Матричные преобразования
Kostia вне форума Ответить с цитированием
Старый 29.11.2011, 16:50   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Я дополню. Информацию желательно давать девятикласснику. Ваши ссылки я посмотрю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 29.11.2011, 17:17   #4
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Тогда второй вариант самое оно, sin, cos и пара формул.
Достаточно задать широту, долготу и радиус в сферической системе координат, а потом перевести их в декартову систему координат и как следствие получить вектор направления взгляда.
Kostia вне форума Ответить с цитированием
Старый 30.11.2011, 07:24   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо. Если чего-то не пойму, хотя постараюсь понять, обращусь за помощью.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 11.12.2011, 08:34   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Доброе утро. Ну вот и возникли вопросы. Сразу же, с чем я столкнулся, это сферическая система координат. Как мне связать X Y мыши и задать сферические координаты? Опишу все свои знания.
В сферической системе координат три переменные: угол между осью Х, Угол между осью Z точка p и расстояние к ней r. Чтобы перевести в декартовую систему, нужно воспользоваться следующей формулой

Заранее благодарю за помощь.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 11.12.2011, 15:06   #7
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

r = 1
тэта = фи = 0
фи += deltaX * некий маленький коэффициент(0,05 например)
тэта += deltaY * некий маленький коэффициент(0,05 например)
/*ограничение угла тэта, если требуется. вместо +-pi/2 можно указать любой свой угол*/
if(тэта>pi/2) тэта = pi/2
if(тэта<-pi/2) тэта = -pi/2

deltaX и deltaY разница между старым положением курсора и новым
Kostia вне форума Ответить с цитированием
Старый 14.12.2011, 07:13   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

И далее по предложенной мной формуле? Я не всматривался в нее, а теперь заметил, что ничего по этому поводу не понимаю. Я пороюсь в алгебре и геометрии, но все же прошу вас показать, как это делается, чтобы сравнится с правильным вариантом.
Оффтоп += это операция прибавления к переменной в С++?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 14.12.2011 в 14:45.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 14.12.2011, 16:33   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Код:
//грубо, но наглядно
function onMouseMove(int x, int y)
{
//считаем изменение координат курсора, относительно старых
  deltaX = x - oldX;
  deltaY = y - oldY;
//запоминаем текущие координаты
  oldX = x; oldY = y;
//изменяем широту и долготу
  longitude = longitude + deltaX * 0.1; //долгота, фи
  latitude = latitude + deltaY * 0.1; //широта, тэта
//ограничиваем широту(тэта)
  if(latitude>pi/2) latitude = pi/2;
  if(latitude<-pi/2) latitude = -pi/2;
//считаем x,y,z
  x = sin(latitude)*cos(longitude);
  y = sin(latitude)*sin(longitude);
  z = cos(latitude);
  gluLookAt(Position.x, Position.y, Position.z, //Позиция самой камеры
                        x, y, z,             //Куда смотрим
                        0,1,0);
}
Цитата:
Оффтоп += это операция прибавления к переменной в С++?
a += b; <=> a = a + b;
Kostia вне форума Ответить с цитированием
Старый 14.12.2011, 20:08   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо. В общих словах, я что-то сделал. Уже что-то наблюдается, но картинка дергается и возвращается обратно. Код я смастерил вот такой.
Код:
procedure TForm1.TimerMouseMoveTimer(Sender: TObject);
var
ViewPort: array[0..3] of GLint;           // переменные для вычисления мировых координат
mvMatrix, ProjectMatrix : array[0..15] of GLDouble;
RealY:GLInt;
Zvalue : GLfloat;
wx, wy, wz : GLdouble;
MouseCoord:Tpoint;
teta,fi,deltaY,DeltaX,speed:Real;// для вычисления вектора взгляда
begin
  speed:=0.1;

 GetCursorPos(MouseCoord);                                                             //*
 glGetIntegerv(GL_VIEWPORT,@viewport);                                                 //*  Вычисление мировых координат
 glGetDoublev(GL_MODELVIEW_MATRIX, @mvMatrix);                                         //*
 glGetDoublev(GL_PROJECTION_MATRIX, @projectMatrix);                                   //*
                                                                                       //*
 RealY:=viewport[3]-MouseCoord.Y-1;                                                    //*
 glReadPixels(MouseCoord.X, RealY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Zvalue);       //*
 gluUnProject(MouseCoord.X,RealY,Zvalue,@mvMatrix,@projectMatrix,@viewport,wx,wy,wz);  //*

 fi  :=0; // Возможно ошибка здесь, но если они будут глобальными - черный экран.
 teta:=0;

 DeltaX:=wx-OldX;//OldX и OldY - глобальные, типа Real.
 DeltaY:=wy-OldY;

 OldX:=wx;
 OldY:=wy;

 fi:=fi + DeltaX*speed;
 teta:=teta + DeltaY*speed;

 if(teta>pi/2) then teta := pi/2;    // Честно немного не понимаю, но думаю что это для того,
 if(teta<=pi/2) then teta := -pi/2;  // чтобы не дать камере крутится вокруг своей оси

 Vector.x:=sin(fi)*cos(teta);
 Vector.y:=sin(fi)*sin(teta);
 Vector.z:=cos(fi);
end;
gluLookAt вызывается отдельно в процедуре рисования. Переменные wx и wy можно соответственно принимать за мировые координаты X и Y курсора.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 14.12.2011 в 20:16.
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает gluLookat SAMOUCHKA Qt и кроссплатформенное программирование С/С++ 2 23.09.2011 18:52
Вращение камеры вокруг своей оси [OpenGL] russian-stalker Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 14.04.2011 21:03
Direct3D9, вращение камеры. _-Re@l-_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 06.04.2011 20:49
Вращение камеры (Direct3D) AidarBik Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 24.07.2009 08:45