Archive For The “HTC_VIVE” Category

Stingray(VRテンプレート)の持ち上げ処理を調べてみる
(離す処理)

By |

Stingray(VRテンプレート)の持ち上げ処理を調べてみる<br>(離す処理)

前回、ついに『持ち上げる処理』の実装を全て見終えました。 しかし、これまで見た処理はあくまで『持ち上げる』というだけの処理です。 今回は、『持ち上げたものを離す』処理を最後まで見ていきます。 ■ Un-link – Release 赤の部分は『トリガーが離された時』に実行されています。 画像だとやや見づらいので、 この画像を更に黄色・オレンジに区切って詳細に見ていきます。 ①離したコントローラがリンクされているかチェック まずは、持ち上げている状態かどうかを表す変数『is_linked』が true(持ち上げている状態)なのかをチェック、 『ユニットを持ち上げているコントローラ』と『トリガーを離したコントローラ』が同一かもチェックします。 ②コントローラとのリンクを外し、加速度を設定する 続いて、『SteamVR Unlink Node From Tracker』ノードで ユニットとリンクしている対象(コントローラの持つ持ち上げ関数)とのリンクを外します。 その後は『SteamVR Set Actor Kinematic』で自由に動かせないようにします。 直後の『Set Actor Velocity』ノードには 前々回に登場した変数『wand_velocity』の値をセットしています。 『Set Actor Velocity』ノードは引数のユニットのアクタに対して引数の分だけの速度を設定します。 変数『wand_velocity』はコントローラの持つ加速度を表しているため、 離した時点での加速度がそのままユニットの速度になっているということになります。 加速度の設定が終わったら変数『is_linked』をfalseに変更、 ユニット自身の『Unlinked』イベントを実行しています。 『持ち上げたものを離す』という処理はこのように実装されていました。 一応、この先にもいくつか処理が残ってはいますが、『離す』処理はここで完了です。 ■ Hide – Unhide the Controller ここでの処理は『物を離した後、コントローラを可視状態にする』というものです。 これはVRテンプレートのバットのユニットフローを見ないとわからないのですが、 一部のユニットは『linked』イベントの処理で 『コントローラを不可視にする』という実装がされています。 ここで可視状態にするという処理を行っていない場合、 バットを離した後でもコントローラが見えないままという問題が発生するため、 この実装が行われています。 ちなみに、ここで使用されている『Set Unit Visibility』は以前使用した時とは異なり、 ユニットそのものを引数で設定しているため、ユニット全体の可視・不可視を変更できています。…

Stingray(VRテンプレート)の持ち上げ処理を調べてみる
(持ち上げ編)

By |

Stingray(VRテンプレート)の持ち上げ処理を調べてみる<br>(持ち上げ編)

今回も引き続き、『物を掴む処理』を見ていきます。 次回を含め、覚えることが盛りだくさんです。 画像の中の青い部分は前回にやった『物に触れている間の処理』です。 緑の部分はまだ特に触れてはいませんが、 基本的にいつも通りの入力(トリガー)を拾う処理の為、割愛します。 ■ 状態のチェック コントローラのトリガーを引いた際にオレンジの部分の処理が行われます。 ここでは、触れている物の状態をチェックし、『持ち上げることができるか』を判定しています。 ◯ Is the Wand Touching an Object? 最初に、変数『wand_is_touching』の値で『Branch』ノードを実行しています。 この変数は前回の『Physics Trigger』の処理で何かに触れている時にTrueに変更されています。 つまり、『何かに触れているか』をチェックしています。 ◯ check for no pick up in unit data Trueならば今度は変数『touching_unit』の値が持つ『pick_up』のデータと『no』を 『Compare Objects』ノードで比較しています。 『Compare Objects』ノードは、A・Bに渡された値が同じであるかどうかを返します。 まとめると、ここでは 『触れているユニットが持つ持ち上げられる物体かどうかのデータを見て、その内容がnoであるかどうか』 をチェックしています。 ◯ Is the Actor Dynamic? 上記処理で等しくなかった(noではなかった)場合、 『Is Actor Dynamic』ノードの結果がTrueであるかという処理を行っています。 『Is Actor Dynamic』ノードは、『Actor』に指定された物体が動的であるかどうかを返します。 つまり、『持ち上げようとしている物体が動かせるものか』という確認になります。 ここまでの処理で、『物体を持ち上げるまでの確認』が完了しました。 ■ Attach the Object…

