[如何在摄像机移动时移动ar对象

问题描述 投票:0回答:1

我是AR Core的新手。我的用例是我想随着相机实时移动而移动ar核心对象,但很难做到这一点。

[如果可能,还请提供有关如何使用姿势和锚点的指南。就像我知道锚点是什么,目的是什么,但我如何在这里完成用例。

我尝试过,但是没有用

private var placed = false

private lateinit var mFragment: ArFragment

private var ringRenderable: ModelRenderable? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    mFragment = supportFragmentManager.findFragmentById(R.id.arFragment) as ArFragment

    initModel()
    mFragment.arSceneView.scene.addOnUpdateListener(this::onUpdateFrame)
}

private fun initModel() {
    ModelRenderable.builder()
        .setSource(this, R.raw.ring)
        .build().thenAccept {
            ringRenderable = it
        }
        .exceptionally {
            it.toToast(this)
        }
}

private fun onUpdateFrame(frameTime: FrameTime){
    val frame = mFragment.arSceneView.arFrame

    if (frame == null){
        return
    }

    if (frame.camera.trackingState== TrackingState.TRACKING && !placed){
        val pose = frame.camera.pose.compose(Pose.makeTranslation(0f,0f,0f))
        val anchor = mFragment.arSceneView.session?.createAnchor(pose)
        val anchorNode = AnchorNode(anchor)
        anchorNode.setParent(mFragment.arSceneView.scene)

        val ring: Node = Node()
        ring.setParent(anchorNode)
        ring.renderable = ringRenderable
        placed = true
    }

}
android kotlin augmented-reality arcore
1个回答
0
投票

如果您想使某些东西跟随摄像机,则应创建一个自定义节点并更新其在Node.onUpdate(FrameTime)中的位置。

将这个节点添加到场景并设置可渲染对象后,您应该在每个onUpdate()上对ArSceneView的中心执行一次hitTest并更新其位置。

这里是什么样子:

class Target(context: Context) : com.google.ar.sceneform.Node() {

    init {
        ModelRenderable.builder()
            .setSource(context, R.raw.ring)
            .build()
            .thenAccept { renderable = it }
    }

    override fun onUpdate(frameTime: FrameTime?) {
        super.onUpdate(frameTime)
        val ar = scene?.view as? ArSceneView ?: return
        val hitPose = ar.arFrame?.hitTest(ar.width * 0.5F, ar.height * 0.5F)?.firstOrNull { result ->
            result.trackable.let { it is Plane && it.isPoseInPolygon(result.hitPose) }
        }?.hitPose ?: return
        worldPosition = hitPose.translation()
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.