はじめに
こんにちは、プログラミングを始めて約3年のエンジニアのkeitaMaxです。
今回はポイントクラウドのサンプルアプリと、公式を見ながらARKitとかMetalとか、ついでにSwift UIとかをふんわりと理解していこうの②です。
前回の記事
下にあるサンプルアプリで色々学んでいきます。
ARDataProviderをみる
前回、点群情報をARDataProviderファイルのonNewARData()
に渡しているところで終わったので、この続きからみていこうと思います。
func onNewARData(arData: ARData) {
lastArData = arData
processLastArData()
}
lastArData
に取得したarData
を入れていました。
そのあとprocessLastArData
の関数をしています。
ここでcolorYContent.texture
とcolorCbCrContent.texture
にarData
を入れています。
processLastArData
colorYContent
はMetalTextureContent()
が初期の値として入っています。
フォーマットされた画像データを保持するリソース。
どうやら、画像データを保持するクラスのようです。
色の保存
colorYContent.texture = lastArData?.colorImage?.texture(withFormat: .r8Unorm, planeIndex: 0, addToCache: textureCache!)!
colorCbCrContent.texture = lastArData?.colorImage?.texture(withFormat: .rg8Unorm, planeIndex: 1, addToCache: textureCache!)!
この処理の解説として、
サンプル プロジェクトでは、GPU コードで各ポイントに色を付けているため、CPU 側は GPU で使用できるようにカメラ データをパッケージ化します。
と記載されています。
点群に色をつけるためのカメラデータを、GPUで使用できる形にして保存しているらしいです。
深度データの保存
if isUseSmoothedDepthForUpsampling {
depthContent.texture = lastArData?.depthSmoothImage?.texture(withFormat: .r32Float, planeIndex: 0, addToCache: textureCache!)!
confidenceContent.texture = lastArData?.confidenceSmoothImage?.texture(withFormat: .r8Unorm, planeIndex: 0, addToCache: textureCache!)!
} else {
depthContent.texture = lastArData?.depthImage?.texture(withFormat: .r32Float, planeIndex: 0, addToCache: textureCache!)!
confidenceContent.texture = lastArData?.confidenceImage?.texture(withFormat: .r8Unorm, planeIndex: 0, addToCache: textureCache!)!
}
この処理の解説として、
サンプル プロジェクトでは、GPU コードで各ポイントを配置するため、CPU 側は GPU で使用するために深度データを Metal テクスチャにパッケージ化します。
となっています。
点群データの深度データを保存しています。
その後、MTLCommandQueue
にいろいろな値を渡しています。
MTLCommandQueue
これらのバッファ内でコマンドを実行するために、特定のGPUデバイスにコマンドバッファを作成、送信、およびスケジュールするために使用するインスタンス。
GPU側に処理を渡すためのものらしいです。
MTLCommandQueue
に画像データと深度データを渡しています。
そして、最初に見た画面を表示しているファイルのMetalViewSample
のvar arProvider: ARProvider = ARProvider()
に戻ってくるのですが、そこで実際に点群を表示する処理に行っていそうです。
おわりに
今回はここまでにします。次回以降はこの続きからいこうと思います。
結構難しくて、なかなか理解できないですが、諦めずに色々見ていこうと思います。
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。(公式みて自分なりに理解しているだけなので、少しでも「ん?」と思うことがあったら教えていただけると助かります。)
最後まで読んでいただきありがとうございました!
参考文献