Подтвердить что ты не робот

Где точки OpenGL z-axis?

Я пытаюсь понять систему координат OpenGL. Повсюду я вижу, что это описано как правое, но это не соответствует моему опыту. Я попытался нарисовать некоторые фигуры и 3-мерные объекты, и я вижу, что, по-видимому, оси z указывают "на экран" (в то время как x указывает вправо, а y вверх - это описание левой системы координат). Что мне не хватает?

изменить: Например:
http://img576.imageshack.us/img576/9234/triangles.jpg
Если + Z-просмотрщик, почему зеленый треугольник, z-координата которого больше, находится за красным?

initializeGL:

qglClearColor(Qt::darkGray);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc( GL_LEQUAL );    
glEnable(GL_COLOR);  

resizeGL:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, 50.0, -50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

paintGL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef (-30.0, 1.0, 0.0, 0.0);
glRotatef (20.0, 0.0, 1.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex3f(45.0, 0.0, 0.0);
glVertex3f(-45.0, 0.0, 0.0);
glVertex3f(0.0, 45.0,  0.0);
glVertex3f(0.0, -45.0,  0.0);
glVertex3f( 0.0, 0.0, 45.0);
glVertex3f( 0.0, 0.0, -45.0);
glEnd();
glBegin(GL_TRIANGLES);
//Red triangle:
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 20.0, 1.0);
glVertex3f(20.0, 0.0, 1.0);
//Green triangle:    
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-15.0, 0.0, 20.0);
glVertex3f(0.0, 25.0, 20.0);
glVertex3f(15.0, 0.0, 20.0);
glEnd();
4b9b3361

Ответ 1

Последние 2 параметра glOrtho ссылка:

nearVal, farVal
Укажите расстояния до ближайших и дальнейших плоскостей отсечения глубины. Эти значения отрицательны, если плоскость должна находиться за зрителем.

Ваш ближайший отсекающий самолет находится перед зрителем и дальше, позади. Он перевернет ось Z.

Ответ 2

Хорошо, то, что выделяется для меня, это функция glOrtho. У вас есть ближние и дальние отсечения самолетов всего в 100 единиц. Это кажется очень маленьким. Вы действительно этого хотите? Он представлен последними 2 параметрами в этой функции.

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

Я бы увеличил все параметры в вызове glOrtho. НТН


В правой руке (OpenGL) отрицательный Z (-Z) должен указывать на экран. Положительный Y должен быть "вверх", а положительный X должен быть справа.

Это похоже на то, что вы описали, и это правая система координат.

Возможно, это может помочь. http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

Ответ 3

Что мне не хватает?

В левой (левой) системе x точки справа, y указывает вверх, z указывает вперед (вдали от зрителя).

В правой правой x точке справа, y указывает вверх, z указывает назад (в сторону зрителя).

Picture

Изображение взято из wikipedia.

x - большой палец, y - указательный палец, а z - средний палец.

Ответ 4

Это зависит от того, как вы рисуете.

Идентичность для представления модели и регулярная gluPerspective для проекции ожидают, что входная система координат будет правшей (как упоминал JustBoo, ​​-z находится в экране).

если вы загружаете другой набор матриц, ничто не мешает вам перевернуть одну из координат в матрице, в результате получив левую систему. (или не переворачивать gluPerspective/glFrustum фактически переворачивает z координат). Есть некоторые практические вещи, которые следует иметь в виду при выполнении этого, например, порядок обмотки для отбраковки.