Apple Engine

Apple, iPhone, iOS, その周辺のことについて

iPhone と Reality Composer で始める簡単 AR その25 - RealityKit とやりとりする通知 編

今回はトリガー / アクションの通知について。

本来、Reality Composer は AR アプリ用のリソース作成用のツールであり、
RealityKit と連携して AR アプリを作成するためにある。

AR アプリを作成する際、Reality Composer は .rcproject でファイルが保存され、ビルド時に .reality へ変換され内部のリソースとして実行される。

そのためコードからアクセスすると面倒なことがあるため、iOS アプリでよく使用されている通知という機能を使っている。

トリガーを説明しアクションの方はさらっと説明する。
いつか RealityKit の解説を書く機会があれば、アクションの通知もちゃんと書こうかなと。

 

RealityKit から Reality Composer のファイルが動くまでの流れ

Xcode 11 以降で ARKit のテンプレートを選択すると RealityKit のテンプレートが選択できる。
このテンプレートは Reality Composer のファイルで設定されている水平方向のアンカーから現実空間で認識後、立方体を表示するという簡単な AR 体験を行うというものだ。

Reality Composer のファイルを扱い AR 体験を行うということは、 まず RealityKit で ARView という UIView を継承したクラスを使いここに表示するための設定があり、
今までの ARKit でいう SceneKit の ARSCNView や SpriteKit の ARSKView と同じ様なものを使用する。

ARView から Reality Composer のファイルを使用する場合、以下の様なコードでファイルを読み込む。

let boxAnchor = try! Experience.loadBox()

 

Experience.rcproject というファイルで Box という名のシーンでのものを読み込んでおり、
SceneKit などとは異なり try を使用してファイルの有無を調べる。

.rcproject を抜いた Experience でファイルを読み、load を付加したローワーキャメルケースでのシーン名 loadBox() で読み込むことができる。
rcproject やシーンに空白文字がある場合は空白部を埋めて読み込む様になっている。

SceneKit ではリソースがあることが前提だったが、RealityKit では多くの try を使用した例外処理が多用されている。

 

通知の呼び出し方

通知のトリガーからの呼び出しは以下の様な感じ。
トリガーで設定した名称はローワーキャメルケースとなり空白は詰められる。

boxAnchor.notifications.トリガーで設定した名称.post()

 

アクションからの呼び出しは以下の様な形。

boxAnchor.actions.アクションで設定した名称.onAction = { _ in 
    ...
}

 

試してみる

今回はトリガーからの通知。

Xcode から「Augmented Reality App」を選択して、

f:id:x67x6fx74x6f:20200322105434p:plain

 

Language を Swift、Content Technology を RealityKit、
UserInterface を SWiftUI 設定しプロジェクトを作成。

f:id:x67x6fx74x6f:20200322105539p:plain

 

Experience.rcproject を開き、新規のビヘイビアで、 トリガーを通知、アクションを強調で反転を設定する。 今回はトリガーの通知の識別子を”TriggerFlip” と設定した。

f:id:x67x6fx74x6f:20200322105632p:plain

 

ContentView.swift を開き修正していく。
今回は ContentView 側で通知の操作を修正する。

そのため、カスタムで作成している VeiwContorller 側の rcproject を読み込む定数をグローバルでもアクセスできるようにしている。

struct ARViewContainer: UIViewRepresentable {

    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)
        let boxAnchor = try! Experience.loadBox()

        ...
    }
    ...
}
struct ARViewContainer: UIViewRepresentable {

let boxAnchor = try! Experience.loadBox()

    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)

        ...
    }
    ...
}

 

そして、SwiftUI が使用されている ContentView の修正をする。
ARViewContainer をグローバルで読み込める様に修正し、実行部分である Body で通知の部分を修正する。

struct ContentView : View {
    var body: some View {
        return ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}
struct ContentView : View {
    
    let arView = ARViewContainer()
    
    var body: some View {
        
        ZStack {
            
            arView.edgesIgnoringSafeArea(.all)
            
            Button(action:{
                self.arView.boxAnchor.notifications.triggerFlip.post()
            }){
                ...
            }
            
        }
        
    }
}

 

ビルドすると中央にボタンが現れ、タップすると立方体が跳ねる。

(今回、アニメーションが終わるままでボタンを押せない様にしていないため、連打すると立方体の位置がおかしくなる)

 

サンプルファイル

今回は Xcode のプロジェクトファイルのため注意

github.com

 

注意点

現状、どの段階で起きるか不明だが、複雑なアクションを設定していると、トリガーやアクションからの通知が上手く処理されないことがある。
原因不明。

 

まとめ

RealtiKit からアクションの通知による Reality Composer 操作や Reality Composer からアクションによる通知からの RealtiKit への呼び出しがわかったと思われる。
実は Reality Composer では操作できない機能が RealtiKit にはあるので試してみると良いかもしれない。

とりあえず、一通りの機能は紹介できたと思われる。
紹介し忘れているものがあったら随時追加してく。

iPhone と Reality Composer で始める簡単 AR その24 - 強調アクションによる様々なアニメーション 編

今回は忘れていた強調のアクションについて。

様々なアニメーションのプリセットとなるモーションタイプが用意されており、 以下のものがある。

