[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)
}
なので、同ページに載ってる動画のような、平面を色付けして可視化するようなコードにはなっていない。
単に 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を可視化するには
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/