Java / box2DLights - 错误的灯光位置
Java / box2DLights - Wrong light position
我正在为一个项目使用 Libgdx,更准确地说是 Box2DLights。
我的问题如下:当我想放置一个新的 "PointLight" 时,它总是在屏幕的中央。如果我改变坐标,它不起作用。
在我的 "show()" 方法中:
Box2D.init();
world = new World(new Vector2(0, 0), true);
rh = new RayHandler(world);
rh.setAmbientLight(1.2f, 0.2f, 0.2f, 0.1f);
pl = new PointLight(rh, 100, new Color(1,1,1,1),(float) 0.5,0,0);
在我的 "render()" 方法中:
Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
world.step(delta, 8, 3);
renderer.begin(ShapeType.Filled);
for (SolarSystem ss : solarSystemList)
{
if(ss.getColor() <= 15) colorSS = Color.YELLOW;
else if(ss.getColor() > 15 && ss.getColor() < 31) colorSS = Color.ORANGE;
else if(ss.getColor() > 30 && ss.getColor() < 46) colorSS = Color.RED;
else if(ss.getColor() > 45) colorSS = Color.CYAN;
renderer.setColor(colorSS);
renderer.circle(ss.getMapX(), ss.getMapY(), ss.getSize() - 3);
}
renderer.end();
rh.updateAndRender();
结果:
现在,如果我尝试更改坐标:
pl = new PointLight(rh, 100, new Color(1,1,1,1),(float) 0.5, 50, 50);
...没有光了
你知道怎样才能把灯放在我想要的地方吗?
编辑:我的屏幕尺寸:宽度 - 860 像素/高度 - 645 像素
如果您的距离为 0.5
,并且您的光线照射在屏幕的一半以上,我只是假设 50, 50
的位置不适合该屏幕。只需尝试将您的位置更改为较小的值。 Maybe your coordinates do not represent pixels but other units as it is recommended for box2d.
编辑:因为我不了解您的整个 libgdx 应用程序,所以我建议您更深入地了解 Camera
、ViewPort
等。例如,box2dlights RayHandler
可以通过 setCombinedMatrix
获取您的相机。您可能还想将灯光与身体同步,将 box2d 世界与精灵同步。
如果 (1,1) 是右上角,(0,0) 是左下角,(0.5,0.5) 是屏幕中间,那么我建议这样做:
插入您想要的值并将其除以屏幕的宽度和高度,例如
( xPosition/Gdx.graphics.width, yPosition/Gdx.graphics.height )
更新:
抱歉,我没有看到 (0,0) 是中心,所以我建议您改用它:
width = Gdx.graphics.width;
height = Gdx.graphics.height;
((xPosition - width/2)/ width/2 , (yPosition - height/2)/ height/2)
更新 2:
我认为你犯了一点算术错误假设你的
width = 860 and your height = 645 正如你所说
这是等式:
x= ((xPosition - width/2)/ width/2)
y= (yPosition - height/2)/ height/2)
x = (50 - 860/2) / (860/2)
y = (50 - 645/2) / (645/2)
x = (50 - 430) / (430)
y = (50 - 322.5) / (322.5)
x = (50 - 430) / (430) = (-380) / (430)
y = (50 - 322.5) / (322.5) = (-272.5) / (322.5)
x = -0.88
y = -0.84
靠近 (-1,-1) 又名:左下角
希望对您有所帮助:)
我正在为一个项目使用 Libgdx,更准确地说是 Box2DLights。
我的问题如下:当我想放置一个新的 "PointLight" 时,它总是在屏幕的中央。如果我改变坐标,它不起作用。
在我的 "show()" 方法中:
Box2D.init();
world = new World(new Vector2(0, 0), true);
rh = new RayHandler(world);
rh.setAmbientLight(1.2f, 0.2f, 0.2f, 0.1f);
pl = new PointLight(rh, 100, new Color(1,1,1,1),(float) 0.5,0,0);
在我的 "render()" 方法中:
Gdx.gl.glClearColor(0f, 0f, 0f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
world.step(delta, 8, 3);
renderer.begin(ShapeType.Filled);
for (SolarSystem ss : solarSystemList)
{
if(ss.getColor() <= 15) colorSS = Color.YELLOW;
else if(ss.getColor() > 15 && ss.getColor() < 31) colorSS = Color.ORANGE;
else if(ss.getColor() > 30 && ss.getColor() < 46) colorSS = Color.RED;
else if(ss.getColor() > 45) colorSS = Color.CYAN;
renderer.setColor(colorSS);
renderer.circle(ss.getMapX(), ss.getMapY(), ss.getSize() - 3);
}
renderer.end();
rh.updateAndRender();
结果:
pl = new PointLight(rh, 100, new Color(1,1,1,1),(float) 0.5, 50, 50);
...没有光了
你知道怎样才能把灯放在我想要的地方吗?
编辑:我的屏幕尺寸:宽度 - 860 像素/高度 - 645 像素
如果您的距离为 0.5
,并且您的光线照射在屏幕的一半以上,我只是假设 50, 50
的位置不适合该屏幕。只需尝试将您的位置更改为较小的值。 Maybe your coordinates do not represent pixels but other units as it is recommended for box2d.
编辑:因为我不了解您的整个 libgdx 应用程序,所以我建议您更深入地了解 Camera
、ViewPort
等。例如,box2dlights RayHandler
可以通过 setCombinedMatrix
获取您的相机。您可能还想将灯光与身体同步,将 box2d 世界与精灵同步。
如果 (1,1) 是右上角,(0,0) 是左下角,(0.5,0.5) 是屏幕中间,那么我建议这样做: 插入您想要的值并将其除以屏幕的宽度和高度,例如
( xPosition/Gdx.graphics.width, yPosition/Gdx.graphics.height )
更新:
抱歉,我没有看到 (0,0) 是中心,所以我建议您改用它:
width = Gdx.graphics.width;
height = Gdx.graphics.height;
((xPosition - width/2)/ width/2 , (yPosition - height/2)/ height/2)
更新 2: 我认为你犯了一点算术错误假设你的
width = 860 and your height = 645 正如你所说
这是等式:
x= ((xPosition - width/2)/ width/2)
y= (yPosition - height/2)/ height/2)
x = (50 - 860/2) / (860/2)
y = (50 - 645/2) / (645/2)
x = (50 - 430) / (430)
y = (50 - 322.5) / (322.5)
x = (50 - 430) / (430) = (-380) / (430)
y = (50 - 322.5) / (322.5) = (-272.5) / (322.5)
x = -0.88
y = -0.84
靠近 (-1,-1) 又名:左下角
希望对您有所帮助:)