类似于HelloAR示例的Sceneform平面渲染
Sceneform plane rendering similar to the HelloAR sample
我试图用纹理覆盖检测到的平面的整个表面。使用 OpenGl(就像在 HelloAr sample) enables me do this like this screenshot . However i want to switch to Sceneform and i only could get something like this 中一样,通过关注 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);
});`
来自this,可能是你的纹理尺寸有点奇怪。
更改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);
});
您可以控制 material 上聚光灯的半径。要让聚光灯效果消失,可以把半径设大一点:
planeRenderer.getMaterial().thenAcceptBoth(trigrid, (material, texture) -> {
material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture);
material.setFloat(PlaneRenderer.MATERIAL_SPOTLIGHT_RADIUS,1000);
});
我找到了使用其他答案并将它们结合起来的解决方案。正确的平面渲染可以像下面这样完成。重要的一点是应该在每一帧调用此可渲染对象,否则 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);
});
});
我试图用纹理覆盖检测到的平面的整个表面。使用 OpenGl(就像在 HelloAr sample) enables me do this like this screenshot . However i want to switch to Sceneform and i only could get something like this 中一样,通过关注 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);
});`
来自this,可能是你的纹理尺寸有点奇怪。
更改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);
});
您可以控制 material 上聚光灯的半径。要让聚光灯效果消失,可以把半径设大一点:
planeRenderer.getMaterial().thenAcceptBoth(trigrid, (material, texture) -> {
material.setTexture(PlaneRenderer.MATERIAL_TEXTURE, texture);
material.setFloat(PlaneRenderer.MATERIAL_SPOTLIGHT_RADIUS,1000);
});
我找到了使用其他答案并将它们结合起来的解决方案。正确的平面渲染可以像下面这样完成。重要的一点是应该在每一帧调用此可渲染对象,否则 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);
});
});