PMG
https://forum.pmg.org.ru/

Перемещение в трехмерном мире
https://forum.pmg.org.ru/viewtopic.php?f=1&t=6731
Страница 1 из 1

Автор:  AnDroID [ 10 дек 2008 14:40 ]
Заголовок сообщения:  Перемещение в трехмерном мире

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

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

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

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

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

Автор:  MagicWolf [ 11 дек 2008 10:04 ]
Заголовок сообщения:  Re: Перемещение в трехмерном мире

Это работа с камерой. Вот пример разных способов манипуляции с ней.

Код:
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;
  }
}

Автор:  rabbit [ 12 янв 2009 16:45 ]
Заголовок сообщения:  Re: Перемещение в трехмерном мире

Знакомая ситуация, как раз пытаюсь писать игрушку...Долго думал как реализовать попроще движения, и все оказалось очень просто, когда вспомнил о полярной системе координат.

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 матрицу, а похже востановить, иначе не будет никакого эфекта от вращения мышкой.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/