3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【iOS】初心者が公式Sample AppをながらARKitとかMetalを理解する②

Posted at

はじめに

こんにちは、プログラミングを始めて約3年のエンジニアのkeitaMaxです。

今回はポイントクラウドのサンプルアプリと、公式を見ながらARKitとかMetalとか、ついでにSwift UIとかをふんわりと理解していこうの②です。

前回の記事

下にあるサンプルアプリで色々学んでいきます。

ARDataProviderをみる

前回、点群情報をARDataProviderファイルのonNewARData()に渡しているところで終わったので、この続きからみていこうと思います。

func onNewARData(arData: ARData) {
    lastArData = arData
    processLastArData()
}

lastArDataに取得したarDataを入れていました。

そのあとprocessLastArDataの関数をしています。

ここでcolorYContent.texturecolorCbCrContent.texturearDataを入れています。

processLastArData

colorYContentMetalTextureContent()が初期の値として入っています。

フォーマットされた画像データを保持するリソース。

どうやら、画像データを保持するクラスのようです。

色の保存

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に画像データと深度データを渡しています。

そして、最初に見た画面を表示しているファイルのMetalViewSamplevar arProvider: ARProvider = ARProvider()に戻ってくるのですが、そこで実際に点群を表示する処理に行っていそうです。

おわりに

今回はここまでにします。次回以降はこの続きからいこうと思います。

結構難しくて、なかなか理解できないですが、諦めずに色々見ていこうと思います。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。(公式みて自分なりに理解しているだけなので、少しでも「ん?」と思うことがあったら教えていただけると助かります。)

最後まで読んでいただきありがとうございました!

参考文献

次の記事

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?