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

安卓端基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:05