2017-05-28 1 views
0

Ich entwickle eine HoloLens UWP App mit SharpDX (ein C# DirectX Wrapper), und ich möchte die räumlichen Mapping-Daten verarbeiten, die vom Gerät erzeugt werden.Lesen von Scheitelpunkten und Indizes aus einem Spatial Surface Mesh Buffer

Ich habe es geschafft, eine Liste von Spatial​Surface​Mesh zu erhalten, die die Netze enthalten, die die Umgebung beschreiben, und sie haben zwei Eigenschaften - TriangleIndices und VertexPositions - die ich lesen möchte.

Das Problem ist, dass sie Instanzen Spatial​Surface​Mesh​Buffer, die einen Befehlspufferspeicher mit den Rohdaten enthalten, neben dem element, Stride (Länge jeden Elements), um einen DirectXPixelFormat, und während des Formats sind optimal für die Darstellung des Netzes unter Verwendung von DirectX Ich kann die Koordinaten der Scheitelpunkte und die Reihenfolge der Indizes nicht lesen, um sie in meiner App zu verwenden.

Ich denke, ich muss irgendwie die Daten aus dem IBuffer mit dem angegebenen Stride und Format lesen, aber ich konnte keine Dokumentation darüber finden, wie es geht, irgendeinen Hinweis?

Antwort

1

Nach this Link IBuffer ist nur ein Wrapper um Byte [] und die Vektoren werden (die meiste Zeit) in dieser Reihenfolge x, y, z, w gespeichert. Das Format (wenn int16, float oder was auch immer verwendet wird) kann durch einen Blick in die Format Eigenschaft der Spatial​Surface​Mesh​Buffer Klasse herausgefunden werden. Diese Eigenschaft definiert auch, ob die Werte in einer anderen Reihenfolge gespeichert werden oder ob zusätzliche Transformationen erforderlich sind, um die richtige Position zu erhalten.

Also im Grunde könnte man so etwas wie

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)); 
} 
tun
Verwandte Themen