Model I/Oフレームワークの、MDLMeshオブジェクトから頂点の情報を取得するのが面倒だったので、メモ。
参考:
Read vertex positions with Model I/O
https://gist.github.com/algal/8e31ce035af0aafebc3736661ae9e3cd
mdlMeshにMDLMeshオブジェクトの値が入っているとして、これをXcodeのデバッガ(LLDB)上で取得したい場合。
頂点の数を取得する。
デバッガ
po mdlMesh.vertexCount
// 出力結果:54
バッファのデータのstrideを確認する。
デバッガ
po mdlMesh.vertexDescriptor.layouts.filter {($0 as! MDLVertexBufferLayout).stride != 0}
// 出力結果:
// ▿ 1 element
// - 0 : <MDLVertexBufferLayout: 0x2824e4490 stride=32>
strideは32であることがわかった。
次のコードで、fromByteOffsetにオフセットを与えると頂点の情報が確認できる
n番目の要素を得たいときは、n * strideで取得できる。例えば2番目の要素を取得したいときは2*32を与える・
デバッガ
po mdlMesh.vertexBuffers.first!.map().bytes.load(fromByteOffset: 1*32, as: Float3.self)
// 出力結果:
// ▿ SIMD3<Float>(0.5, 0.5, 0.5)
// ▿ _storage : SIMD4Storage
// - _value : (Opaque Value)
2番目の頂点の座標は、x = 0.5, y = 0.5, z = 0.5であることがわかった。
最後に
NoteではiOS開発、とくにCoreML、ARKit、Metalなどについて定期的に発信しています。
https://note.com/tokyoyoshida
Twitterでも発信しています。
https://twitter.com/jugemjugemjugem