Stingray(VRテンプレート)の持ち上げ処理を調べてみる
(前準備編)

By |

Stingray(VRテンプレート)の持ち上げ処理を調べてみる<br>(前準備編)

今回からは、前回の最後に登場した『function_pickup』ユニットのユニットフローを見ていきます。 コントローラのユニットフローを見てもわかる通り、 『function_pickup』ユニットには『物を持ち上げる』という処理が実装されています。 早速、function_pickupユニットを見ていきましょう。 アセットブラウザから『vr_steam』->『models』->『functionality_pickup』の中にあるユニットを開きましょう。 なお、画像の赤四角のようなアイコンはユニットフロー単体を表しています。 こちらのアイコンをダブルクリックして開くとユニットエディタとは異なる ユニットフローを編集するための『FlowEditor』が開かれます。 ユニットフロー以外の要素がなく、 ユニットエディタを開く必要がない場合はこちらを開いてもいいかもしれません。 そうして開かれた『functionality_pickup』のユニットフローが以下の画像です。 非常に膨大な処理ではありますが、少しずつ進めていきます。 今回、説明していく箇所は、以下の画像で赤・青・緑の枠の部分です。 ■ 『Set Variables on Spawn』 青色の枠の箇所です。 『Unit Spawned』から始まっていることからわかるかもしれませんが、 ここでは一番最初に行うべき『変数の設定』を行っています。 以下の変数がここで設定されています。 ———————————————— スコープ:型:名前 ———————————————— ローカル:bool:touch_tracker:False ローカル:bool:laser_on:False ローカル:string:my_global_var:wand_extras_1 or 2 グローバル:unit:wand_extras_1 or 2:unit グローバル:bool:keep_my_rotation_and_position:True ———————————————— ■ 『Wand Velocity』 赤色の枠の箇所です。 『Level Update』にて常に行うべき処理が実装されています。 『Get Unit World Position』を使用して自分のワールド座標を取得し、 その結果を変数『wand_current_frame_pos』に設定しています。 変数『wand_current_frame_pos』は現在位置を表しています。 この部分では変数『wand_current_frame_pos』から 変数『wand_last_frame_pos』の値を減算した値に 『Get Last Delta Time』で取得した時間を除算、 その結果をユニットが持つスクリプトデータの『wand_velocity』と…

Stingray(VRテンプレート)のコントローラ処理を調べてみる
(リンクとスポーン)

By |

Stingray(VRテンプレート)のコントローラ処理を調べてみる<br>(リンクとスポーン)

前々回、前回と続いてきた StingrayVRテンプレートにおけるコントローラの実装調査ですが、 いよいよ今回で最後です。 最後ということで、キーになることも多いです。 ただし、ここで覚えることが StingrayにおけるVR開発において最も重要なことになります。 最後はこの3つのグループになりますが、 実際は右2つのグループB,Cは左のグループAに繋がっているので、 大きな1つのグループと見ることができます。 一見ややこしいように見えますが、処理の内容自体はシンプルです。 ※『link controllers』 画像内のグループAで、ここでの処理が終わると、 下で説明している2つのグループB,Cへと続きます。 ①外部イベントの作成 ここの処理の始まりとなっているのは『External In Event』です。 このノードは独自にイベントを作ることができ、 外部からこのイベントが呼ばれた際に以後の処理が呼ばれるようになります。 (UnrealEngine4のカスタムイベントなどが近いです) つまり、 『ここより後の処理はコントローラのユニットフロー単体では動作せず、 外部よりこのイベント(link_controller)が呼ばれた時にのみ実行される』 という事になります。 ちなみに、このVRテンプレートの場合、link_controllerの呼び出し元は 『steam_vr』という名前のLuaスクリプトになります。 それ以外でも『Level Unit』などのノードからも呼び出すことができます。 ②ユニットとコントローラのリンク 続いては『SteamVR Link Node To Tracker』ノードです。 このノードは『Link to』に設定されたHMDやコントローラの位置に 引数に指定したユニットのメッシュをリンクさせる(くっつける)処理です。 これまで、何気なくVR画面でコントローラを動かしていましたが、 VR画面でコントローラが見えていたのはこの処理があったおかげだったのです。 この先ではグループB,グループCに処理が分かれますが、 『どちらかを行う』などではなく、両方の処理を行います。 ※『Spawn Pickup Unit to get the Pickup Functionality』 画像内のグループBです。 ここでは『物を持ち上げる為の前準備』を行っています。 ①スクリプトデータをチェック 最初は『Branch』ノードが実行されます。 『Branch』ノードは引数として受け取ったbool型の結果によって…

