Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поворот всей сцены в текущей позиции на Delphi [Delphi]


RRAIN ©   (2004-10-13 09:19:00) 

Я начинаю осваивать OPENGL. Написал небольшую прогу, которая почти ничего не далает, но... (млин, нельзя добавить текст проги, говорит, что большое сообщение)

Вообщем дело обстоит так:
При при повороте в центре да и в других частях пространства, поворачивается сцена в центре начала запуска программы, но я бы хотел бы чтобы центр поворота была текущяя координата. Так же дело состоит и с шагом, когда в центре коридора повернутся на некоторое кол-во градусов, далее попробовать пройтись вперед, все двигается не прямо, а как бы передвигаясь немного в бок.
Подскажите, что сделать, пожалуйста.


RRAIN   (2004-10-19 08:55:00) [1]

Все, спасибо. Я разобрался. Только немного по-другому. Из примеров с сайта DelphiGFX.


XProger   (2004-10-18 23:13:00) [2]

Убери другие свои извращения! Этот код не даёт сбоев!
А вобще, посмотри, возвращаешь ли ты результат в WinProc ?


RRAIN   (2004-10-18 06:59:00) [3]

Если делать так:
function WndProc...
...
WM_MOUSEMOVE :
 if MMove then
  begin
  Yang := Yang + LOWORD(lParam) - WndWidth div 2;
  Xang := Xang + HIWORD(lParam) - WndHeight div 2;
  MMove := false;
  SetCursorPos(WndWidth div 2, WndHeight div 2);
  end
 else
  MMove := true;
...

procedure DrawScene...
...
glRotatef(Xang, 1, 0, 0);
glRotatef(Yang, 0, 1, 0);
//рендеринг сцены
...

то вся сцена зависает (ничего не показывает, просто как бы прозрачное окно). Но хотя реагирует на нажатие клавиши Esc.


П7   (2004-10-13 16:52:00) [4]

Выложи куда-нибудь или замыль - разберёмся. (:


XProger   (2004-10-13 15:48:00) [5]


function WndProc...
...
 WM_MOUSEMOVE :
  if MMove then
   begin
   Yang := Yang + LOWORD(lParam) - WndWidth div 2;
   Xang := Xang + HIWORD(lParam) - WndHeight div 2;
   MMove := false;
   SetCursorPos(WndWidth div 2, WndHeight div 2);
   end
  else
   MMove := true;
...

procedure DrawScene...
...
glRotatef(Xang, 1, 0, 0);
glRotatef(Yang, 0, 1, 0);
//рендеринг сцены
...


RRAIN   (2004-10-13 14:02:00) [6]

Если сделать так как ты написал, то все равно не получается. Если хочешь я могу тебе исходничек на мэйл скинуть.


DeadMeat   (2004-10-13 13:08:00) [7]

Тебе надо два ротэйта. Один по Х другой по Y. Тот, что по Y надо после транслэйта, т.к. он не должен влиять на движение. Тот, что по Х до него, т.к. он влияет на направление движения. Или если тебе надо летать, то оба надо ставить до него... В смысле до транслэйта...


RRAIN   (2004-10-13 13:02:00) [8]

И еще один маленький вопросик:
У меня эта прога без формы (в смысле форма создается програмно), реагирование на клавиши есть. Как сделать, чтобы мышку направо повел и с этим движением поворачивалась сцена, причем бесконечно, а не до того как курсор дойдет до края экрана. За ранее спасибо.


RRAIN   (2004-10-13 12:02:00) [9]

Я так и делаю:
glTranslatef(0,0.0,dviz);
 glRotatef(povor,0.0,1.0,0.0);
 glBegin(GL_QUADS);
   glColor3f(0.85,0.4,1.0);
   glVertex3f(-5.0, -2.0, 0.0);  // Слева вверху
   glColor3f(0.85,0.4,1.0);
   glVertex3f(1.0, -2.0, 0.0);  // Справа вверху
   glColor3f(0.85,0.4,1.0);
   glVertex3f(1.0, -2.0, -25.0);  // Справа внизу
   glColor3f(0.85,0.4,1.0);
   glVertex3f(-5.0, -2.0, -25.0);  // Слева внизу
 glEnd();
// стенки
//  glTranslatef(1.5,0.0,-6.0);
//  glRotatef(rquad,0.0,1.0,0.0);
 glBegin(GL_QUADS);
   glColor3f(0.85,0.4,0.0);
   glVertex3f(1.0, -2.0, 0.0);  // Слева вверху
   glColor3f(0.85,0.4,0.0);
   glVertex3f(1.0, -2.0, -25.0);  // Справа вверху
   glColor3f(0.85,0.4,0.0);
   glVertex3f(1.0, 2.0, -25.0);  // Справа внизу
   glColor3f(0.85,0.4,0.0);
   glVertex3f(1.0, 2.0, 0.0);  // Слева внизу
 glEnd();
//  glRotatef(rquad,0.0,1.0,0.0);
 glBegin(GL_QUADS);
   glColor3f(0.85,0.4,0.0);
   glVertex3f(-5.0, -2.0, 0.0);  // Слева вверху
   glColor3f(0.85,0.4,0.0);
   glVertex3f(-5.0, -2.0, -25.0);  // Справа вверху
   glColor3f(0.85,0.4,0.0);
   glVertex3f(-5.0, 2.0, -25.0);  // Справа внизу
   glColor3f(0.85,0.4,0.0);
   glVertex3f(-5.0, 2.0, 0.0);  // Слева внизу
 glEnd();

// потолок
//  glRotatef(rquad,0.0,1.0,0.0);
 glBegin(GL_QUADS);
   glColor3f(0.85,0.0,0.0);
   glVertex3f(1.0, 2.0, -25.0);  // Справа внизу
   glColor3f(0.85,0.0,0.0);
   glVertex3f(1.0, 2.0, 0.0);  // Слева внизу
   glColor3f(0.85,0.0,0.0);
   glVertex3f(-5.0, 2.0, 0.0);  // Слева внизу
   glColor3f(0.85,0.0,0.0);
   glVertex3f(-5.0, 2.0, -25.0);  // Справа внизу
 glEnd();

Если я rotate ставлю после translat'а, то двигается нормально, а поворачивается в начальной позиции. Когда наоборот, то поворачивается нормально а двигается только в две стороны, т.е. для начальной координаты (когда только запустишь прогу) вперед и назад. Вообщем если взять отрезок от а до б, то при любом повороте повороте буду все равно двигатся либо к а либо к б, но никак не в сторону от а на определенное кол-во градусов.


DeadMeat   (2004-10-13 11:45:00) [10]

А ты весь текст не приводи, только нужное...
А так, могу предположить, что тебе надо вначале (в смысле перед поворотом) переместить систему координат, а потом уже крутить.
Примерно так:
glTranslatef (.....);
glRotatef (.....);


Наверх

Титульная страница Поиск, карта сайта Написать письмо