Где точки OpenGL по оси Z? - PullRequest
       3

Где точки OpenGL по оси Z?

12 голосов
/ 07 августа 2010

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

редактирование: Например:
http://img576.imageshack.us/img576/9234/triangles.jpg
Если + 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();

Ответы [ 4 ]

8 голосов
/ 07 августа 2010

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

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

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


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

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

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

5 голосов
/ 08 августа 2010

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

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

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

5 голосов
/ 07 августа 2010

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

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

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

Picture

Снимок сделан из Википедии .

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

1 голос
/ 07 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...