Stingray(VRテンプレート)のコントローラ処理を調べてみる
(初期化とトリガー)

By |

Stingray(VRテンプレート)のコントローラ処理を調べてみる<br>(初期化とトリガー)

前回から引き続き、今回もコントローラの内部処理(ユニットフロー)を見ていきます。 今回はこの2つのグループの処理を見ていきます。 ※『Create Unit Variable on Spawn – wand_1 or wand_2』 このグループではコントローラが『一番最初に行うべき処理』が実装されています。 ①スポーン直後に待機する 処理の開始位置となっている『Unit Spawned』は『ユニットが生成されたタイミング』を表しています。 この場合であれば『Viveコントローラが認識され、レベルに出てきたタイミング』です。 『Unit Spawned』からは『Delay』ノードに繋がっています。 Delayノードは引数に設定された時間だけ処理を止めるという処理です。 無くてもいいと感じるかもしれませんが、 この先のフローが何らかの形で本来先に実行される処理よりも 先に実行されてしまうと、問題が発生する場合などに用いられます。 ②ユニット変数を作成 続いて実行される『Set Unit Variable』で ユニットを格納するための変数を作成します。 変数名は前回にも触れたcontroller_indexに『wand_』という文字列を繋げた物です。 ③ボールを不可視に 最後は『Set Unit Visibility』で最初は表示されたままだったボールを不可視にしています。 つまり、ここでは 『一番最初に、コントローラによってユニットに 識別用に異なる名前を付け、トラックパッド上のボールを不可視にする』 という初期化の処理をしています。 ※『pull trigger』 このグループは、前回のトラックボールと同じように入力に関係した処理を行っています。 ①トリガーの入力を取得する 基本的な入力の取得方法は前回と同じです。 ただし、今回は使用するノードが『SteamVR Touch』ではなく、『SteamVR Button』になっています。 この二つの違いは、入力を取得する対象が『トラックパッドの位置』か、それとも『それ以外のボタン入力』かという点のみです。 (一応Buttonの方でもトラックパッドの入力は取得できますが、位置までは拾えません) ②トリガーの入力を基に回転値の計算 続いて、『SteamVR Button』のValue値を乗算しています。 これも前回と同じですね。 ただし、『SteamVR Button』の入力範囲は0~1なので、 計算する際には注意してください。 (Touchの場合はX/Yそれぞれ-1~1の範囲) ここでの乗算は-30ですが、これで最小値0、最大値-30の結果が得られます。…

Stingray(VRテンプレート)のコントローラ処理を調べてみる
(トラックパッドとユニットフロー)

By |

Stingray(VRテンプレート)のコントローラ処理を調べてみる<br>(トラックパッドとユニットフロー)

