前回、ついに『持ち上げる処理』の実装を全て見終えました。これまで見た処理はあくまで『持ち上げる』というだけの処理です。今回は、『持ち上げたものを離す』処理を最後まで見ていきます。赤の部分は『トリガーが離された時』に実行されています。この画像を更に黄色・オレンジに区切って詳細に見ていきます。『ユニットを持ち上げているコントローラ』と『トリガーを離したコントローラ』が同一かもチェックします。ユニットとリンクしている対象(コントローラの持つ持ち上げ関数)とのリンクを外します。Kinematic』で自由に動かせないようにします。前々回に登場した変数『wand_velocity』の値をセットしています。Velocity』ノードは引数のユニットのアクタに対して引数の分だけの速度を設定します。離した時点での加速度がそのままユニットの速度になっているということになります。ユニット自身の『Unlinked』イベントを実行しています。『持ち上げたものを離す』という処理はこのように実装されていました。一応、この先にもいくつか処理が残ってはいますが、『離す』処理はここで完了です。ここでの処理は『物を離した後、コントローラを可視状態にする』というものです。『コントローラを不可視にする』という実装がされています。この実装が行われています。ユニットそのものを引数で設定しているため、ユニット全体の可視・不可視を変更できています。今回も引き続き、『物を掴む処理』を見ていきます。次回を含め、覚えることが盛りだくさんです。画像の中の青い部分は前回にやった『物に触れている間の処理』です。基本的にいつも通りの入力(トリガー)を拾う処理の為、割愛します。コントローラのトリガーを引いた際にオレンジの部分の処理が行われます。ここでは、触れている物の状態をチェックし、『持ち上げることができるか』を判定しています。最初に、変数『wand_is_touching』の値で『Branch』ノードを実行しています。Trigger』の処理で何かに触れている時にTrueに変更されています。『何かに触れているか』をチェックしています。Objects』ノードで比較しています。Objects』ノードは、A・Bに渡された値が同じであるかどうかを返します。Dynamic』ノードの結果がTrueであるかという処理を行っています。Dynamic』ノードは、『Actor』に指定された物体が動的であるかどうかを返します。『持ち上げようとしている物体が動かせるものか』という確認になります。ここまでの処理で、『物体を持ち上げるまでの確認』が完了しました。今回からは、前回の最後に登場した『function_pickup』ユニットのユニットフローを見ていきます。『function_pickup』ユニットには『物を持ち上げる』という処理が実装されています。function_pickupユニットを見ていきましょう。アセットブラウザから『vr_steam』->『models』->『functionality_pickup』の中にあるユニットを開きましょう。画像の赤四角のようなアイコンはユニットフロー単体を表しています。ユニットフローを編集するための『FlowEditor』が開かれます。ユニットエディタを開く必要がない場合はこちらを開いてもいいかもしれません。して開かれた『functionality_pickup』のユニットフローが以下の画像です。非常に膨大な処理ではありますが、少しずつ進めていきます。今回、説明していく箇所は、以下の画像で赤・青・緑の枠の部分です。ここでは一番最初に行うべき『変数の設定』を行っています。以下の変数がここで設定されています。Update』にて常に行うべき処理が実装されています。その結果を変数『wand_current_frame_pos』に設定しています。変数『wand_current_frame_pos』は現在位置を表しています。前回から引き続き、今回もコントローラの内部処理(ユニットフロー)を見ていきます。今回はこの2つのグループの処理を見ていきます。このグループではコントローラが『一番最初に行うべき処理』が実装されています。Spawned』は『ユニットが生成されたタイミング』を表しています。この場合であれば『Viveコントローラが認識され、レベルに出てきたタイミング』です。Spawned』からは『Delay』ノードに繋がっています。Delayノードは引数に設定された時間だけ処理を止めるという処理です。先に実行されてしまうと、問題が発生する場合などに用いられます。ユニットを格納するための変数を作成します。変数名は前回にも触れたcontroller_indexに『wand_』という文字列を繋げた物です。Visibility』で最初は表示されたままだったボールを不可視にしています。いう初期化の処理をしています。このグループは、前回のトラックボールと同じように入力に関係した処理を行っています。基本的な入力の取得方法は前回と同じです。Button』になっています。この二つの違いは、入力を取得する対象が『トラックパッドの位置』か、それとも『それ以外のボタン入力』かという点のみです。Button』のValue値を乗算しています。これも前回と同じですね。計算する際には注意してください。ここでの乗算は-30ですが、これで最小値0、最大値-30の結果が得られます。前回は『Flow』による簡易的なプログラムを組んでみました。今回からは本格的な要素に入ります。非常に軽い建築デモ程度であればそのまま使えてしまえるような機能が最初から実装されています。それらの機能がどのように実装されているのか、少しずつ処理の解説を交えつつ、見ていきましょう。今回、見ていく処理は『コントローラの処理』になります。いくらレベルフローを見てみたとしても、コントローラの処理と思しきものはどこにもありません。コントローラの処理はコントローラ自身にあるためです。どこでコントローラ自身の処理が見られるのか、についてです。エディタの画面の下側にあるタブを見てみましょう。現在開いているプロジェクトの中にあるモデルや音などのアセットを見ることができます。この中に、コントローラのモデルがあります。『VR_steam』->『models』->『controller』を選択します。すると、コントローラのモデルが見つかるはずです。このモデルをダブルクリックしましょう。モデルをダブルクリックすると、画像のような画面が開かれます。この画面は『ユニットエディタ』といい、『ユニット』を編集する画面です。一つ一つがメッシュや各種プロパティを持っています。ユニットが所持するFlowは『ユニットフロー』と呼ばれます。ユニットフローの編集などを行うことができます。Flow』タブをクリックして開いてください。して開かれるのがユニットフローの画面です。細かな点や用途に違いはありますが、基本的な部分はレベルフローと変わりません。今回は、ここに実装されている処理の内容を調べていきましょう。複数のノードが一つのブロックに囲まれているのがわかるかと思います。一括で削除したり、移動したりできるようにする機能です。Flowの可読性を向上させるという事もできます。コントローラのユニットフローでは6つのグループがあります。この記事では、このうちの1つのグループの処理について調べていきます。このグループでは『トラックパッド上のボールの移動』が実装されています。指を触れている個所にボールが出現しているはずです。試しに、このグループを削除してからプレイしてみると、ボールが出現しなくなります。ちなみに、グループをまるごと削除するためには、グループのタイトルの部分をクリックしてからDeleteキーを入力します。簡易的な物であれば建築分野用のVRデモなどを実装することもできます。今回は、VR特化のノードについて、用途ごとに以下にまとめてみることにします。StingrayにはOculus/GoogleVR/GearVR用のノードもあります。どのHMDでも内容はほぼSteamVRと同一の為、割愛します。Vive』テンプレートを選択しないと、下記のノードが使用できません。処理を分岐させています。ボタンの割り当てはViveの公式ドキュメントを参考にしてください。『Released』はボタンから指を離した時にそれぞれ呼ばれます。『Value』は入力の状態を0~1の範囲で返します。(指を離している時が0、完全に押し込んだ時が1。以下はトリガーの入力の範囲をログに出力するサンプルです。画像のようにノードを接続しています。Right』までをより詳細にしたノードです。タッチパッドから指を離したときに呼ばれる『Untouched』が追加されています。X/Yは指先が触れている座標を中央を0として1~-1の範囲で返します。ちなみに、どちらも『SteamVR』->『Input』の中にあります。『Seconds』秒間の振動を与えます。強制的に0.003999に合わせられてしまいます。画像のように連続で呼ばれるような処理を作る必要があります。近年、VR/AR技術はゲーム業界のみならず、医療分野やその他の分野でも利用されるようになりました。VIVEコントローラーによる入力を伴ったビジュアライゼーションの現場で活用されています。液晶画面上に(内覧用の)モデルルームを表示したいとき、あるいは室内の家具の配置を考えるときに、VR/AR技術は有用です。以前より制作会社に蓄積されたCGアセットを活用でき、大幅な省力化が図れるからです。この点は、建築分野においてVR/AR技術が注目を集めている大きな理由です。通常、建築系のVRのコンテンツ開発にはゲームエンジンが用いられます。代表的なゲームエンジンとして、UnityやUnrealEngine4が挙げられます。ゲームエンジンとは文字通り、『ゲームを作るためのエンジン』です。(近頃は建築などゲーム以外の用途にも使われることも増えています。話は変わりますが、『Stingray』というゲームエンジンがあります。プログラマでない方にも親しみやすく、3D機能に非常に優れています。拡張性の高いシステムに、一目でわかるビジュアルスクリプティングが特徴です。上記の3Dデザインツールとの連携も容易というメリットがあります。UnityやUnrealEngineに比べると情報が少ないのが難点です。Stingrayそのもののヘルプページを除くと、Stingrayについての情報を見つけるのはかなり難しいと思います。数回に分けてStingrayについて、このブログに書いていくことにします。ビジュアルスクリプティングをメインに書いていく予定です。このページは上記のような方々を対象にしています。今回は、『Stingrayの起動』から、『VRテンプレートのプレイ』までを書いていきます。最初はプロジェクトの作成を行います。StingrayのランチャーからStingrayを起動します。起動直後の画面では、いくつかのテンプレートが表示されているはずです。このテンプレートの中から、使用したい物を選びます。Vive』のテンプレートを使用します。Vive』のテンプレートをクリックして、右下の『Create』ボタンをクリックしましょう。すると、下の画像にあるようなウィンドウが出て来ます。『Name』はプロジェクトの名前なので好きな名前にしましょう。『Directry』はファイルを保存する場所ですが、何かしらのこだわりがない限りはそのままで大丈夫です。設定が終わったら『Create』ボタンをクリックします。これで新規プロジェクトの作成は完了です。待つと、上の画像にあるような画面が表示されます。これがStingrayのメイン画面になります。手頃な価格になってきましたし、以前より気軽に試すことができる環境が整ってきました。安くはない買い物ですし、自分のPCで動作するかを事前に確認したいですよね。NvidiaとかGeForceとか何それ。Readyじゃないのといったところかと思います。Oculus!ツールをしっかり用意してくれています。各項目が動作に必要なスペックを満たしているかどうかを知らせてくれます。readyかどうか判定してくれて大変便利です。Riftを購入を検討中であればお持ちのPCで一度試してみられるのもいいかもしれません。推奨、最小スペックなどは下記のURLに記載があります。2017年4月14日この記事は以下のような方を対象としています。先に前回・前々回の記事を読んでから、この記事を読み始めていただきたいです。こんにちは、名残惜しいですが『パンチングゲーム制作』は今回で一旦の最終回です。