【问题标题】:How can I create a transparent panel for shadows in sceneform?如何为场景形式的阴影创建透明面板?
【发布时间】:2020-12-05 12:56:02
【问题描述】:

我到处寻找,但没有找到答案。 这个想法是创建一个带有仅接收阴影的透明面板的节点。 我试过了

MaterialFactory.makeTransparentWithColor(context, new Color(255,255,255,0.2f))
.thenAccept(material -> {
            Vector3 size = new Vector3(5f,0.0001f,5f);
            Vector3 center = new Vector3(0f,-0.5f,0f);
            ModelRenderable floorRenderable = ShapeFactory.makeCube(size,center,material);
            floorNode.setRenderable(floorRenderable);
        })

MaterialFactory.makeTransparentWithTexture(context, texture)
        .thenAccept(material -> {
            Vector3 size = new Vector3(5f,0.0001f,5f);
            Vector3 center = new Vector3(0f,-0.5f,0f);
            ModelRenderable floorRenderable = ShapeFactory.makeCube(size,center,material);
            floorNode.setRenderable(floorRenderable);
        })

但我得到了一个不完全透明的对象。

谢谢

【问题讨论】:

  • Sceneform 自动处理阴影,每个 Renderable 都有可以使用的 isShadowReceiver/Caster 属性,这是需要阴影的特殊情况吗?
  • @mulan,由于我使用的是 augmentedImageDatabase,因此我不需要启用 config.setPlaneFindingMode()。另一方面,我没有可以投射阴影的平面,所以唯一的方法是添加一个带有透明渲染的节点。一种方法是使用 .sfb 格式的 3d 模型,但我不知道如何创建它
  • 你找到答案了吗?我遇到了同样的问题。
  • 此文档似乎暗示有一种方法可以创建透明阴影接收器,但不确定如何在代码中完成此操作:developers.google.com/sceneform/develop/…

标签: java android arcore sceneform


【解决方案1】:

在@RomainGuy 的帮助下,我得以完成这项工作。

首先,创建`.mat文件

material {
    name : GroundShadow,
    blending : transparent,
    shadingModel : unlit,
    shadowMultiplier : true
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = vec4(0.0, 0.0, 0.0, 0.5); // change 0.5 to change the strength of the shadow
    }
}

调整vec4的第四个参数,改变阴影的强度。

使用 Sceneform 使用的 Filament matc 版本编译 .mat 文件(在我的例子中,它是 Filament 1.45)。我不知道如何找到,所以我只是在这里尝试了各种版本的 Filament:https://github.com/google/filament/releases/

我最终需要这个文件:https://github.com/google/filament/releases/download/v1.4.5/filament-20200127-mac.tgz

将生成的 matc 文件放入您的 res/raw 包中,然后像这样使用它。如果matc 文件不兼容,您的应用将崩溃。这就是我通过反复试验发现哪个matc 是正确的:

val footprintSelectionVisualizer = FootprintSelectionVisualizer()
val transformationSystem = TransformationSystem(displayMetrics, footprintSelectionVisualizer)

Material.builder()
    .setSource(context, R.raw.sceneform_plane_shadow_material)
    .thenAccept { material ->

                    val size = Vector3(1f, 0.00001f, 1f)
                    val center = Vector3(0f, 0f, 0f)
                    val floorRenderable: ModelRenderable = ShapeFactory.makeCube(size, center, material)
                    floorRenderable.isShadowReceiver = true
                    floorRenderable.isShadowCaster = false
                    footprintSelectionVisualizer.footprintRenderable = floorRenderable

                    node.select()
                }

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2019-06-14
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2012-06-07
    • 2012-02-08
    相关资源
    最近更新 更多