Как реализовать функцию масштабирования OpenGL - PullRequest
3 голосов
/ 25 июня 2009

У меня есть приложение OpenGL, которое реализует такие функции навигации, как «Орбита», «Прогулка», «Поворот», «Поворот» и т. Д. Для навигации в трехмерной среде.Все это работает безупречно и довольно просто в настройке с использованием gluPerspective и gluLookAt .

glMatrixMode GL_PROJECTION
   glLoadIdentity
   gluPerspective m_ViewAngle, m_AspectRatio, m_ClipDistance_Near, m_ClipDistance_Far          

   glMatrixMode GL_MODELVIEW
   glLoadIdentity
   gluLookAt m_Eye.X, m_Eye.Y, m_Eye.Z, m_Focus.X, m_Focus.Y, m_Focus.Z, m_ViewUP.X, m_ViewUP.Y, m_ViewUP.Z

   glCallList DisplayListIndex

Аналогично типичному ZoomExtents или Команда ZoomToFit в программном обеспечении САПР, с любой произвольной точки зрения (направление обзора), я хотел бы иметь возможность масштабирования, чтобы (1) вся трехмерная среда была видна, и (2) трехмерная модель среды заполнялавесь видовой экран (максимально большой, учитывая текущий размер видового экрана).

Я знаю ограничивающую рамку (экстенты) среды (мин. XYZ, макс. XYZ).Однако я не смог определить, какими должны быть позиции Глаза и Фокуса для заданных ViewAngle и AspectRatio и экстентов среды.

Возможно, есть более простой способ сделать это, чем с gluLookAt ,Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 14 августа 2009

На самом деле это можно сделать гораздо «проще».

Что вам нужно сделать, так это проецировать вашу модель на плоскость. Затем определите самую высокую и самую низкую точки (верхняя y, нижняя y, крайняя левая x, крайняя правая x) и, наконец, определите, сколько масштабирования вам нужно, чтобы поместить этот прямоугольник в прямоугольник, который вам действительно нужен.

Плоскость, на которую нужно проецировать, является плоскостью экрана.

К счастью для вас, вы уже делаете это.

Итак, преобразуйте каждую точку вашей модели, используя матрицы, которые вы уже установили, и определите максимальное количество точек.

Подсчитайте, сколько масштабов вам нужно, чтобы уместить его на экране. И применить это масштабирование к масштабированию объекта

Вот так

0 голосов
/ 25 июня 2009

Приблизьте все это к сфере и примените следующую формулу, умноженную на отношение пиксель / модель к единице. Вы можете рассчитать отношение пиксель-модель-единица измерения путем рендеринга единичной сферы по известной координате z. Хорошая вещь о сфере является то, что ее ширина всегда будет диаметром, независимо от того, откуда вы смотрите. Подробнее см. перспективная проекция .

alt text

Редактировать : Хорошо, что сфера независима от направлений. Независимо от поля или сферы вам нужно указать направление вектора камеры и вектора вверх . Если у вас есть это, единственным неизвестным является глубина z с точки зрения глаза. Оттуда вы можете рассчитать положение глаза по:

 eye := (center.x, center.y, center.z) - depth * (camera.x, camera.y, camera.z)

Из формулы Bx := Ax * Bz / Az Вы можете получить Bz := Bx * Az / Ax.

Позвольте мне определить координату модели 1.0 равной 1.0м. Предположим, сфера радиусом 1,0 м с расстояния 100,0 м имеет ширину 20 пикселей.

Bz := 1.0 * 100.0 / 10
Bz := 10.0

Теперь предположим, что ваша ограничительная рамка имеет ширину 200,0 м, что делает Ax равным 100,0, а ширина экрана 1024 пикселя, что составляет Bx 512 пикселей.

Az := (Ax / Bx) * Bz
Az := (100.0/512.0) * 10.0
Az := 1.953m

В приведенных выше единицах измерения между м и пиксель поглощается Bz.

Предположим, вектор повышения (0, 0, 1), вектор камеры (1, 0, 0) и центр (0, 0, 0).

eye := center - depth * camera
eye := (0, 0, 0) - 1.953 * (1, 0, 0)
eye := (-1.953, 0, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...