前回は『Flow』による簡易的なプログラムを組んでみました。 今回からは本格的な要素に入ります。 StingrayのVRテンプレートでは 非常に軽い建築デモ程度であればそのまま使えてしまえるような機能が最初から実装されています。 それらの機能がどのように実装されているのか、少しずつ処理の解説を交えつつ、見ていきましょう。 今回、見ていく処理は『コントローラの処理』になります。 さて、前回ではFlowの一種である『レベルフロー』を見ていきましたが、 いくらレベルフローを見てみたとしても、コントローラの処理と思しきものはどこにもありません。 なぜなら、コントローラの処理はコントローラ自身にあるためです。 まずは、どこでコントローラ自身の処理が見られるのか、についてです。 エディタの画面の下側にあるタブを見てみましょう。 これは『アセットブラウザ』と呼ばれ、 現在開いているプロジェクトの中にあるモデルや音などのアセットを見ることができます。 この中に、コントローラのモデルがあります。 アセットブラウザの左側にあるリストから 『VR_steam』->『models』->『controller』を選択します。 すると、コントローラのモデルが見つかるはずです。 このモデルをダブルクリックしましょう。 ※ユニットエディタとユニット モデルをダブルクリックすると、画像のような画面が開かれます。 この画面は『ユニットエディタ』といい、『ユニット』を編集する画面です。 『ユニット』とは、レベルに配置されるものの名前であり、 一つ一つがメッシュや各種プロパティを持っています。 また、ユニット自身がFlowを持つこともでき、 ユニットが所持するFlowは『ユニットフロー』と呼ばれます。 そして、ユニットエディタではユニットのプロパティの変更や、 ユニットフローの編集などを行うことができます。 画面の下側にある『Unit Flow』タブをクリックして開いてください。 こうして開かれるのがユニットフローの画面です。 細かな点や用途に違いはありますが、基本的な部分はレベルフローと変わりません。 今回は、ここに実装されている処理の内容を調べていきましょう。 コントローラのユニットフローを見てみると、 複数のノードが一つのブロックに囲まれているのがわかるかと思います。 これは『グループ化』といい、いくつかのノードを一つのグループにまとめ、 一括で削除したり、移動したりできるようにする機能です。 また、グループには名前を付けることができ、 Flowの可読性を向上させるという事もできます。 コントローラのユニットフローでは6つのグループがあります。 この記事では、このうちの1つのグループの処理について調べていきます。 ※『Tracking dot on the track pad.』 このグループでは『トラックパッド上のボールの移動』が実装されています。 プレイ中、コントローラを見てみるとトラックパッドを操作している間、 指を触れている個所にボールが出現しているはずです。 試しに、このグループを削除してからプレイしてみると、ボールが出現しなくなります。 ちなみに、グループをまるごと削除するためには、グループのタイトルの部分をクリックしてからDeleteキーを入力します。 ①トラックパッドの入力を取得 『Get Unit String…

StingrayVRテンプレートのVR向けノードをまとめてみた

By |

StingrayVRテンプレートのVR向けノードをまとめてみた

Stingrayのビジュアルスクリプティング機能、『Flow』では、 最初のテンプレートの選択によってVRに特化したノードを使用することができるため、 簡易的な物であれば建築分野用のVRデモなどを実装することもできます。 今回は、VR特化のノードについて、用途ごとに以下にまとめてみることにします。 ちなみにSteamVR(HTC Vive)用のノードを例にして挙げていますが、 StingrayにはOculus/GoogleVR/GearVR用のノードもあります。 ただし、どのHMDでも内容はほぼSteamVRと同一の為、割愛します。 最初に注意点ですが、 VR用ノードはStingrayのVRテンプレート実行時に同時に作成されるという仕様のため、 プロジェクト作成時に『VR HTC Vive』テンプレートを選択しないと、下記のノードが使用できません。 (使用するHMDによってテンプレートを選択してください) ※Viveコントローラの入力を取得したい ・SteamVR Button このノードはUpdateピンに接続されたタイミングで 『Controller Index』に設定されたコントローラの 『Button Name』に設定されているボタンが押されたかどうかを取得し、 処理を分岐させています。 ボタンの割り当てはViveの公式ドキュメントを参考にしてください。 (尚、システムボタンだけどういうわけか反応がありませんでした) 『Pressed』は最初にボタンが押された時、 『Held』はボタンを押し続けている時、 『Released』はボタンから指を離した時にそれぞれ呼ばれます。 『Value』は入力の状態を0~1の範囲で返します。 (指を離している時が0、完全に押し込んだ時が1。) 以下はトリガーの入力の範囲をログに出力するサンプルです。 画像のようにノードを接続しています。 ・SteamVR Touch こちらのノードは上述したButtonの『Touch Up』~『Touch Right』までをより詳細にしたノードです。 Buttonの方と同じ、『Pressed』『Held』『Released』の他、 タッチパッドに触れている間呼ばれ続ける『Touched』と タッチパッドから指を離したときに呼ばれる『Untouched』が追加されています。 X/Yは指先が触れている座標を中央を0として1~-1の範囲で返します。 ちなみに、どちらも『SteamVR』->『Input』の中にあります。 ※Viveコントローラに振動を与えたい ・SteamVR Controller Feedback このノードは『Controller Index』に設定されたコントローラに対し、 『Seconds』秒間の振動を与えます。 ただし、0.003999以上の値を設定すると、 強制的に0.003999に合わせられてしまいます。 VRのデモなどで『何かに触れた』という事を表す場合は単体で使用すればよいのですが、 ゲームなどの演出のように、長期的に振動させたい場合は、 画像のように連続で呼ばれるような処理を作る必要があります。 ※HMDの画面をフェードさせたい…

Stingrayに触れてみよう

By |

Stingrayに触れてみよう

近年、VR/AR技術はゲーム業界のみならず、医療分野やその他の分野でも利用されるようになりました。 特に建築分野では、ウォークスルーアニメーションのプレゼンムービー等、 VIVEコントローラーによる入力を伴ったビジュアライゼーションの現場で活用されています。 液晶画面上に(内覧用の)モデルルームを表示したいとき、あるいは室内の家具の配置を考えるときに、VR/AR技術は有用です。 なぜなら実際の建築物・家具を設置する必要がなく、 以前より制作会社に蓄積されたCGアセットを活用でき、大幅な省力化が図れるからです。 この点は、建築分野においてVR/AR技術が注目を集めている大きな理由です。 通常、建築系のVRのコンテンツ開発にはゲームエンジンが用いられます。 代表的なゲームエンジンとして、UnityやUnrealEngine4が挙げられます。 ゲームエンジンとは文字通り、『ゲームを作るためのエンジン』です。 (近頃は建築などゲーム以外の用途にも使われることも増えています。) さて、話は変わりますが、『Stingray』というゲームエンジンがあります。 Stingrayは2年前にAutodesk社がリリースしたゲームエンジンで、 プログラマでない方にも親しみやすく、3D機能に非常に優れています。 拡張性の高いシステムに、一目でわかるビジュアルスクリプティングが特徴です。 また、Mayaや3dsMaxで有名なAutodesk社がリリースしたエンジンであるため 上記の3Dデザインツールとの連携も容易というメリットがあります。 ただ、UnityやUnrealEngineに比べると情報が少ないのが難点です。 Autodesk公式が運営しているチュートリアルと、 Stingrayそのもののヘルプページを除くと、Stingrayについての情報を見つけるのはかなり難しいと思います。 前置きが長くなりましたが、 数回に分けてStingrayについて、このブログに書いていくことにします。 Stingray自体がデザイナー向けのエンジンという事もあり、 ビジュアルスクリプティングをメインに書いていく予定です。 —————————————————– ・Stingrayに興味があるが触ったことのない方 ・あまりゲーム開発やゲームエンジンにあまり詳しくない方 ・HTC Viveのセットアップが既にできている方 ・プログラムが全く分からない方 —————————————————– このページは上記のような方々を対象にしています。 今回は、『Stingrayの起動』から、『VRテンプレートのプレイ』までを書いていきます。 1.まずはプロジェクトを作成を行う 最初はプロジェクトの作成を行います。 StingrayのランチャーからStingrayを起動します。 起動直後の画面では、いくつかのテンプレートが表示されているはずです。 (表示されていない場合、画面のタブから『Templete』を選択してください) このテンプレートの中から、使用したい物を選びます。 今回はHTC Viveで動かすため、『VR HTC Vive』のテンプレートを使用します。 『VR HTC Vive』のテンプレートをクリックして、右下の『Create』ボタンをクリックしましょう。 すると、下の画像にあるようなウィンドウが出て来ます。 『Name』はプロジェクトの名前なので好きな名前にしましょう。 『Directry』はファイルを保存する場所ですが、何かしらのこだわりがない限りはそのままで大丈夫です。 設定が終わったら『Create』ボタンをクリックします。 これで新規プロジェクトの作成は完了です。 2.プロジェクトをプレイする しばらく待つと、上の画像にあるような画面が表示されます。 これがStingrayのメイン画面になります。 お気付きの方もいるかもしれませんが、…

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(一応の最終回)

By |

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(一応の最終回)

この記事は以下のような方を対象としています。 ——————————- ・VR機器を持っていて、UE4でとりあえず使ってみたい方 ・UE4での経験がまだ浅い方 ——————————-     前提のスキルとして ——————————- ・UE4のエディタの操作方法がわかる ——————————- があればOKです。   また、先に前回・前々回の記事を読んでから、この記事を読み始めていただきたいです。   こんにちは、名残惜しいですが『パンチングゲーム制作』は今回で一旦の最終回です。 最後までしっかりやっていきましょう!     さて、前回まででは 『敵のBPの追加』 『敵のパラメータを設定』 『敵の移動処理』 『敵が死亡したら消える処理』 をやってきました。   今回はついに 『攻撃時に敵を死亡させる処理』 『プレイヤーが敵に攻撃する処理』 『レベルそのものの設定』 『プレイ中に敵をスポーンさせる処理』 『出来上がったものを試しにプレイ』 をやっていきます。     11.敵のブループリントを実装しよう!(ラスト) 敵のブループリントもこれで最後です。 これまでに『生存している間、移動する処理』と『死亡したら消える処理』を実装してきました。 そうなると、残っている処理は『生存/死亡を切り替える処理』です。   最初の仕様の通り、生存/死亡が切り替わるタイミングとは『プレイヤーに殴られた時』となります。   プレイヤーに殴られた時に呼び出されるイベントに、生死を切り替える処理を実装しましょう。   もしかしたら忘れている方もいるかもしれませんが、こういう時こそ『BPインターフェイス』を利用します。 画面上の『クラス設定』を選択し、『詳細ウィンドウ』の『インターフェース』→『実装インターフェース』に、初期に作成した『PunchingInterface』を追加しましょう。 これで、殴られたとき用のイベントが追加できるようになります。     ブループリント上で右クリックを行い、これまた最初に作成した『Punching』イベントを追加しましょう。 (インターフェイス追加後にコンパイルしないと表示されないので要注意です) これが殴られた時に呼び出されるイベントです。 あとはこの先に生死を切り替える処理を実装しましょう。 生死を判定している変数とは、そう、『IsAlive』です。 『IsAlive』をFalseに変えてしまえば敵の実装も完了です!…

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(第二回)

By |

UE4のVRテンプレートを利用してミニゲームを作ってみよう!(第二回)

    2017/04/14:記事の文章にあった間違いを修正しました。 トランスフォームの可動性を変更しないと動かせませんね…。 失礼しました。     この記事は以下のような方を対象としています。 ——————————- ・VR機器を持っていて、UE4でとりあえず使ってみたい方 ・UE4での経験がまだ浅い方 ——————————-     前提のスキルとして ——————————- ・UE4のエディタの操作方法がわかる ——————————- があればOKです。   また、先に前回の記事を読んでから、この記事を読み始めていただきたいです。   こんにちは、前回から始まった『パンチングゲーム製作』。 わかりやすく説明できたでしょうか?     さて、前回まででは 『VRテンプレートでのプロジェクト作成』 『不要なBPの削除』 『BPインターフェイスの作成』 をやってきました。   今回は 『敵のBPの追加』 『敵のパラメータを設定』 『敵の移動処理』 『敵が死亡したら消える処理』 を実装していきます。   ガリガリ、というほどではありませんが、 それなりに本格的にBPを弄っていきますので、気を引き締めましょう!     6.敵を追加しよう! ついに敵キャラを作ります。 『新規追加』→『ブループリント クラス』で新しいBPを作成します。 StaticMeshActorを継承しましょう。 球体型の敵にしようと思うので、『BP_Enemy_Ball』と名付けましょう。     7.敵のパラメータを設定しよう! さて、今のままだと何も見えません。 敵の姿を追加していないためです。 敵のBPを開いて、『StaticMeshComponent』の『StaticMesh』を変更し、敵の姿を設定しましょう。…

Go Top