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/ |