ГлупоНа беде - PullRequest
       38

ГлупоНа беде

1 голос
/ 11 января 2012

У меня есть некоторый код, который рисует линию вдоль осей x, y и z.Моя проблема заключается в том, что эти линии обрезаются так, что они невидимы рядом с источником:

clipped axes

Это звучит как проблема плоскости отсечения, но я дал zFar = 50 для gluPerspective, чего должно быть много.Кажется, что сделать его еще больше не поможет.Что еще может быть причиной отсечения?

Вот мой код:

import static org.lwjgl.opengl.GL11.*;

import org.lwjgl.opengl.*;
import org.lwjgl.util.glu.GLU;

public class Test {
    static int width = 300, height = 200;

    public static void main(String[] _) throws Exception {
        Display.setDisplayMode(new DisplayMode(width, height));
        Display.create();
        glClear(GL_COLOR_BUFFER_BIT);

        // projection matrix
        glMatrixMode(GL_PROJECTION_MATRIX);
        glLoadIdentity();
        GLU.gluPerspective(50, width / (float) height, .1f, 50);

        // modelview matrix
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        GLU.gluLookAt(
                .8f, .8f, .8f,
                0, 0, 0,
                0, 1, 0);

        // draw a line for each axis
        glBegin(GL_LINES);
            // x axis in red
            glColor3f(1, 0, 0);
            glVertex3i(0, 0, 0);
            glVertex3i(10, 0, 0);
            // y axis in green
            glColor3f(0, 1, 0);
            glVertex3i(0, 0, 0);
            glVertex3i(0, 10, 0);
            // z axis in blue
            glColor3f(0, 0, 1);
            glVertex3i(0, 0, 0);
            glVertex3i(0, 0, 10);
        glEnd();

        Display.update();

        // wait for a close event
        while (!Display.isCloseRequested()) {
            Thread.sleep(20);
            Display.processMessages();
        }
        Display.destroy();
    }
}

Обновление - Удаление glLoadIdentity(); после glMatrixMode(GL_MODELVIEW); дает желаемый результат, ноЯ не понимаю почему.Разве матрица вида модели по умолчанию не является матрицей идентичности?

Обновление - Я написал версию C того же кода, и она работает как нужно.Почему разница?

1 Ответ

2 голосов
/ 13 января 2012

Действительно, после тестирования выясняется, что вместо glMatrixMode(GL_PROJECTION_MATRIX); должно быть glMatrixMode(GL_PROJECTION);.

Так что, по-видимому, вид модели был активен по умолчанию, и glLoadIdentity() очистил результаты GLU.gluPerspective(50, width / (float) height, .1f, 50);

редактировать: кстати.в случае, если вам интересно, для чего используется GL_PROJECTION_MATRIX, это для извлечения текущей матрицы из верха стека матриц с помощью glGetFloatv(GL_PROJECTION_MATRIX,output); или glGetDoublev(GL_PROJECTION_MATRIX,output);

...