Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Поворот всей сцены в текущей позиции на Delphi   Найти похожие ветки 

 
RRAIN   (2004-10-13 09:19) [0]

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

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


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

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


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

Я так и делаю:
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"а, то двигается нормально, а поворачивается в начальной позиции. Когда наоборот, то поворачивается нормально а двигается только в две стороны, т.е. для начальной координаты (когда только запустишь прогу) вперед и назад. Вообщем если взять отрезок от а до б, то при любом повороте повороте буду все равно двигатся либо к а либо к б, но никак не в сторону от а на определенное кол-во градусов.


 
RRAIN   (2004-10-13 13:02) [3]

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


 
DeadMeat ©   (2004-10-13 13:08) [4]

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


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

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


 
XProger ©   (2004-10-13 15:48) [6]


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);
//рендеринг сцены
...


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

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


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

Если делать так:
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.


 
XProger ©   (2004-10-18 23:13) [9]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
14-1104328422
PVOzerski
2004-12-29 16:53
2005.01.23
Может, и нашего сайта дизайн и "движок" оцените?


6-1099035592
Андрей 2004
2004-10-29 11:39
2005.01.23
SNMP-Протокол


1-1105362176
П7
2005-01-10 16:02
2005.01.23
String в Single без погрешностей


1-1104849219
VitGun
2005-01-04 17:33
2005.01.23
Определение числа в строке. Возможно?


1-1104923323
franky
2005-01-05 14:08
2005.01.23
messagedlg