PMG

Форумы по созданию игр
Текущее время: 13 дек 2024 12:24

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Перемещение в трехмерном мире
СообщениеДобавлено: 10 дек 2008 14:40 
Не в сети
Новичок

Зарегистрирован: 10 дек 2008 14:35
Сообщения: 1
Всем привет.
НеХе в 10 уроке разбирает перемещение в трехмерном мире, но фактически перемещение идёт в одной плоскости - XZ (по Y только голова качается), в зависимости от угла вращения вокруг Y.

Такое перемещение я уже реализовал в своей проге.
Хочу теперь сделать перемещение во всех 3 плоскостях одновременно (аля космический корабль в космосе - куда смотрим, туда и летим).

Но пока не очень получается =)

Может кто-нибудь уже сталкивался с такой задачей или есть подробные алгоритмы?

Заранее благодарен =)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перемещение в трехмерном мире
СообщениеДобавлено: 11 дек 2008 10:04 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Это работа с камерой. Вот пример разных способов манипуляции с ней.

Код:
void CCamera_OGL:: apply_viewer ()
{
  switch ( type_view ) {
  case 0:
    gluLookAt(eye.x,eye.y,eye.z, center.x,center.y,center.z, up.x,up.y,up.z );
    break;
  case 1:
    glRotatef (roll, 0.0f, 0.0f, 1.0f);
    glRotatef (pitch, 0.0f, 1.0f, 0.0f);
    glRotatef (heading, 1.0f, 0.0f, 0.0f);
    glTranslatef (-plane.x, plane.y, plane.z );
    break;
  case 2:
    glTranslatef (0.0f, 0.0f, -distance );
    glRotatef (-twist, 0.0f, 0.0f, 1.0f);
    glRotatef (-elevation, 0.0f, 1.0f, 0.0f);
    glRotatef (azimuth, 1.0f, 0.0f, 0.0f);
    break;
  }
}

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перемещение в трехмерном мире
СообщениеДобавлено: 12 янв 2009 16:45 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 09 янв 2009 15:11
Сообщения: 16
Знакомая ситуация, как раз пытаюсь писать игрушку...Долго думал как реализовать попроще движения, и все оказалось очень просто, когда вспомнил о полярной системе координат.

1) вектор направленосто r. Его величина достаточно что б была 1.0f

2) угол в плоскости (XZ) - например t (для простоты представления вспоминаем обычную XoY, и тут у нас

z-это x x-это y

3) угол в плоскости относительно оси Y - например p.

4)вектор направлености, куда мы смотрим a

5)вектор нормали к нам, направление вверх

6)что бы сказать опеЖЛ куда и откуда смотреть - масивы Pos[3],LookTo[3],LookN[3]
7)Переменная для изменения интенсивности мышки float MouseIntensive=5;


и еще...Когда мы возвращаем курсор в центр экрана ф-ей SetCursorPos(), то возникает еще одно событие движения мышкой, которое зациклит программу. Я это обошел переменной bool CanMouseMove.

теперь в обработчике движения мышкой пишем следующий код.

{POINT Cursorpos;
GetCursorPos(&CursorPos);
SetCursorPos(W/2,H/2);
CursorPos.y=H-CursorPos.y;//H-высота экрана; это нужно, потому что для виндовса 0 сверху, а для
//опенглюка снизу.

if(CanMouseMove)

{dx=W/2-CursorPos.x;

dy=H/2-CursorPos.y;

p-=dx/180*Pi/MouseIntensive; t+=dy/180*Pi/MouseIntensive;
a[0]=r*sin(p)*cos(t); a[1]=r*sin(t); a[2]=r*cos(p)*cos(t);
n[0]=r*sin(p)*cos(t+Pi/2); n[1]=r*sin(t+Pi/2); n[2]=r*cos(p)*cos(t+Pi/2);
LookTo[0]=Pos[0]+a[0]; LookTo[1]=Pos[1]+a[1]; LookTo[2]=Pos[2]+a[2];
LookN[0]=n[0]; LookN[1]=n[1]; LookN[2]=n[2];
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt(Pos[0],Pos[1],Pos[2],
LookTo[0],LookTo[1],LookTo[2],
LookN[0],LookN[1],LookN[2]);

}
//if(CanMouseMove)
CanMouseMove=!CanMouseMove;//получаеться мы обрабатуем событие движения мышкой;
//и потом благодаря этой проверке упустим ложное событие, вызванное SetCursorPos, и снова по кругу
}

а теперь будьте внимательны, в вашей функции Draw(), если вы вызываете glLoadIdentity(); то не забудте перед этим сохранить GL_MODELVIEW матрицу, а похже востановить, иначе не будет никакого эфекта от вращения мышкой.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB