Я пытаюсь понять систему координат 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();
Последние 2 параметра glOrtho ссылка:
nearVal, farVal
Укажите расстояния до ближней и дальней плоскостей обрезания глубины. Эти значения отрицательны, если плоскость должна находиться позади зрителя.
Ближняя плоскость обтравки находится перед зрителем, а дальняя - позади. Это перевернет ось Z.
Итак, то, что выделяется для меня, - это функция glOrtho. У вас ближняя и дальняя плоскости обрезания находятся на расстоянии всего 100 единиц друг от друга. Это кажется очень маленьким. Вы действительно хотите, чтобы это было так? Это показано последними двумя параметрами в этой функции.
Также ваши объекты очень большие по отношению к этому маленькому фрусту. Объекты могут располагаться прямо перед камерой и загораживать другие объекты.
Я бы увеличил все параметры в вызове glOrtho. HTH
В правосторонней системе (OpenGL) отрицательный Z (-Z) должен быть направлен в экран. Положительный Y должен быть "вверх", а положительный X - вправо.
Похоже, это то, что вы описали, а это и есть правосторонняя система координат.
Возможно, это может помочь. http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf
Что мне не хватает?
В (области просмотра) левой системы x
указывает вправо, y
указывает вверх, z
указывает вперед (от зрителя).
Для правши x
указывает вправо, y
указывает вверх, z
указывает назад (к зрителю).
Изображение взято из википедии .
x
- большой палец, y
- указательный палец и z
- средний палец.
Все зависит от того, как вы рисуете.
Identity для просмотра модели и обычная gluPerspective для проекции будут ожидать, что входная система координат будет правой (как упоминалось JustBoo, -z находится на экране).
, однако, если вы загружаете другой набор матриц, ничто не мешает вам перевернуть одну из координат в матрице, что приведет к левосторонней системе. (или не flip. gluPerspective / glFrustum фактически переворачивает координаты z). При этом следует помнить о некоторых практических вещах, например о порядке намотки для отбраковки.