Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 27.11.2011, 19:45   #1
_PROGRAMM_
Профессионал
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Адрес: Российская Федерация
Сообщений: 1,603
Репутация: 239
По умолчанию Вращение камеры 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,693
Репутация: 615

icq: 426824418
По умолчанию

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

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

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

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

icq: 426824418
По умолчанию

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

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

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

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

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

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

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

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

icq: 426824418
По умолчанию

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,603
Репутация: 239
По умолчанию

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

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

Блог

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

icq: 426824418
По умолчанию

Код:

//грубо, но наглядно
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,603
Репутация: 239
По умолчанию

Спасибо. В общих словах, я что-то сделал. Уже что-то наблюдается, но картинка дергается и возвращается обратно. Код я смастерил вот такой.
Код:

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_ вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает 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


21:11.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru