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
相关产品推荐
相关产品推荐

