java—在给定照明位置的情况下,计算无限世界中特定瓷砖的灯光值

irlmq6kh  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(175)

我正在制作一个基于瓷砖的无限世界游戏(类似于notch的minicraft),我正在尝试实现光。以下是我使用的函数:
它需要的论据是世界本身,以及瓦片相对于世界坐标的位置

public static Vector.Vector3f calculateLight(World w, int worldx, int worldy){
        float tileLightValue = 0;
        float totalLights = 0;

        for(Light currentLight : BlockLighting.lights){ // for each light
            float currentLightXWorldPosition = currentLight.x;
            float currentLightYWorldPosition = currentLight.y;
            float distanceBetweenPoints = Core.MathFunctions.getDistance(
                    worldx,worldy,
                    currentLightXWorldPosition, currentLightYWorldPosition
            );

            if(distanceBetweenPoints < currentLight.range){
                tileLightValue += distanceBetweenPoints / 20.175f;
                totalLights += 1;
            }
        }

        float lig = Core.MathFunctions.fclamp(((tileLightValue * -2.4f) + (69.3f / 100)), 0 , 1);

        if(totalLights > 0){
            return new Vector.Vector3f(lig,lig,lig);
        }else{
            // If no lights, return 0 as to not change the ambient light.
            return new Vector.Vector3f(0,0,0);
        }
    }

然后通过获取此函数的灯光值,然后将其添加到基础灯光(环境光)中进行计算

...
Core.MathFunctions.fclamp(daylight + light, 0, 1)
...

并产生预期结果:

但当灯光相交时,我发现了一个小问题:

所以这必须是一个数学问题。因此,我希望有人能提供一个解决这个问题的方案,或修改我的代码,以发送给我在正确的方向,最好的方式来描述的功能是:
给出一个灯光点列表和一个瓷砖的位置。在一个无限的世界中计算出所述瓷砖的适当照明,这样当它被添加到世界的环境照明中时,它就会产生类似于terraria的照明效果。
请注意,显示环境光计算的代码(第二个代码块)或多或少是伪代码,实际代码使用vector3进行颜色计算,这样做很好,只是认为id将其剥离以减少混淆
edit:下面是一个jsfiddle,使用完全相同的代码来说明这个问题。所以你可以看到它,并修补它!
交互式js示例

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题