前回記事で紹介した、空間にメモを配置するアプリの制作で工夫した点を紹介します。
今回は「メモを置く場所(=平面)を検出する」についてです。
メモを置く場所(=平面)を検出する
RealityKit で平面を検出するために AnchorEntity を使用します。実際のコードは下記のようなもので、縦横方向のどちらの平面も検出し、壁、床、天井など物体の種類は関係なく検出する設定です。
let anchor = AnchorEntity(.plane([.any], classification: [.any], minimumBounds: [0.1, 0.1]), trackingMode: .once)
これで Vision Pro の視界の中央付近の平面が検出できるのですが、これだけだと細かい位置の調整ができません。そこで検出した平面上に視線検出用のオブジェクトを敷き詰めて、そのオブジェクトのタップイベントを検出して、細かい位置を取得します。
平面上に視線検出用オブジェクトを敷きつめる
視線検出用のオブジェクトを配置すると、先ほどの平面はこのようになります。若干明るく光るオブジェクトは視線の当たっている場所を示しています。
視線検出用オブジェクトのタップイベントで位置を特定
RealityView に gesture
を設定し、SpatialTapGesture
でタップジェスチャを取得します。
下記の擬似コードのようにしてオブジェクトにタップイベントを追加します。タップの回数は count
で設定できます。ダブルタップ、トリプルタップに個別の処理を設定することも可能です。
var body: some View {
RealityView { content in
:
:
.gesture(
SpatialTapGesture(count: 1).
.targetedToAnyEntity().
.onEnded { value in.
:
さて、以上で平面上のより細かい位置を取得して指定できるようになりました。どこに視線が当たっているか判別しやすいように hover
エフェクトを追加しています。
※ 当時は hover
エフェクトをカスタマイズできず視認性が良いとは言えませんでしたが、VisionOS 2.0 でエフェクトのカスタマイズがサポートされたようです。
次回、VisionOSの標準ウインドウや操作音など工夫した点を紹介します。