Положение усеченного, происхождение и выбраковка - PullRequest
0 голосов
/ 05 марта 2012

Я пишу простую программу, которая использует перспективную проекцию, и у меня есть куча объектов, нарисованных на моей сцене.Для перспективного проецирования я использую следующий код:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluLookAt(eyePosX, eyePosY, eyePosZ, centerPosX, centerPosY, centerPosZ, 0.0, 1.0, 0.0);
glFrustum(frustumLeft,frustumRight,frustumBottom,frustumTop,frustumNear,frustumFar); 

Когда у меня есть объект, нарисованный с определенным смещением по оси X, которое не входит внутрь усеченного конуса, объект все еще нарисован, но вытянути не забракован усеченным.Каковы координаты 8 точек в пространстве XYZ относительно eyePosX / Y / Z и frustumLeft / Right / Bottom / Top / Near / Far?Как я могу сказать OpenGL выполнить отбраковку объектов, которые не находятся внутри усеченного конуса?

1 Ответ

0 голосов
/ 05 марта 2012

Для перспективной проекции я использую следующий код:

Есть две возможности. Во-первых, вы действительно не хотели делать то, что делает этот код. Во-вторых, вы действительно имели в виду это, но не до конца понимаете, что сделали.

Давайте рассмотрим первый. Матрица просмотра никогда не должна идти внутри матрицы GL_PROJECTION. Кроме того, матрица просмотра всегда приходит после матрицы проекции. Они всегда должны быть истинными , если вы не делаете что-то особенное.

Что приводит ко второму. Если вы действительно намереваетесь вращать и смещать постпроективное пространство, то вы не можете ожидать, что геометрия будет отбракована по отношению к усеченному контуру. Почему?

Потому что OpenGL не делает выборку усеченного конуса. Он отбрасывает против любых позиций вершин после T & L, которые вы предоставляете. Если вы поворачиваете вид за пределы усеченного конуса, то это то, что рисуется. OpenGL не рисует то, что не видно; если вы измените представление после проецирования так, чтобы вещи, которые не были видны теперь, были видны, тогда вы изменили то, что есть, а что нет.

...