如何维护扫描表面的ARCore

问题描述

我想构建一个可以改变地板纹理的应用程序,我的想法是用我想要的纹理来修改白点扫描纹理。我尝试了这段代码,但是此刻它只改变了正在扫描的表面,因此当我移动手机时,它将失去以前的扫描。

如何维护扫描的表面,或以其他方式做我想做的事情?

class ShowModelActivity : AppCompatActivity() {    
   
    private lateinit var fragment: ArFragment
    private lateinit var renderableSource: RenderableSource
    private lateinit var path: Uri

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_show_model)

        val model = intent.getStringExtra(MODEL)
        val color1 = intent.getStringExtra(COLOR1)
        val color2 = intent.getStringExtra(COLOR2)
        setModel(model!!,color1!!,color2!!)

        setSupportActionBar(toolbar)
        supportActionBar?.setDisplayShowHomeEnabled(true)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)

        fragment = supportFragmentManager.findFragmentById(R.id.arFragment) as ArFragment
        fragment.setOnTapArPlaneListener { hitResult,plane,motionEvent ->
            createObject(hitResult.createAnchor())
        }

        //setPlaneTexture("floor_texture.png",fragment)
    }

    private fun setPlaneTexture(texturePath: String,fragment: ArFragment){
        val sampler: Texture.Sampler = Texture.Sampler.builder()
            .setMinFilter(Texture.Sampler.MinFilter.LINEAR_MIPMAP_LINEAR)
            .setMagFilter(Texture.Sampler.MagFilter.LINEAR)
            .setWrapModeR(Texture.Sampler.WrapMode.REPEAT)
            .setWrapModeS(Texture.Sampler.WrapMode.REPEAT)
            .setWrapModeT(Texture.Sampler.WrapMode.REPEAT)
            .build()

        Texture.builder().setSource {assets.open(texturePath)}
            .setSampler(sampler)
            .build().thenAccept { texture: Texture? ->
                fragment.arSceneView.planeRenderer.material
                    .thenAccept { material ->
                        material.setTexture(MATERIAL_TEXTURE,texture)
                        material.setFloat(MATERIAL_UV_SCALE,10f)
                    }
            }.exceptionally { ex: Throwable? ->
                Log.e("SHOW MODEL","Failed to read an asset file",ex)
                null
            }
    }

    private fun createObject(anchor: Anchor) {
        renderableSource = RenderableSource
            .builder()
            .setSource(this,path,RenderableSource.SourceType.GLB)
            .setRecenterMode(RenderableSource.RecenterMode.ROOT)
            .build()
        ModelRenderable
            .builder()
            .setSource(this,renderableSource)
            .setRegistryId(path)
            .build()
            .thenAccept(Consumer { modelRenderable: ModelRenderable ->
                placeModel(
                    modelRenderable,anchor
                )
            })
    }

    private fun placeModel(modelRenderable: ModelRenderable,anchor: Anchor) {
        val node = AnchorNode(anchor)
        val transformableNode = TransformableNode(fragment.transformationSystem)
        transformableNode.setParent(node)
        transformableNode.renderable = modelRenderable
        fragment.arSceneView.scene.addChild(node)
        transformableNode.select()
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...