我是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
}
}
如果您想使某些东西跟随摄像机,则应创建一个自定义节点并更新其在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()
}
}