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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:45:45