Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 LWJGL照明设备工作不正常_Java_Opengl_Lwjgl_Lighting_Normals - Fatal编程技术网

Java LWJGL照明设备工作不正常

Java LWJGL照明设备工作不正常,java,opengl,lwjgl,lighting,normals,Java,Opengl,Lwjgl,Lighting,Normals,我正试图用Java将照明添加到我的LWJGL引擎中。 我使用了一个地球高度图来渲染地形,我想添加一个太阳/光源,但出于某种原因,可能是因为我弄乱了一些东西,灯光无法正常工作 这是一张地图的图片,我现在删除了大海,这样光线就更清晰了。 (这是imgur,因为它说我需要10个声誉才能发布图片) 黄色的东西是光源。正如你所看到的,有两条“阴影”线从两边出来,我不知道为什么。我猜法线是不正确的 这是靠近瓷砖的另一幅图像,我使用两个三角形在高度贴图上渲染一个像素。 您可以看到其中一个三角形确实“正确”

我正试图用Java将照明添加到我的LWJGL引擎中。 我使用了一个地球高度图来渲染地形,我想添加一个太阳/光源,但出于某种原因,可能是因为我弄乱了一些东西,灯光无法正常工作

这是一张地图的图片,我现在删除了大海,这样光线就更清晰了。 (这是imgur,因为它说我需要10个声誉才能发布图片)

黄色的东西是光源。正如你所看到的,有两条“阴影”线从两边出来,我不知道为什么。我猜法线是不正确的

这是靠近瓷砖的另一幅图像,我使用两个三角形在高度贴图上渲染一个像素。
您可以看到其中一个三角形确实“正确”渲染,但另一个没有,它们都是相同的灰色/绿色

加载高度贴图并创建平铺[]和法线[]的代码:

public void createMap(File heightmap) {

    try {
        BufferedImage image = ImageIO.read(heightmap);
        tiles = new float[image.getWidth()][image.getHeight()];
        normals = new Vector3f[image.getWidth()][image.getHeight()];
        int rgb;

        for(int x = 0; x < image.getWidth(); x++) {
            for(int y = 0; y < image.getHeight(); y++) {
                rgb = image.getRGB(x, y);
                tiles[x][y] = (rgb >> 16) & 0xff;

            }
        }
    } catch(Exception e) {
        e.printStackTrace();
    }

    for(int x = 0; x < tiles.length - 1; x++) {
        for(int z = 0; z < tiles[x].length - 1; z++) {
            try {
                Vector3f p1 = new Vector3f(x, tiles[x][z] * MODIFIER, z);
                Vector3f p2 = new Vector3f(x, tiles[x][z+1] * MODIFIER, z+1);
                Vector3f p3 = new Vector3f(x+1, tiles[x+1][z] * MODIFIER, z);
                normals[x][z] = UtilMath.getNormal(p1, p2, p3);
            } catch(Exception e) { e.printStackTrace(); }
            try {
                Vector3f p1 = new Vector3f(x+1, tiles[x+1][z+1] * MODIFIER, z+1);
                Vector3f p2 = new Vector3f(x, tiles[x][z+1] * MODIFIER, z+1);
                Vector3f p3 = new Vector3f(x+1, tiles[x+1][z] * MODIFIER, z);
                normals[x+1][z+1] = UtilMath.getNormal(p1, p2, p3);
            } catch(Exception e) { e.printStackTrace(); }
        }
    }
}
我知道我可能在正常情况下犯了一个错误


我希望你们中的任何人都知道我做错了什么,以及如何解决这两个问题。

我认为你们的正常计算是正确的,我对你们的构造循环感到困惑。您的createMap方法似乎只创建法线,这很好,但您为(x,z)和(x+1,z+1)创建法线,但使用(x++,z++)循环,因此(x+1,z+1)处的法线最终在下一个循环中被覆盖。每个平铺需要有两条法线,因此可以创建一个更大的二维阵列,或者创建两个阵列,一个用于“上部”三角形,另一个用于“下部”。我不确定这是否能解决您的问题,但请澄清/修改:)。大的黑色对角线条纹可能是由您的照明设置引起的。我确实使用createMap方法创建了瓷砖。这是顶部的双for循环。我试着像你说的那样创建两个数组。另外,我发现“较低”的三角形总是有照明问题的三角形。最上面的那个也行。但在地图的下面是另一条路。我猜下三角形的法线朝向错误的方向?无论如何,我已经上传了我的整个Map.java类。你可以在这里看到:我想问题可能是你的三角形的弯曲,我现在有点多云,但你的一个三角形似乎是逆时针的,一个是顺时针的。两个三角形都将绘制(如果禁用消隐),但法线将翻转。尝试将顺序反转为UtilMath.getNormal(p3、p2、p1);看看下面的三角形是否有效。若可行,重写代码,使三角形逆时针缠绕。
public void createDisplayList() {
    Random rand = new Random();

    int mapDisplayList = glGenLists(1);
    glNewList(mapDisplayList, GL_COMPILE);

    glPushMatrix();
    {

        for(int x = 0; x < tiles.length - 1; x++) {
            for(int z = 0; z < tiles[x].length - 1; z++) {
                glColor3f(0, 0.75f, 0);
                try {
                    glBegin(GL_TRIANGLES);
                    glNormal3f(normals[x][z].x, normals[x][z].y, normals[x][z].z);
                    glVertex3f(x, tiles[x][z] * MODIFIER, z);
                    glVertex3f(x, tiles[x][z+1] * MODIFIER, z+1);
                    glVertex3f(x+1, tiles[x+1][z] * MODIFIER, z);
                    glEnd();
                } catch(Exception e) { e.printStackTrace(); }
                try {
                    glBegin(GL_TRIANGLES);
                    glNormal3f(normals[x+1][z+1].x, normals[x+1][z+1].y, normals[x+1][z+1].z);
                    glVertex3f(x+1, tiles[x+1][z+1] * MODIFIER, z+1);
                    glVertex3f(x, tiles[x][z+1] * MODIFIER, z+1);
                    glVertex3f(x+1, tiles[x+1][z] * MODIFIER, z);
                    glEnd();
                } catch(Exception e) { e.printStackTrace(); }
            }
        }

    }
    glPopMatrix();

    glEndList();
}
public static Vector3f getNormal(Vector3f p1, Vector3f p2, Vector3f p3) {
    try {
        Vector3f normal = new Vector3f();

        Vector3f calU = new Vector3f(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z);
        Vector3f calV = new Vector3f(p3.x - p1.x, p3.y - p1.y, p3.z - p1.z);

        normal.setX(calU.y*calV.z - calU.z-calV.y);
        normal.setY(calU.z*calV.x - calU.x-calV.z);
        normal.setZ(calU.x*calV.y - calU.y-calV.x);

        return (Vector3f) normal.normalise();
    } catch(Exception e) {
        e.printStackTrace();
    }
    return null;
}