OpenGL (камера)

Модератор: Модераторы разделов

frp
Сообщения: 1445
ОС: Debian Squeeze

OpenGL

Сообщение frp »

Делаю одну програмку на OpenGL. Пока только начал делать. Попытался сделать камеру, как описано где-то на gamedev.ru. Но не работает. Исходники прилагаются (архив не rar, а 7z) Файлы:
3dg.cbp - проект code::blocks
10points.png - текстура
txtmesh1.txt - моделька куба
mesh.h - файл с определением классов q_mesh (моделька из квадов), quad (собственно квад), и определение функции load_text_mesh для загрузки модельки из файла
mesh.cpp - реализация mesh.h
texman.h - объявление менеджера текстур
texman.cpp - реализация texman.h
main.cpp - инициализация SDL, OpenGL, отрисовка изображения, камера (короче, смотреть сюда)

Используемые библиотеки: OpenGL, DevIL (для загрузки текстур), и SDL.

Принцип действия камеры понятен из код функций Draw() и SetCam()

UPD. Глюки проявляются в том, что если поездить мышью по кругу, то куб наклоняется. Почему так? И как сделать чтобы не было так?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: OpenGL

Сообщение frp »

Понял, почему так: второй поворот осуществляется в новой системе координат, где вектор, вокруг которого осуществляется второй поворот, уже наклонен. Как от этого избавится?

PS. Рылся в исходниках OGRE, оттуда и догадался, но там повороты задаются кватернионами, а я о кватернионах ничего не знаю (кстати, где взять о них что-нибудь на русском понятное и с примерами использования?), так что как они этого добились так и не понял.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

Просто может принять какую-то систему поворота. Например, если это корабль в космосе, то такое поведение - норма. После кругового включения поворота корабль действительно повернётся. В обычных играх обычно принимается система азимут-высота. Т.е. у Вас есть два угла - один - поворот в горизонтальной плоскости (0 — 360), второй - по вертикали (-90 — +90). Тогда просто:

Код: Выделить всё

glLoadIdentity();
glRotatef( rotX, 0, 1, 0 );
glRotatef( rotY, 1, 0, 0 );

В этом случае не надо никаких матриц сохранять.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: OpenGL

Сообщение frp »

NickLion писал(а):
22.05.2010 23:41
Просто может принять какую-то систему поворота. Например, если это корабль в космосе, то такое поведение - норма. После кругового включения поворота корабль действительно повернётся. В обычных играх обычно принимается система азимут-высота. Т.е. у Вас есть два угла - один - поворот в горизонтальной плоскости (0 — 360), второй - по вертикали (-90 — +90). Тогда просто:

Код: Выделить всё

glLoadIdentity();
glRotatef( rotX, 0, 1, 0 );
glRotatef( rotY, 1, 0, 0 );

В этом случае не надо никаких матриц сохранять.

Спасибо, теперь глюка вроде нет. Хотя теоретически он должен быть: все равно второй поворот осуществляется вокруг наклоненного вектора.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

frp писал(а):
23.05.2010 11:57
Спасибо, теперь глюка вроде нет. Хотя теоретически он должен быть: все равно второй поворот осуществляется вокруг наклоненного вектора.

Не наклонённого, а повёрнутого, в этом и суть. А в следующий раз снова поворачиваемся от исходной позиции.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: OpenGL

Сообщение frp »

То есть преобразования выполняются в обратном порядке?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

Ну, да.
M=I*R1*R2
x'=M*x
x'=I*(R1*(R2*x))
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: OpenGL

Сообщение frp »

Спасибо.
Спасибо сказали: