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

ARKit开发求助:如何为锚点添加Bounding Box而非实体网格盒子?

在RealityKit中实现ARView的Bounding Box(边框盒子)

方案1:线框材质快速实现

通过给ModelComponent设置支持线框的材质,将实心网格盒子转为线框样式的Bounding Box,这是最快捷的方式。

import RealityKit
import ARKit

// 在你的ARViewController中
let arView = ARView(frame: view.bounds)
view.addSubview(arView)

// 创建红色线框材质
let wireframeMat = UnlitMaterial(color: .red)
wireframeMat.wireframe = true

// 生成对应尺寸的立方体Mesh(可替换为目标物体的实际尺寸)
let boxMesh = MeshResource.generateBox(size: SIMD3<Float>(0.3, 0.3, 0.3))

// 创建边框实体
let boundingBoxEntity = Entity()
boundingBoxEntity.components.set(
    ModelComponent(mesh: boxMesh, materials: [wireframeMat])
)

// 添加到AR场景
arView.scene.addAnchor(boundingBoxEntity)

如果要匹配已有实体的包围盒尺寸,可通过目标实体的boundingBox属性获取参数:

// 假设targetEntity是你需要包裹的实体
let targetBounds = targetEntity.boundingBox
let boxMesh = MeshResource.generateBox(size: targetBounds.extents)
boundingBoxEntity.position = targetBounds.center
// 可将边框实体设为目标实体的子节点,实现跟随移动
targetEntity.addChild(boundingBoxEntity)

方案2:自定义纯线条边框

若需要更轻量化的仅含边缘线条的Bounding Box(12条立方体棱边),可手动构建Mesh资源:

// 生成仅含棱边的Mesh资源函数
func generateEdgeBoundingBox(size: SIMD3<Float>) -> MeshResource {
    let halfSize = size / 2
    // 立方体8个顶点坐标
    let vertices: [SIMD3<Float>] = [
        [-halfSize.x, -halfSize.y, -halfSize.z], [halfSize.x, -halfSize.y, -halfSize.z],
        [halfSize.x, halfSize.y, -halfSize.z], [-halfSize.x, halfSize.y, -halfSize.z],
        [-halfSize.x, -halfSize.y, halfSize.z], [halfSize.x, -halfSize.y, halfSize.z],
        [halfSize.x, halfSize.y, halfSize.z], [-halfSize.x, halfSize.y, halfSize.z]
    ]
    // 12条棱边的顶点索引对
    let edgeIndices: [UInt32] = [
        0,1, 1,2, 2,3, 3,0, // 底面四边
        4,5, 5,6, 6,7, 7,4, // 顶面四边
        0,4, 1,5, 2,6, 3,7  // 垂直连接边
    ]
    
    var meshDescriptor = MeshDescriptor()
    meshDescriptor.positions = MeshBuffers.Positions(vertices)
    meshDescriptor.primitives = .lines(indices: edgeIndices)
    
    return try! MeshResource.generate(from: [meshDescriptor])
}

// 使用示例
let edgeMat = UnlitMaterial(color: .blue)
let edgeBoxMesh = generateEdgeBoundingBox(size: SIMD3<Float>(0.4, 0.4, 0.4))
let edgeBoxEntity = Entity()
edgeBoxEntity.components.set(
    ModelComponent(mesh: edgeBoxMesh, materials: [edgeMat])
)
arView.scene.addAnchor(edgeBoxEntity)

关键提示

  • 若需边框跟随目标实体移动,将边框实体添加为目标实体的子节点即可,无需手动同步位置。
  • 线框材质的颜色、透明度可通过UnlitMaterial的属性调整,满足不同视觉需求。

内容的提问来源于stack exchange,提问作者AnhTuan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:50:35