  • ポップ
  • 点滅
  • バウンス
  • 反転
  • 浮遊
  • 揺れる
  • パルス
  • 回転

 

さらに上の 8 個にアニメーションに対してさらにスタイルという 3 つのアニメーションの種類がある。

  • 基本
  • 愉快
  • ワイルド

 

全合計で 24 種類になる。

 

プロパティ

プロパティは以下の4つ。

  • 影響を受けるオブジェクト
  • 継続時間
  • モーションタイプ
  • スタイル

f:id:x67x6fx74x6f:20200322080347j:plain

 

影響を受けるオブジェクトはこれまで通り、アニメーションするオブジェクトの選択。

継続時間ではスライダーの下に青丸があり、アニメーションスピードの目安となり、24 種類全てで位置が異なる。
リセットのボタンをタップすると青丸の位置に移動する。

モーションタイプとスタイルの項目は先に記載された通りで、これ以降動きの紹介。

 

アニメーションの種類

ポップ

f:id:x67x6fx74x6f:20200322080418g:plain

 

点滅

f:id:x67x6fx74x6f:20200322080449g:plain

 

バウンス

f:id:x67x6fx74x6f:20200322081019g:plain

 

反転

f:id:x67x6fx74x6f:20200322080512g:plain

 

浮遊

f:id:x67x6fx74x6f:20200322080546g:plain

 

揺れる

f:id:x67x6fx74x6f:20200322080721g:plain

 

パルス

f:id:x67x6fx74x6f:20200322080755g:plain

 

回転

f:id:x67x6fx74x6f:20200322080817g:plain    

サンプルファイル

下記のリンクに行き、右側の緑のボタン「Clone or download」からリポジトリをクローンするか zip をダウンロード。
Emphasize フォルダが今回のサンプル。

iPhone や iPadOS に Reality Composer がインストールされていれば、ダウンロードした zip を展開し rcproject を開いて中身を見ることができる。

github.com

 

まとめ

簡易なアニメーションをつける際には、こちらを使用してみるのも良いかもしれない。

次回は通知のトリガー / アクションについて

iPhone と Reality Composer で始める簡単 AR その23 - USDZ アニメーションとカメラを見る 編

今回は「USDZ アニメーション」と「カメラを見る」のアクションについて。

Reality Composer では USDZ で設定されているアニメーションを再生したり、 カメラに対してオブジェクトを振り向かせることができる。

注意点としては USDZ アニメーションは再生のみをサポートし、カメラを見るアニメーションをせず即振り向く様になっている。

今回はカメラに「カメラの近く」のトリガーも使用しているため併せて紹介する。

 

カメラの近くのプロパティ

影響を受けるオブジェクトの選択と、トリガー発動の有効範囲のが球となっており半径の距離が設定できる。

ビューポート上で半透明緑の球がトリガーの有効範囲として表示されるのでわかりやすいと思われる。

f:id:x67x6fx74x6f:20200322012426j:plain

 

また、カメラを向くのアクションは上部 AR ボタンをタップし、AR プレビューを使用しないと機能しないので注意。

 

USDZアニメーションのプロパティ

影響を受けるオブジェクトの選択、アニメーションの繰り返し回数、音関連と同じ様に動作中にトリガされた場合の3つが設定でき、継続時間は設定されている値が自動で割り当てられる。

f:id:x67x6fx74x6f:20200322012502j:plain

 

ちなみに USDZ にアニメーション設定がない場合は、アラートが出て設定することができない。

 

カメラを見るのプロパティ

影響を受けるオブジェクトの選択でオブジェクト選択してカメラに振り向かせることができる。
振り向く継続時間の設定ができるため、チラ見的な振る舞いも可能。

f:id:x67x6fx74x6f:20200322012513j:plain

 

また、向いている方向で以下の設定

  • 前面
  • 背面

f:id:x67x6fx74x6f:20200322012745j:plain

 

以下で回転方向の制限ができる

