Каков правильный параметр для glOrtho, чтобы сделать вид сверху? - PullRequest
1 голос
/ 27 января 2011

Я пытаюсь изучать OpenGL, создавая какое-то приложение 3D Modeler с использованием Visual C ++.Экран будет разделен на три окна: перспектива, фронт и верх (изометрия).И я почти отказываюсь от попыток реализовать вид сверху.Это мой текущий код вида сверху:


glOrtho(-1,1,-1,1,1,3.5f);
gluLookAt(
  0,2,0,//eye
  0,0,0,//center
  0,0,-1);//up 

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

Как я могу вычислить необходимый параметр для glOrtho и glLookAt?

Ответы [ 3 ]

4 голосов
/ 27 января 2011

Вы не должны использовать gluLookAt (обратите внимание на 'u' в 'glu', gluLookAt не является частью OpenGL), но устанавливать матрицы представления модели напрямую.Сначала вы должны определить, что происходит, далеко и в сторону.Большинство людей, использующих OpenGL, предпочитают правую систему координат (RHCS).Первое основание - X, второе Y и третье Z. В RHCS X - сбоку (вправо), Y - далеко, а Z - вверх.Проекция OpenGL по умолчанию такова, как если бы камера смотрела вниз по оси Z в отрицательном направлении, т. Е. Взгляд падал.

Таким образом, можно сказать, что матрица

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

смотрит вниз,Заглядывая в дальний угол, нужно рыскать.X остается прежним, но Y и Z меняются местами.Матрица, соответствующая этому, будет иметь вид

1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

. Если смотреть в сторону, глобальный Y отображает на X, глобальный X отображает на Z, а глобальный Z отображает на Y, в результате чего

0 1 0 0
0 0 1 0
1 0 0 0
0 0 0 1

Теперь вы, вероятно, хотите панорамировать и масштабировать этот вид.Вы можете сделать это либо используя glScale и glTranslate, либо непосредственно в матрице.

s 0 0 pan.x
0 s 0 pan.y
0 0 s pan.z
0 0 0 1

s 0 0 pan.x
0 0 s pan.y
0 s 0 pan.z
0 0 0 1

0 s 0 pan.x
0 0 s pan.y
s 0 0 pan.z
0 0 0 1

Теперь панорамирование в направлении Z не имеет большого смысла в ортографической проекции.Таким образом, вы можете оставить pan.z равным нулю.

Теперь давайте рассмотрим вашу проблему с ограничением глубины.Одним из приятных свойств отографической проекции является то, что диапазон обрезки глубины будет линейно отображаться в буфер глубины, тогда как в перспективной проекции он следует закону 1 / x.Также допускаются смешанные знаки для дальнего и ближнего расстояния, и нет никаких ограничений, что | рядом |<| далеко |Таким образом, для каждого из ваших видов все, что вам нужно сделать, это определить минимальное и максимальное положения всех преобразованных вершин объектов и использовать их для установки соответствующих значений клипа в проекции каждого вида.Хорошее приближение, так что вам не нужно перебирать каждую вершину, используя ограничивающие сферы и позиции объектов (добавляйте / вычитайте радиус ограничивающей сферы к ее положению), чтобы получить минимальный / максимальный диапазоны. </p>

1 голос
/ 20 апреля 2014

glm (GL математика, http://glm.g -truc.net / ), вероятно, то, что искал datenwolf во время написания ответа.Это обеспечивает возможности GLU, но предназначено для работы с современными GL.Например, есть функция glm :: ortho.Например, это glm, используемый для вычисления и установки матрицы проекции модель-вид для униформы вершинного шейдера с использованием ортогонального представления с GLM:

glm::mat4 model = ...
glm::mat4 view = ...

glm::mat4 projection = glm::ortho(-xrange, xrange,
                                  -yrange, yrange,
                                  -10.0f, 10.0f);

glm::mat4 mvp = projection * view * model;

glUniformMatrix4fv(uniform_mvp, 1, GL_FALSE, glm::value_ptr(mvp));
1 голос
/ 27 января 2011

Вам необходимо адаптировать значение z far в соответствии с вашей геометрией.Вы должны вычислить ограничивающую сферу или ограничивающую рамку вашей модели, найти диапазон Z и адаптировать камеру в соответствии с ней.

...