Java libGDX三维阴影

Java libGDX三维阴影,java,3d,libgdx,shadow,Java,3d,Libgdx,Shadow,我正在使用libGDX,这是一个桌面项目 我有两个模型,一个是角色,另一个是地图,如下图所示: 我的问题是: 如何在地板上投射角色的阴影 正如你所见,角色没有阴影,因此环境光。我必须使用什么或如何实现这一点?我应该假装一个阴影还是有一个真实的方法来投射阴影 欢迎任何评论或建议。您可以使用以下代码: Environment environment; DirectionalShadowLight shadowLight; @Override public void show() { mo

我正在使用libGDX,这是一个桌面项目

我有两个模型,一个是角色,另一个是地图,如下图所示:

我的问题是:

如何在地板上投射角色的阴影

正如你所见,角色没有阴影,因此环境光。我必须使用什么或如何实现这一点?我应该假装一个阴影还是有一个真实的方法来投射阴影


欢迎任何评论或建议。

您可以使用以下代码:

Environment environment;
DirectionalShadowLight shadowLight;

@Override
public void show() {
    modelBatch = new ModelBatch(); 
    environment = new Environment();
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 1.0f, 1f, .6f, 1f));
    environment.add((shadowLight = new DirectionalShadowLight(1024, 1024, 60f, 60f, .1f, 50f))                  
                .set(1f, 1f, 1f, 40.0f, -35f, -35f));   
    environment.shadowMap = shadowLight; 

    shadowBatch = new ModelBatch(new DepthShaderProvider());
}

@Override
public void render(float delta) {
        //create shadow texture
        shadowLight.begin(Vector3.Zero, camera.direction);
        shadowBatch.begin(shadowLight.getCamera());

        shadowBatch.render(instances);

        shadowBatch.end();
        shadowLight.end();

        //render scene
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);


        modelBatch.begin(cam);      
        modelBatch.render(instances, environment);  //environment has shadowMap!
        modelBatch.end();
}

2015年的某个时候,一个更好的阴影系统被添加到libGDX测试床上,与@Nolesh的回答中提到的“实验性的,不要使用”的东西分开

代码是,所以您需要将其复制到您自己的项目中。作者realitix简要介绍了它的工作原理。注意,这里似乎没有一个完全可运行的示例,但是
ShadowSystem
接口的JavaDoc包含以下内容:

// Init system:
Array<ModelBatch> passBatches = new Array<ModelBatch>();
ModelBatch mainBatch;
ShadowSystem system = new XXXShadowSystem();
system.init();
for (int i = 0; i < system.getPassQuantity(); i++) {
    passBatches.add(new ModelBatch(system.getPassShaderProvider(i)));
}
mainBatch = new ModelBatch(system.getShaderProvider());

// Render scene with shadows:
system.begin(camera, instances);
system.update();
for (int i = 0; i < system.getPassQuantity(); i++) {
    system.begin(i);
    Camera camera;
    while ((camera = system.next()) != null) {
        passBatches.get(i).begin(camera);
        passBatches.get(i).render(instances, environment);
        passBatches.get(i).end();
    }
    camera = null;
    system.end(i);
}
system.end();

HdpiUtils.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

mainBatch.begin(cam);
mainBatch.render(instances, environment);
mainBatch.end();
//初始化系统:
数组passBatches=新数组();
ModelBatch mainBatch;
ShadowSystem=新的XXXShadowSystem();
system.init();
对于(int i=0;i

这不如有一个合适的阴影API好,但比从头开始实现整个过程要好。

通过提供
环境来渲染模型,并首先向环境添加
方向阴影灯。但是,这是一个实验类。不推荐使用ShadowMap和DirectionalShadowLight。我很想看到一个新的答案。这实际上是一个每晚发布的版本,可能会有所改变。不知道是否有合适的方法从平行光添加基本阴影。我最终通过渲染阴影来伪造灯光。谢谢@Thomas的回答,你测试过这个方法吗?对我来说,它不起作用:(你对此有任何更新吗?我使用过它,它确实起作用。但你可能需要做一些额外的腿部工作才能正确使用它,比如调整参数等等。以下是对我的具体情况有效的方法:
new RealisticShadowSystem(AABBNearFarAnalyzer(),FixedShadowMapAllocator(2048,4),BoundingSphereDirectionalAnalyzer(),FrustumLightFilter())
。您还需要将灯光添加到阴影系统中。但老实说,除了最琐碎的3D工作之外,我不会再使用libGDX。它对于2D来说很好,但3D API、功能和文档都很缺乏。是的,我知道,当我开始研究它时,它似乎是一个很好的工具,但现在我必须自己做一些事情,这是解决问题的方法o文档和维护方面存在碎片。除了Unity,你知道其他开发3D游戏的好框架吗(尤其是在Android中)?Godot的3D一直在进步,但到目前为止我只在2D上使用过它。Unreal也在Android上运行,但我一点经验都没有。我尝试过这个,替换了新的XXXShadowSystem()
使用@Thomas注释中的代码,但阴影被渲染为完全黑色。(它们应该由环境光照亮。其级别为0.4。)此外,它们有锯齿状边缘,可以通过提高阴影贴图分辨率(2048
)来缓解,一些阴影部分被剔除(离相机较近的部分被剔除,而离相机较远的部分不被剔除)。(这也可能取决于这些参数的设置。)@Nolesh(被接受的)回答对我来说很有效。