  • 自由
  • ピッチ
  • ヨー
  • ロール

f:id:x67x6fx74x6f:20200322012525j:plain

 

基本的にはデフォルトである前面とヨーでの回転しか使用しないと思われる。

常に背を向かせたいなら「背面」の方向設定。
回転軸に関係なく矢印などを自分に向かせたい場合や平面画像を必ず見せたい場合は「自由」の回転に設定すると良いだろう。

 

試してみる

今回も動作サンプルが複雑になってしまったので以下のサンプルファイルからダウンロード。

1つ目は 1m 以内に近づくと USDZ アニメーションとカメラを向くのグループがループ。

 

2つ目は、びっくりマークが表示され、USDZ アニメーションが4回行われその間だけカメラを向く。

 

サンプルファイル

下記のリンクに行き、右側の緑のボタン「Clone or download」からリポジトリをクローンするか zip をダウンロード。
USDZAnimationAndLookAtCamera フォルダが今回のサンプル。

iPhone や iPadOS に Reality Composer がインストールされていれば、ダウンロードした zip を展開し rcproject を開いて中身を見ることができる。

github.com

 

まとめ

USDZ アニメーションを使用することで、移動、回転、拡大縮小では行えない複雑なアニメーションが可能となり、
カメラへオブジェクトを振り向かせることによって、重要な表示必ず見れる様にしたり、キャラクターなどをこちら側に注視されることが可能になるため重要な機能であると思われる。

次回は強調のアクションによる様々なアニメーションについて。

iPhone と Reality Composer で始める簡単 AR その22 - シーンの切り替え 編

今回はシーンの切り替えについて。

Reality Composer ではアンカーの設定を持つ複数のシーンが設定できる。

シーンの切り替えを行う際には複数のシーンが必要であるため、
右上「...」の詳細から「シーンピッカー」を選択してウインドウを表示。

 

右上の「+」ボタンをタップすると新たなシーンが選択され、アンカーの選択が促される。
(iPadOS や macOS の場合は左上の「シーン」ボタンから「シーンピッカー」を表示する)

f:id:x67x6fx74x6f:20200322014606j:plain f:id:x67x6fx74x6f:20200322014617j:plain

 

「水平方向」から「水平方向」など同じアンカーを選択するとそのままシーンが遷移するだけだが、 他のアンカーが設定されているシーンに切り替える場合は、アンカーを探していることを促すコーティングオーバーレイが表示される。

例えば「水平方向」から「イメージ」のアンカーを持つシーンに切り替えた場合、シーンを遷移した後にイメージのアンカーで設定した画像を探すメッセージが出る。

また、シーンの切り替えはビヘイビアのアクション「シーンの切り替え」で遷移するシーンを選択する。

 

シーンの切り替えのプロパティ

シーンを選択する項目しかない。

何らかのユーザー操作のトリガーからこのアクションを呼び出す形になると思われる。

f:id:x67x6fx74x6f:20200322021641j:plain

 

試してみる

今回は設定する項目が少ないことと、動作サンプルが複雑になってしまったので以下のサンプルファイルからダウンロードし参照。

球をタップすると直進し水色の壁に当たるとシーンが切り替わる。

f:id:x67x6fx74x6f:20200322021729g:plain

 

サンプルファイル

下記のリンクに行き、右側の緑のボタン「Clone or download」からリポジトリをクローンするか zip をダウンロード。
ChangeScene フォルダが今回のサンプル。

iPhone や iPadOS に Reality Composer がインストールされていれば、ダウンロードした zip を展開し rcproject を開いて中身を見ることができる。

github.com

 

まとめ

Reality Composer からシーンの切り替えができることによって簡単なゲームの様なものが可能だと想像できると思われる。

次回はオブジェクトがカメラを見るアクションについて。

iPhone と Reality Composer で始める簡単 AR その21 - 音の再生 編

今回は音の再生について。

Reality Composer の音の再生するアクションに関しては以下の3つがある。

