RealityKitで動画テクスチャを設定する


WWDC2020で Video materials が発表されました。こちらの動画 "What's new in RealityKit" で映像付きで解説されています。RealityKitでオブジェクトに動画を設定し再生できる新機能です。

この機能だけ試したくなりましたが、RealityKitで新規プロジェクト作成すると Experience.rcproject を読み込んで別シーンを表示する構成で簡単には試せません。そこでシンプルに平面を配置し動画を流すまでの部分を作成してみました。

AR空間に配置されたPlaneで自動的に動画を再生します。
ソースコードは こちら に置いています。

環境

  • Xcode 12.0 beta 2
  • iPadOS 14 beta
  • iPad Pro 11 inch (第2世代)

プロジェクト作成

今回は Content TechnologyRealityKit で、InterfaceStoryboardで作成しました。

video001.mp4 をプロジェクトに追加しておきます。

実装

ソース全体

ViewController.swift

import UIKit
import RealityKit
import AVFoundation

class ViewController: UIViewController {

    @IBOutlet private var arView: ARView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // ① Anchorの追加
        let anchor = AnchorEntity()
        arView.scene.anchors.append(anchor)

        // ② Playerの生成と動画再生
        let asset = AVURLAsset(url: Bundle.main.url(forResource: "video001", withExtension: "mp4")!)
        let playerItem = AVPlayerItem(asset: asset)
        let player = AVPlayer()
        player.replaceCurrentItem(with: playerItem)
        player.play()

        // ③ Plane生成とVideoMaterial設定
        let planeMesh = MeshResource.generatePlane(width: 0.8, height: 0.45)
        let material = VideoMaterial(avPlayer: player)
        let planeModel = ModelEntity(mesh: planeMesh, materials: [material])
        planeModel.position = SIMD3<Float>(0.0, 0.0, -1.0)
        anchor.addChild(planeModel)
    }
}

① Anchorの追加

ARViewに対してAnchorを追加。

② Playerの生成と動画再生

再生対象の動画からAVPlayerItemを生成。AVPlayerに設定しplay()で再生開始。

③ Plane生成とVideoMaterial設定

MeshResource.generatePlaneでPlaneを生成。数値は現実世界でメートルです。これにより「0.8m x 0.45m の横長の板」が生成されます。VideoMaterialを生成後、ModelEntityEntity生成。positionはzに-1.0を設定し「1メートル手前」を設定。anchorにaddChildで追加。

この状態で起動すると

無事再生されました!