从空间曲面网格缓冲区读取顶点和索引

时间:2017-05-28 13:23:18

标签: c# uwp directx sharpdx hololens

我正在使用SharpDX(C#DirectX包装器)开发HoloLens UWP应用程序,我想处理设备生成的空间映射数据。

我设法得到一个Spatial​Surface​Mesh列表,其中包含描述环境的网格,它们有两个属性-TriangleIndices和VertexPositions-我有兴趣阅读。

问题在于它们是Spatial​Surface​Mesh​Buffer的实例,其中包含带有原始数据的IBuffer,以及ElementCount,Stride(每个元素的长度)和 DirectXPixelFormat,虽然这种格式最适合使用DirectX渲染网格,但我不知道如何读取顶点的坐标和索引的顺序以便在我的应用程序中使用它们。

我想我必须使用指定的Stride和Format以某种方式从IBuffer中读取数据,但我还没有找到任何关于如何操作的文档,任何线索?

1 个答案:

答案 0 :(得分:1)

根据this链接,IBuffer只是byte []的包装器,并且矢量(大部分时间)以x,y,z,w的顺序保存。可以通过查看Format类的Spatial​Surface​Mesh​Buffer属性找到格式(如果使用int16,float或其他任何内容)。此属性还定义值是以不同的顺序存储,还是需要其他转换才能获得正确的位置。

基本上你可以做类似的事情

using System.Runtime.InteropServices.WindowsRuntime;

Spatial​Surface​Mesh​Buffer surfaceMeshBuffer = ...
byte[] data = surfaceMeshBuffer.ToArray();
var vectors = new List<Vector4>();    

for(int i = 0; i < data.length; ) {
    float x  = System.BitConverter.ToSingle(data, i);
    i += sizeof(float) / 8;
    float y  = System.BitConverter.ToSingle(data, i);        
    i += sizeof(float) / 8;
    float z  = System.BitConverter.ToSingle(data, i);        
    i += sizeof(float) / 8;
    float w  = System.BitConverter.ToSingle(data, i);        
    i += sizeof(float) / 8; 

    vectors.Add(new Vector4(x, y, z, w));
}