  • サウンドを再生
  • 環境音を再生
  • ミュージックを再生

 

「サウンドを再生」はオブジェクトベースの音響になっており、オブジェクトの位置から音が鳴る。
そのため、カメラからオブジェクトが遠ざかれば音が小さく、近づけば音が大きくなる。
用途的には短い効果音などを再生する様な形。

「環境音を再生」「ミュージックを再生」は位置に関係なく鳴るため BGM の様な音を再生する。
ちなみに自分はこの2つのアクションの振る舞いの違いがわからない。

一応、現状で確認している音声ファイルは caf、mp3、m4a の模様。
Apple Music の m4p ファイルは選択できない。

 

試してみる

今回は球を物理シミュレーションで球を落下させ、立方体に接触すると音が再生されるものをつくる。

 

アンカーを選択

新規作成から今回も水平方向のアンカーを選択する。

 

オブジェクトの設定。

上部の「+」ボタンから球体と立方体のオブジェクトを追加し以下を設定する。

 

Y軸を 50cm

f:id:x67x6fx74x6f:20200321055938j:plain

 

上の立方体

Y軸を 30cm、Z軸 -5cm

f:id:x67x6fx74x6f:20200321055945j:plain

 

下の立方体

Y軸を 5m、15cm

f:id:x67x6fx74x6f:20200321055948j:plain

 

また、球に関しては物理の「含める」有効にして、モーションタイプをダイナミックに設定する。

f:id:x67x6fx74x6f:20200321072417j:plain

 

ビヘイビアの設定

ビヘイビアから追加する。
今回はカスタムを選択し、トリガーで「衝突」、アクションで「サウンドを再生」を設定。

f:id:x67x6fx74x6f:20200321054043j:plain

f:id:x67x6fx74x6f:20200321054147j:plain

 

トリガー: 衝突

影響を受けるオブジェクトは球、衝突する対象は2つの立方体を選択する。
ちなみに、今回は影響を受けるオブジェクトと衝突する対象のオブジェクトが逆でも動作は変わらない。

f:id:x67x6fx74x6f:20200321060022j:plain

 

アクション: サウンドを再生

影響を受けるオブジェクトを球に設定し、オーディオクリップをコンテンツライブりから初期状態でインストールされている「パッピーチャイムの音01.caf」を選択する。

f:id:x67x6fx74x6f:20200321054312j:plain

 

画面上部の再生ボタンをタップすると球が落下し、立方体に接触すると音が再生する。

 

サウンドを再生の「動作中にトリガされた場合」の処理

「動作中にトリガされた場合」では以下の設定項目があり、初期値は「無視」となっている。

