Question

I have some code which draws a line along the x, y and z axes. My problem is that these lines are being clipped so that they are invisible near the origin:

clipped axes

This sounds like a far clipping plane issue, but I gave zFar=50 to gluPerspective, which should be plenty. Making it even larger doesn't seem to help. What else could be causing the clipping?

Here is my code:

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();
    }
}

Update - Removing glLoadIdentity(); after glMatrixMode(GL_MODELVIEW); gives the desired result, but I don't understand why. Isn't the default modelview matrix the identity matrix?

Update - I wrote a C version of the same code and it works as desired. Why the difference?

Was it helpful?

Solution

Indeed, after testing it, it turns out that glMatrixMode(GL_PROJECTION_MATRIX); should be glMatrixMode(GL_PROJECTION); instead.

So it seems that the modelview was active by default and glLoadIdentity() cleared the results of GLU.gluPerspective(50, width / (float) height, .1f, 50);

edit: Btw. in case you wonder what GL_PROJECTION_MATRIX is for, it's to retrieve the current matrix from the top of the matrix stack with glGetFloatv(GL_PROJECTION_MATRIX,output); or glGetDoublev(GL_PROJECTION_MATRIX,output);

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top