見出し画像

[visionOS] RealityKitコンテンツとのインタラクション

Appleの "Adding 3D content to your app" と題されたドキュメントに、visionOSにおけるコンテンツとのインタラクションの実装方法が解説されている:

RealityView内に設置した球体をタップするコードは次のようになる:

struct SphereView: View {
    @State private var scale = false


    var body: some View {
        RealityView { content in
            let model = ModelEntity(
                mesh: .generateSphere(radius: 0.1),
                materials: [SimpleMaterial(color: .white, isMetallic: true)])


            // Enable interactions on the entity.
            model.components.set(InputTargetComponent())
            model.components.set(CollisionComponent(shapes: [.generateSphere(radius: 0.1)]))
            content.add(model)
        } update: { content in
            if let model = content.entities.first {
                model.transform.scale = scale ? [1.2, 1.2, 1.2] : [1.0, 1.0, 1.0]
            }
        }
        .gesture(TapGesture().targetedToAnyEntity().onEnded { _ in
            scale.toggle()
        })
    }
}

visionOSのコードを読み慣れてないと複雑に見えるかもしれないが、「インタラクションに関連するコード」を除外してみると実は非常にシンプルで、

struct ContentView: View {

    var body: some View {
        VStack {
            RealityView { content in
                let model = ModelEntity(
                    mesh: .generateSphere(radius: 0.1),
                    materials: [SimpleMaterial(color: .white, isMetallic: true)])
                content.add(model)
            }
        }
    }
}

これで次のようにModelEntityの球体が表示される:

残りのコードはインタラクションを実現するためのコード。

球をタップすると大きさが変化する:

以下、インタラクションのために必要なコードをひとつひとつみていく。


ここから先は

4,695字

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

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

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