gluLook遇到了麻烦

时间:2012-01-10 23:26:52

标签: opengl lwjgl glu

我有一些代码沿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 个答案:

答案 0 :(得分:2)

事实上,经过测试,结果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);

从矩阵堆栈顶部检索当前矩阵