Где точки ось z OpenGL?

Я пытаюсь понять систему координат 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();

12
задан majaen 7 August 2010 в 18:48
поделиться

4 ответа

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

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

Ближняя плоскость обтравки находится перед зрителем, а дальняя - позади. Это перевернет ось Z.

5
ответ дан 2 December 2019 в 18:17
поделиться

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

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

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


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

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

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

8
ответ дан 2 December 2019 в 18:17
поделиться

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

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

Для правши x указывает вправо, y указывает вверх, z указывает назад (к зрителю).

Picture

Изображение взято из википедии .

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

6
ответ дан 2 December 2019 в 18:17
поделиться

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

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

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

1
ответ дан 2 December 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: