2

我试图用纹理覆盖检测到的平面的整个表面。使用 OpenGL(就像在HelloAr示例中一样)使我能够像这个屏幕截图一样执行此操作。但是我想切换到 Sceneform,我只能通过在 Github 中关注其他问题来获得类似的东西。这些是我目前用于纹理渲染的代码。总而言之,我不希望飞机上有这种聚光灯纹理。我想像我的第一个屏幕截图一样覆盖整个检测到的平面。你能提供一些关于我如何实现这一目标的信息吗?谢谢!

 Texture.Sampler sampler =
            Texture.Sampler.builder()
                    .setMagFilter(Texture.Sampler.MagFilter.LINEAR)
                    .setMinFilter(Texture.Sampler.MinFilter.LINEAR)
                    .setWrapMode(Texture.Sampler.WrapMode.REPEAT)
                    .build();

    CompletableFuture<Texture> trigrid = Texture.builder()
            .setSource(this, R.drawable.gray)
            .setSampler(sampler).build();

    PlaneRenderer planeRenderer = arSceneView.getPlaneRenderer();
    planeRenderer.getMaterial().thenAcceptBoth(trigrid, (material, texture) -> {
        material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture);
    });`
4

3 回答 3

2

我找到了使用其他答案并将它们结合起来的解决方案。正确的平面渲染可以像下面这样完成。重要的一点是应该在每一帧都调用这个可渲染对象,否则 ARCore 会覆盖它并且您看不到您想要的效果。这是解决我的问题的代码。

arSceneView.getScene().addOnUpdateListener(frameTime -> {
            PlaneRenderer planeRenderer = arSceneView.getPlaneRenderer();
            planeRenderer.getMaterial().thenAcceptBoth(trigrid, (material, texture) -> {
                material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture);
                material.setFloat(PlaneRenderer.MATERIAL_SPOTLIGHT_RADIUS, Float.MAX_VALUE);
            });

});
于 2018-08-17T08:46:38.307 回答
1

您可以控制聚光灯在材质上的半径。要使聚光灯效果消失,您可以将半径设置为较大的数字:

planeRenderer.getMaterial().thenAcceptBoth(trigrid, (material, texture) -> {
    material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture);
    material.setFloat(PlaneRenderer.MATERIAL_SPOTLIGHT_RADIUS,1000);
});
于 2018-08-10T14:40:26.080 回答
0

由此看来可能是你的纹理大小有点奇怪。

更改MATERIAL_UV_SCALE参数。此参数用于控制纹理的大小。

planeRenderer.getMaterial()
.thenAcceptBoth(trigrid, (material, texture) -> {
    material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture);
    material.setFloat2(PlaneRenderer.MATERIAL_UV_SCALE, 50.0f, 50.0f);

});
于 2018-08-10T08:35:28.150 回答