在Unity中基于HoloLens 2空间映射获取房间角落坐标
获取HoloLens 2空间映射房间角落坐标的可行方法
一、通过空间映射API直接提取顶点与角落
HoloLens的空间映射数据可借助Windows.Perception.Spatial和Windows.Graphics.Holographic系列API获取,核心逻辑是遍历空间网格顶点,筛选地面区域顶点后计算角落:
- 在UWP项目中,先实例化
SpatialSurfaceObserver,订阅表面更新事件; - 收到表面数据时,通过
SpatialSurfaceMesh获取顶点缓冲区(VertexPositions),这些顶点以世界空间坐标存储; - 过滤地面顶点:可通过Y值范围(比如Y在-0.1到0.1之间,需根据实际空间校准),或结合平面检测API提取地面平面的全部顶点;
- 对地面顶点集执行凸包计算,凸包顶点即为房间角落坐标。可使用MathNet.Numerics等第三方库实现凸包算法,或自行编写二维凸包逻辑(忽略Y值,仅处理X/Z平面坐标)。
示例代码片段(C#):
// 获取空间表面观察者 var observer = SpatialSurfaceObserver.GetDefault(); observer.SetBoundingVolume(SpatialBoundingVolume.FromBox(SpatialCoordinateSystem.GetDefault(), new BoundingBox(-5, -2, -5, 10, 4, 10))); observer.SurfaceChanged += async (s, e) => { foreach (var surfaceInfo in e.AddedSurfaces) { var mesh = await surfaceInfo.TryComputeLatestMeshAsync(SpatialSurfaceMeshOptions.Default); if (mesh != null) { // 读取顶点数据 var vertexBuffer = mesh.VertexPositions; var vertices = new List<Vector3>(); using (var reader = vertexBuffer.CreateReader()) { while (reader.HasLeft) { vertices.Add(reader.ReadVector3()); } } // 过滤地面顶点(示例范围,需自行调整) var floorVertices = vertices.Where(v => v.Y >= -0.1 && v.Y <= 0.1).Select(v => new Vector2(v.X, v.Z)).ToList(); // 计算凸包得到角落坐标 var convexHull = ComputeConvexHull(floorVertices); // 转换回3D坐标(Y设为0) var cornerPoints = convexHull.Select(p => new Vector3(p.X, 0, p.Y)).ToList(); } } };
二、从导出的3D模型中提取坐标
既然已能通过Windows Device Portal导出3D模型(多为.glb或.obj格式),可直接解析模型文件提取顶点:
- 用Blender打开导出的模型,进入编辑模式选中地面平面的所有顶点;
- 在右侧属性面板切换到「数据属性」,找到「顶点」选项,即可查看每个顶点的世界坐标;
- 手动记录或通过Blender Python脚本批量导出顶点坐标,再用凸包算法筛选角落。
Blender批量导出顶点坐标脚本示例:
import bpy import csv # 选中地面模型(替换为你的模型名称) obj = bpy.data.objects["GroundMesh"] bpy.context.view_layer.objects.active = obj bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_all(action='SELECT') # 获取选中顶点的世界坐标 vertices = [obj.matrix_world @ v.co for v in obj.data.vertices if v.select] # 导出到CSV文件 with open('floor_vertices.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['X', 'Y', 'Z']) for v in vertices: writer.writerow([v.x, v.y, v.z]) bpy.ops.object.mode_set(mode='OBJECT')
三、Windows Device Portal的进阶用法
若要通过Device Portal获取实时空间数据,可使用其REST API:
- 打开Device Portal,进入「Holographic」→「Spatial Mapping」页面,启用「Web Server」;
- 通过API端点
http://<hololens-ip>/api/holographic/spatialmapping/meshes获取所有空间网格的JSON数据,其中包含每个网格的顶点坐标; - 解析JSON中的
vertices字段,过滤地面顶点后计算角落。
内容的提问来源于stack exchange,提问作者Platinum Rose
相关产品推荐
相关产品推荐

