Форум: "Игры";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизПоворот всей сцены в текущей позиции на 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.051 c