Поместим 3d модель в окно
Я хочу отобразить модели различных размеров, помещенные в вид, чтобы вся модель была видна внутри экрана.
Как лучше всего это сделать?
Я попытался масштабировать (используя glScale) модель, используя эту формулу
scaleFactor = ( screenSize / (maxModelSize * constant) )
Где размер-это высота или ширина, в зависимости от того, что больше.Константа
1 / (length of one screen pixel in OpenGL units)
С этим есть две проблемы:
1. после выполнения некоторых преобразований я хочу иметь возможность вернуться к этому исходному масштабу (модель масштабируется в соответствии с окном) использование идентичности. В настоящее время вызывающая идентичность приведет модель к ее первоначальным размерам (до "фиксации" масштаба).
2."Константа" - это то, что я получил методом проб и ошибок, я чувствую неправильный метод для меня. Я также подозреваю, что это вовсе не константа, а зависит от разрешения экрана и бог знает от чего еще.
1 ответ:
Следующее из публикации по Дэйв Шрайнер о создании базового система просмотра:
Сначала вычислите ограничивающую сферу для все объекты в вашей сцене. Это должно быть предоставить вам два бита информация: центр сферы (пусть (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);