在LWJGL中绘制Quad时我做错了什么?

时间:2012-06-25 03:31:08

标签: java opengl lwjgl

如果我将GL_QUADS切换到GL_TRIANGLES并删除最后一个点,则三角形呈现正常。 但是,将其更改回GL_QUADS并添加另一个点只会让我看到黑屏。那我该怎么办?

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;

public class Main {
public Main() {
    this.start();
}

private void start() {  
    try {
        Display.setDisplayMode(new DisplayMode(640,640));
        Display.setTitle("FPSTest");
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
    }
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(-10, 10, -10, 10, -1000, 1000);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    while (!Display.isCloseRequested()) {
        GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT|GL11.GL_COLOR_BUFFER_BIT);
        GL11.glRotatef(0, 1, 1, 1);
        GL11.glBegin(GL11.GL_QUADS);
//          GL11.glBegin(GL11.GL_TRIANGLES);
        {
            GL11.glColor3f(1.0f, 0.0f, 0.0f);
            GL11.glVertex3f(0.0f, 3.0f, 0.0f);
            GL11.glColor3f(0.0f, 1.0f, 0.0f);
            GL11.glVertex3f(0.0f, 0.0f, -3.0f);
            GL11.glColor3f(0.0f, 0.0f, 1.0f);
            GL11.glVertex3f(3.0f, 0.0f, 0.0f);
            GL11.glColor3f(0.0f, 1.0f, 0.0f);
            GL11.glVertex3f(0.0f, 0.0f, 3.0f);
        }
        GL11.glEnd();
        GL11.glLoadIdentity();
        Display.update();
    }

    Display.destroy();
}

public static void main(String[] argv) {
    new Main();
}

}

3 个答案:

答案 0 :(得分:2)

正如mgibsonbr所提到的,顶点是非共面的。他发布了一个很好的工具来帮助你。

这也可以帮到你。

如果四个顶点,有组件; 1< = n< = 4是共面的,然后是矩阵的行列式:

|x1  y1  z1  1|
|x2  y2  z2  1|
|x3  y3  z3  1|
|x4  y4  z4  1|

将为0。

答案 1 :(得分:1)

四边形的顶点必须是共面的。您指定的四个顶点不是,并且根据this,在这种情况下结果是未定义的(这可能是空白屏幕的原因)。

这是一个tool来帮助您找到平面方程,因此您可以选择共面的第4点。您的前3个点形成等式-9x -9y +9z + 27 = 0,因此合适点的一个示例是:

GL11.glVertex3f(2.0f, 2.0f, 1.0f);

答案 2 :(得分:0)

你也可以使用glBegin(GL_TRIANGLE_STRIP),所有三角形都是coplanar;)