You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:51:50