  • 無視
  • 再起動
  • 停止

f:id:x67x6fx74x6f:20200321073301p:plain

 

無視

続けてトリガーが発生しても再生が終わるまで音の再生の処理は無視される。
今回の場合、続け立方体に接触しても再生されない。

vimeo.com

 

再起動

続けてトリガーが発生された場合、音が停止され、最初から再生し直される。
今回の場合、続け立方体に接触すると再生が止まりまた再生される。

vimeo.com

 

停止

続けてトリガーが発生された場合、 今回の場合、立方体に接触すると再生し、次の立方体に接触すると止まる。
もし、さらにトリガーが動作するとサウンドが停止されているため再生される。

vimeo.com

 

環境音を再生、ミュージックを再生

設定値はボリュームとオーディオクリップの設定しかない。

f:id:x67x6fx74x6f:20200321080549p:plain

f:id:x67x6fx74x6f:20200321080608p:plain

 

サンプルファイル

下記のリンクに行き、右側の緑のボタン「Clone or download」からリポジトリをクローンするか zip をダウンロード。
Sound フォルダが今回のサンプルになる。

iPhone や iPadOS に Reality Composer がインストールされていれば、ダウンロードした zip を展開し rcproject を開いて中身を見ることができる。

github.com

 

まとめ

音の再生のアクションは2点あり、オブジェクトベースのものと一定のものが設定でき、動作中にトリガされた場合に処理が可能である。

次回はシーンの切り替えについて。

iPhone と Reality Composer で始める簡単 AR その20 - 物理アニメーション 力を加える編

今回は前回に引き続き物理アニメーションについて。

直線方向に力を加えるアクションがあり、トリガーの設定よっては Reality Composer や .reality を読み込んだ QuickLook のプレビューで物理シミュレーションを行った操作を行うことができる。

 

試してみる

アンカーを選択

新規作成から水平方向のアンカーを選択し、物理シミュレーションがわかりやすい様に球体のオブジェクト選択する。

今回はわかりやすい様にワープマーブルを選択。

f:id:x67x6fx74x6f:20200320233145j:plain

 

ビヘイビアの設定

今回はタップして「力を加える」アクションをつくる。
ビヘイビアにそのテンプレートがあるのでそれを選択。

 

テンプレートを選択し設定すると「タップ」のトリガーと「力を加える」のトリガーが追加される。

f:id:x67x6fx74x6f:20200320233228j:plain f:id:x67x6fx74x6f:20200320233232j:plain

 

「タップ」の「力を加える」の影響を受けるオブジェクトを 追加した球のオブジェクトに設定する。

 

オブジェクトに物理設定がされていない場合、アラートが出て「アップデート」をタップすると物理のダイナミックの設定が自動でされる。

f:id:x67x6fx74x6f:20200314232511j:plain

 

以上の設定を行い上部の再生ボタンを押し、
球のオブジェクトタップすると上方向へ跳ね上がる。

f:id:x67x6fx74x6f:20200321005348g:plain

 

「力を加える」のアクションについて

プロパティではベロシティしかない。

f:id:x67x6fx74x6f:20200320234103j:plain

デフォルト値は 18 km/h なっており 5m/s。

Reality Composer の空間の物理設定がパラメーターが正確にはわからないので正しいかは不明だが、
現実世界では大体、自転車の通常の走行や、人が速く走ったりするぐらいの速さ。

とりあえず、Reality Composer は 1 km/h にベロシティを設定すると動作が行われず、静止した状態になる。
(実は微妙に動いているのかもしれない)

 

また、ビューポートでは力を加える角度や Yaw 軸 (Y軸) 方向の回転を行うことができる。

f:id:x67x6fx74x6f:20200321005237g:plain

 

まとめ

「力を加える」アクションは移動や回転、オービットと同様にオブジェクトを動かすことができるアクションで、トリガーの設定によってはオブジェクトの操作をすることができる。

また、トリガーの「衝突」を使用するとオブジェクト同士の衝突を検知でき、さらに複雑な振る舞いを設定できる。

次回は音について。

iPhone と Reality Composer で始める簡単 AR その19 - 物理アニメーション 重力編

今回は物理アニメーションでのシーン全体での処理について。

Reality Composer や RealityKit でも SceneKit 同様に何もしなくてもシーン全体で物理アニメーションの処理がされている。

SceneKit ではカテゴリマスクなどの設定が必要だったが、Reality Composer のシーンでは重力加速度と地平の物理判定の設定しかないため、簡単に物理アニメーションの設定を行うことができる。

また、以前も書いたがオブジェクトでは物理アニメーション用の種類と判定用の素材と形しかなく覚えることが少ない。

 

試してみる

アンカーを選択

新規作成から水平方向のアンカーを選択し、立方体のオブジェクト選択。

f:id:x67x6fx74x6f:20200314020435p:plain  

画面右上の歯車のマークからプロパティを開き Y 軸を 20cm ぐらいに移動。

f:id:x67x6fx74x6f:20200314020508p:plain

 

物理設定から「含める」のスイッチをオンにして、モーションタイプを「ダイナミック」に変更。

f:id:x67x6fx74x6f:20200314020656p:plain

 

再生ボタンを押すとシーンの Y 軸 0 が物理判定となっているので、立方体が床にぶつかるような物理アニメーションがされる。

f:id:x67x6fx74x6f:20200314021542g:plain

 

オブジェクトのない空間をタップやクリックしプロパティを開き、下の「シーンの物理」の「衝突する」のチェックを外しシーンを再生すると、立方体は床にぶつからずそのまま落下し続ける。

f:id:x67x6fx74x6f:20200314021613p:plain

f:id:x67x6fx74x6f:20200314021628g:plain

 

立方体をコピーしサイズ調整で 200 %ぐらいに変更し少し下に移動。

コピーした立方体の物理設定から「含める」のスイッチをオンにして、モーションタイプを「固定」にすると空中に固定された物体となるので、そこで物理アニメーションが行われ上から落ちてきた立方体は止まることとなる。

f:id:x67x6fx74x6f:20200314022319g:plain

 

Reality Composer では Y 軸 0 が床の平面となり、床を元にシャドウマップまたはレイトレースの影が落ちる。
そのため「シーンの物理」の「衝突する」のチェックを外すことはあまりお薦めしない。

 

物理アニメーションが適応されたオブジェクトの素材

パラメーター的なものが存在しないため GIF で見てみる。
シーンの物理に関してはデフォルトのコンクリート。

弾み方と地面に接してからの動きが異なると思われる。

f:id:x67x6fx74x6f:20200314025728g:plain

 

設定できるものは以下のもの

  • コンクリート
  • プラスチック
  • 木材
  • ゴム

 

注意点

これまで紹介したビヘイビアのアニメーション強調と物理アニメーションは排他的存在となっている。
回転など設定したアニメーションが静止した場合に物理アニメーション開始されるので注意。

また、待機は影響を受けず、表示、非表示などは物理アニメーション時も実行されるので注意。

 

まとめ

シーン全体での物理アニメーションでは重力しかないため設定はかなり簡単だと思われる。

次回は物理アニメーションで使用できるアクション「力を加える」について