我正在制作一个基于瓷砖的无限世界游戏(类似于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示例
暂无答案!
目前还没有任何答案,快来回答吧!