安卓端基于AR Core实现沿相机方向绘制线条的技术问询
AR场景动态跟随线条实现方案(以Android ARCore + AR Fragment为例)
1. 状态变量定义
首先定义全局状态管理变量:
isWaitingForSecondAnchor:布尔类型,标记是否已添加第一个锚点、正等待第二个锚点创建firstAnchorNode:节点类型,存储已添加的第一个锚点节点实例tempLineRenderer:线条渲染实例,存储当前逐帧更新的临时线段对象
第一个锚点添加完成后,将isWaitingForSecondAnchor赋值为true,同时把第一个锚点节点的引用存入firstAnchorNode,初始化临时线条并添加到场景中。
2. 逐帧更新跟随逻辑
借助AR Fragment提供的帧更新回调实现线条跟随相机中心移动:
arFragment.arSceneView.scene.addOnUpdateListener { // 未处于等待第二个锚点状态时直接跳过处理 if (!isWaitingForSecondAnchor || firstAnchorNode == null) return@addOnUpdateListener // 计算屏幕中心坐标对应的世界空间射线 val centerX = arFragment.arSceneView.width / 2f val centerY = arFragment.arSceneView.height / 2f val centerRay = arFragment.arSceneView.camera.screenPointToRay(centerX, centerY) // 取射线2米处的点作为临时终点,可根据业务需求调整距离 val tempEndPoint = centerRay.getPoint(2f) // 更新临时线条的两个端点坐标 tempLineRenderer?.setPoints(firstAnchorNode!!.worldPosition, tempEndPoint) }
线条渲染可直接使用ARCore封装的
LineRenderer组件,提前设置好线条宽度、颜色保证在场景中的可见性。
3. 第二个锚点添加完成后的终止处理
用户确认放置第二个锚点后执行以下逻辑:
fun onSecondAnchorPlaced(secondAnchorNode: AnchorNode) { // 关闭跟随状态 isWaitingForSecondAnchor = false // 移除场景中的临时跟随线条 tempLineRenderer?.let { arFragment.arSceneView.scene.removeChild(it) } // 绘制固定在两个锚点之间的永久线段 val permanentLine = LineRenderer().apply { setPoints(firstAnchorNode!!.worldPosition, secondAnchorNode.worldPosition) setStrokeWidth(0.02f) setColor(Color.RED) } arFragment.arSceneView.scene.addChild(permanentLine) // 按需重置状态,支持后续再次添加锚点连线 firstAnchorNode = null tempLineRenderer = null }
其他平台适配
如果是iOS端ARKit场景,逻辑完全一致,仅需把对应API替换为ARKit的帧回调session(_:didUpdate:)、以及中心坐标世界转换的hitTest方法即可。
内容的提问来源于stack exchange,提问作者Zcode Solutions
相关产品推荐
相关产品推荐

