Sceneform ARFragment垂直平面添加物体始终旋转问题求助
解决Sceneform垂直平面放置图像旋转异常问题
我懂你遇到的麻烦了——在垂直平面上放置的图像总是莫名其妙地旋转,但水平平面上完全正常。咱们来拆解下代码里的问题,然后给出修复方案。
问题根源
你当前使用setLookDirection(Vector3.up(), anchorUp)的方式并不适配垂直平面的朝向逻辑。垂直平面的up方向和世界空间的Y轴向上(Vector3.up())是垂直关系,直接这么设置会导致方向计算混乱,最终引发旋转异常。
修复后的代码
arFragment.setOnTapArPlaneListener { hitResult: HitResult, plane: Plane, motionEvent: MotionEvent -> if(!isOnceTapedOnSurface) { val anchor = hitResult.createAnchor() val anchorNode = AnchorNode(anchor) anchorNode.setParent(arFragment.arSceneView.scene) andy = TransformableNode(arFragment.transformationSystem) if(plane.type == Plane.Type.VERTICAL) { // 计算节点指向相机的水平方向,确保图像朝向用户且贴合垂直平面 val cameraPos = arFragment.arSceneView.scene.camera.worldPosition val nodePos = anchorNode.worldPosition // 忽略Y轴差异,只保留水平面上的朝向向量 val targetDirection = Vector3( cameraPos.x - nodePos.x, 0f, cameraPos.z - nodePos.z ).normalized() // 分别设置朝向和up方向,保证垂直平面的上下对齐 andy.lookDirection = targetDirection andy.up = anchorNode.up } andy.setParent(anchorNode) andy.renderable = andyRenderable andy.select() // arFragment.arSceneView.planeRenderer.isVisible = false isOnceTapedOnSurface = true } }
关键改动说明
- 不再强行用世界空间的向上方向作为参考,而是计算节点到相机的水平方向向量,让图像始终正面对准用户
- 单独设置
lookDirection和up属性,确保图像的上下方向和垂直平面的朝向保持一致,彻底避免旋转偏移
如果你的需求是让图像始终垂直于平面(不管用户视角),也可以直接用平面的法线方向来设置:
andy.setWorldDirection(plane.normal)
不过大多数场景下,让图像朝向用户的体验会更好。
内容的提问来源于stack exchange,提问作者Keval Shukla
相关产品推荐
相关产品推荐

