Подогнать 3d модель внутри окна - PullRequest
5 голосов
/ 15 ноября 2010

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

scaleFactor = ( screenSize / (maxModelSize * constant) )

Где размер - высота или ширина, в зависимости от того, что больше.
Константа - 1 / (length of one screen pixel in OpenGL units)
Есть две проблемы сэто:
1. После выполнения некоторых преобразований я хочу иметь возможность вернуться к этому начальному масштабу (модель масштабируется по размеру окна) с использованием Identity.В настоящее время вызов идентификатора приведет модель к ее первоначальным размерам (до «фиксирующей» шкалы).
2. «Константа» - это то, что я получил методом проб и ошибок, я чувствую, что мне не подходит метод,Я также подозреваю, что это вообще не константа, а зависит от разрешения экрана, и бог знает, что еще.

1 Ответ

9 голосов
/ 15 ноября 2010

Раздел 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);
...