Сохранение объекта, созданного в OpenGL, в границах окна - PullRequest
0 голосов
/ 27 ноября 2011

Я работал над игрой, используя цель c и OpenGL. Я знаю, как создать объект и как заставить его двигаться так, как я хочу, но я не могу держать его в окне. Как вы держите объект в окне?

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

FAQ по OpenGL, раздел 8.070: Как автоматически рассчитать представление, отображающее всю мою модель? :

Ниже приведено сообщение Дэйва Шрайнера о настройкебазовая система просмотра:

Сначала вычислите ограничивающую сферу для всех объектов в вашей сцене.Это должно предоставить вам два бита информации: центр сферы (пусть (cx, cy, cz) будет эта точка) и ее диаметр (назовите его «diam»).

Далее выберите значениедля плоскости отсечения zNear.Общие рекомендации - выбирать что-то большее, чем, но близкое к 1,0.Итак, допустим, вы установили:

zNear = 1.0; 
zFar = zNear + diam;

Структурируйте вызовы вашей матрицы в следующем порядке (для ортогональной проекции):

GLdouble left = c.x - diam; 
GLdouble right = c.x + diam; 
GLdouble bottom c.y - diam; 
GLdouble top = c.y + diam; 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(left, right, bottom, top, zNear, zFar); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Этот подход должен центрировать ваши объекты по центруОкно и растянуть их, чтобы соответствовать (то есть, если вы используете окно с соотношением сторон = 1,0).Если ваше окно не квадратное, вычислите левый, правый, нижний и верхний, как указано выше, и вставьте следующую логику перед вызовом glOrtho ():

GLdouble aspect = (GLdouble) windowWidth / windowHeight; 
if ( aspect < 1.0 ) { // window taller than wide
    bottom /= aspect; 
    top /= aspect; 
} else { 
    left *= aspect; 
    right *= aspect; 
}

Приведенный выше код должен позиционироватьобъекты в вашей сцене соответственно.Если вы намереваетесь манипулировать (то есть вращаться и т. Д.), Вам необходимо добавить к нему преобразование просмотра.

Типичное преобразование просмотра будет выполняться в матрице ModelView и может выглядеть следующим образом:

gluLookAt(0., 0., 2.*diam, 
          c.x, c.y, c.z, 
          0.0, 1.0, 0.0);
0 голосов
/ 27 ноября 2011

«смотреть на» камеру - очень удобный способ заставить зрителя отслеживать объект (следовательно, как бы ни перемещался объект или точка камеры, объект будет оставаться на экране). смотрите 'gluLookAt' для обычно предоставляемой реализации, у большинства библиотек вспомогательного кода 3d есть такая. Вы даете ему желаемую точку камеры, интересующий вас объект и «вектор роста», и он создаст соответствующую матрицу мира (преобразование камеры).

В противном случае, если вы контролируете объект, просто не перемещайте его за пределы исходного усеченного конуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...