見出し画像

[visionOS] ARKitで検出した平面を可視化する


記事末尾に実機で動作するサンプルプロジェクトを添付しています。

公式チュートリアルのコード

visionOSにおけるARKitの平面検出については公式のチュートリアルがある。

こんな感じで、PlaneAnchorのclassificationを「テキストで」可視化するコードが載っている:

func updatePlane(_ anchor: PlaneAnchor) {
    if entityMap[anchor.id] == nil {
        // Add a new entity to represent this plane.
        let entity = ModelEntity(
            mesh: .generateText(anchor.classification.description)
        )
        
        entityMap[anchor.id] = entity
        rootEntity.addChild(entity)
    }
    
    entityMap[anchor.id]?.transform = Transform(matrix: anchor.originFromAnchorTransform)
}

なので、同ページに載ってる動画のような、平面を色付けして可視化するようなコードにはなっていない。

Apple Developer Documentationの "Placing content on detected planes" より

単に generatePlane すれば良いのでは?

検出した平面を可視化するには、シンプルに、ModelEntity のイニシャライザに渡すメッシュ(MeshResource型)として、generatePlane で生成した平面メッシュを渡せばよい。

let entity = ModelEntity(mesh: .generatePlane(width: anchor.geometry.extent.width, height: anchor.geometry.extent.height), materials: [material])

・・・のだが、実はこれだと実際の平面とオーバーレイした平面エンティティがずれる

Debug Visualizationメニューの "Surfaces" を有効化するとわかるのだが、

検出しているはずの平面(Debug Visualizationで可視化されているSurfaces)と、ModelEntityで表示している平面メッシュとがずれてしまう。

(スクショを載せられないが、試してみるとわかる)

正しくPlaneAnchorを可視化するには

ここから先は

1,377字 / 1ファイル

文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/