Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL四边形在两侧可见吗?_Java_Opengl_Lwjgl - Fatal编程技术网

Java OpenGL四边形在两侧可见吗?

Java OpenGL四边形在两侧可见吗?,java,opengl,lwjgl,Java,Opengl,Lwjgl,我刚开始学习OpenGL,遇到了一个有趣的bug(可能是我的错误) 然而,我似乎不明白为什么我的脸在默认情况下被画在两边,而不是一个。下面是一些描述问题的屏幕截图 当我继续启用GL_CULL_FACE(因为它显然不是默认启用的,应该是这样),我的四边形会被渲染,但都在错误的一侧。这是因为我计算法线的方法吗 这是我计算法线的代码 public static Point3D calculateNormals(Point3D p1, Point3D p2, Point3D p3) { Po

我刚开始学习OpenGL,遇到了一个有趣的bug(可能是我的错误)

然而,我似乎不明白为什么我的脸在默认情况下被画在两边,而不是一个。下面是一些描述问题的屏幕截图

当我继续启用GL_CULL_FACE(因为它显然不是默认启用的,应该是这样),我的四边形会被渲染,但都在错误的一侧。这是因为我计算法线的方法吗

这是我计算法线的代码

public static Point3D calculateNormals(Point3D p1, Point3D p2, Point3D p3) {
    Point3D v1 = new Point3D(p2.getX() - p1.getX(), p2.getY() - p1.getY(), p2.getZ() - p1.getZ());
    Point3D v2 = new Point3D(p3.getX() - p1.getX(), p3.getY() - p1.getY(), p3.getZ() - p1.getZ());
    Point3D normal = new Point3D();
    normal.addX((v1.getY() * v2.getZ()) - (v1.getZ() - v2.getY()));
    normal.addY((v2.getZ() * v1.getX()) - (v2.getX() * v1.getZ()));
    normal.addZ((v1.getX() - v2.getY()) - (v1.getY() - v2.getX()));
    return normal;
}
注意:创建没有参数的Point3D会导致x、y和z都设置为0,因此可以使用addX、andY和addZ

我应该翻转我的正常计算吗

当我继续并启用GL_CULL_FACE时(因为它显然不是默认启用的,应该是这样的)

你什么意思<代码>GL_CULL_面默认情况下被禁用,具体取决于规范

决定什么是正面和什么是背面完全独立于您使用的法线,GL使用基本体的缠绕顺序(由您指定的顶点顺序定义)。默认情况下,如果面顶点(在屏幕空间中)的方向为逆时针方向,则该面被视为正面

您可以通过翻转每个基本体的缠绕来重新确定面方向,也可以使用将GL的顺序规则从
GL_CCW
更改为
GL_CW
(顺时针),或者您甚至可以使用来告诉OpenGL您要剔除正面而不是背面

无论您选择什么选项,我建议您确保场景中所有对象的缠绕顺序是一致的。原则上,可以为每个绘制调用切换顺序,但如果不是绝对必要,则应避免切换顺序。

GL\u CULL\u FACE(GL\u BACK)将剔除对象的背面。在做这件事之前,请记住glEnable(GL_CULL_FACE)。您可以随时重新启用和禁用剔除。有时,双面渲染(例如船上的帆)很重要