Поместим 3d модель в окно


Я хочу отобразить модели различных размеров, помещенные в вид, чтобы вся модель была видна внутри экрана.
Как лучше всего это сделать? Я попытался масштабировать (используя glScale) модель, используя эту формулу

scaleFactor = ( screenSize / (maxModelSize * constant) )
Где размер-это высота или ширина, в зависимости от того, что больше.
Константа 1 / (length of one screen pixel in OpenGL units)
С этим есть две проблемы:
1. после выполнения некоторых преобразований я хочу иметь возможность вернуться к этому исходному масштабу (модель масштабируется в соответствии с окном) использование идентичности. В настоящее время вызывающая идентичность приведет модель к ее первоначальным размерам (до "фиксации" масштаба).
2."Константа" - это то, что я получил методом проб и ошибок, я чувствую неправильный метод для меня. Я также подозреваю, что это вовсе не константа, а зависит от разрешения экрана и бог знает от чего еще.
1 5
mfc

1 ответ:

Секция 8.070:

Следующее из публикации по Дэйв Шрайнер о создании базового система просмотра:

Сначала вычислите ограничивающую сферу для все объекты в вашей сцене. Это должно быть предоставить вам два бита информация: центр сферы (пусть (c.x, c.y, c.z) - это точка) и его диаметр (назовем его "диам").

Затем выберите значение для 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);