Где точки 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();
Ответы
Ответ 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 координат). Есть некоторые практические вещи, которые следует иметь в виду при выполнении этого, например, порядок обмотки для отбраковки.