- まだ到着していない方はこちらへ。
早速!。。って何からやったものか
changelog
- up 2013-06-09 Oculus + Unity + Razer Hydraで VRDemo Tuscany を動かす 追加
- up 2013-06-08 いろいろ追加
- up 2013-05-19 VMD Loaderまで
- up 2013-05-12 PMD Loaderまで
- new 2013-05-11 開発環境構築途中まで
とりあえず初体験してみる
すごいガジェットが手に入った!! けど、何からしていいものか、とりあえずOculusの実力を体験してみる。
その前に色々準備
PCと接続
- 本体は実際に頭に装着するHeadsetと、電源ON/OFF・ブライトネス・コントラスト操作のControl Boxがケーブルで接続されている。
- Control Boxに電源通してPCとUSB接続。あと映像のためのHDMIかDIV挿せばOK。
その1 Steamゲームで遊ぶ
Team Fortress 2 で遊んでみる - 無料
- ユーザー登録とSteamクライアントインストール。
- Oculus VRのHatCodeを使ってゲームをインストール
- クライアントインストール後に「ライブラリ」の左下、「ゲームを追加…」から「Steamでアイテムを有効化する…」を選ぶ。
- HatCodeを使ってゲームを有効化する。
- ダウンロード、インストールが終わったら、「ライブラリ」から「Team Fortress2」を選んで右クリック。「プロパティ」を開く。
- 「一般」の「起動設定…」に
-vr
を入力。 - 現在は関係ないが、ちょっと前に画面分割されなくなる不具合があったみたいで、念のため「ベータ」で「prerelease」選ぶ。
- ゲーム開始。「プレイ」かダブルクリックで。最初のメニュー画面は左右分割されない。ゲームプレイ時の画面でようやく分割表示される。(ロード画面も分割されない。)
- 文字は荒い。ゲーム中のInfoは左だけ表示で右にボタンあったりすると押せない。
vr_calibration
コマンドやら手はあるかとは思うがそこまで詳しく見てない。- 詳しくはこちらで Oculus Rift User Guide - Official TF2 Wiki | Official Team Fortress Wiki
Half-Life 2 で遊んでみる - 有料
- MOD対応
- こちらのフォーラムで配布中
その2 ユーザー作成ゲームで遊ぶ
@warapuriさん作、巨人立体機動ゲーム
- Titan - UnityGames
- 進撃の巨人風ゲーム。
- v0.0.5の時点では人類に巨人を倒すすべはありません。捕食対象です
- 立体機動で空を縦横無尽に飛び回る爽快感は凄い。
- Macでは無理っぽい?VMでやっても真っ黒
- Ver. 0.0.5
- 巨人がプレイヤーを食べるようになりました
- Ver. 0.0.4
- 巨人が自分を追いかけて捕まえるようにしました
- Ver. 0.0.3
- 巨人がこっちを見るようになりました
- Ver. 0.0.2
- 鎖で引っ張られている最中は↑方向(頭方向)に力が加わるようにしました
- Ver. 0.0.1
- 敵は倒せません
- 見る以外何もできませんので絶望感を味わって下さい
ギロチン体験
Oculus Developer Forums - Oculus Showcase
- Oculus Showcase | Oculus Rift Developer Forums
- Oculusを使った作品
- Blue Marble for Oculus Rift | Oculus Showcase | Oculus Rift Developer Forums
- 宇宙旅行
- City Quest - The silliest Rift experience around. | Oculus Showcase | Oculus Rift Developer Forums
- Oculusデモゲーム
- Search & Rescue Mission - Real Visual | Oculus Showcase | Oculus Rift Developer Forums
- Oculusデモゲーム
- Ocucam - piping dual webcams to an Oculus Rift | Works in Progress | Oculus Rift Developer Forums
- OculusにWebカメラを2つ取り付けて以下略
- Project Aedra (TES3:Morrowind Remake) with Rift Integration | Oculus Showcase | Oculus Rift Developer Forums
- Project Aedra | Free software downloads at SourceForge.net
- このゲームをOculusで遊ぶ
- Project Aedra | Free software downloads at SourceForge.net
- Museum of the Microstar - Now with Oculus Rift Support! | Oculus Showcase | Oculus Rift Developer Forums
- Museum of the Microstar - Technical Flythrough - ニコニコ動画:Q
- Unityエンジンを使ってDX11レベルの表現を試すことが目的 だそうな、 Museum of the MicrostarをOculusで体験できる
- Museum of the Microstar - Technical Flythrough - ニコニコ動画:Q
- VBjin-OVR, Virtual Boy Emulator with Rift support | Oculus Showcase | Oculus Rift Developer Forums
- VRヘッドセットOculus Riftを対応させた任天堂バーチャルボーイのエミュレーターVBjin-OVRが登場 - Game*Spark
- Oculusで任天堂のバーチャルボーイ体験
- VRヘッドセットOculus Riftを対応させた任天堂バーチャルボーイのエミュレーターVBjin-OVRが登場 - Game*Spark
- Stereoscopic Player (2D/3D image/video player) | Oculus Showcase | Oculus Rift Developer Forums
- PCで立体視してみるぶろぐ Stereoscopic Player (link先職場での閲覧注意
- Space Cadet | Oculus Showcase | Oculus Rift Developer Forums
- 3Dシューティングゲーム
Oculus Developer Forums - Works in Progress
- Works in Progress | Oculus Rift Developer Forums
- 製作中の作品
- Making Viewer VR (360° Video) | Works in Progress | Oculus Rift Developer Forums
- Deskope - Work in Windows with the Rift | Works in Progress | Oculus Rift Developer Forums
- Oculusのセンサーの数値、感度設定ができるものっぽい。
- Adding native Rift support to NASA WorldWind | Works in Progress | Oculus Rift Developer Forums
- NASA World Wind
- World Wind:NASA開発の3D地球儀ソフト
- NASAの3D地球儀ソフトをOculusで。Google Earthと比べると?
- NASA World Wind自体は3Dマウスにも対応している。3Dconnexion : NASA WorldWind
- Outerra engine | Works in Progress | Oculus Rift Developer Forums
- outerra | Tumblr
- きれいな風景、景色の場所へ旅行体験
- outerra | Tumblr
- AMVR: Anxiety Management VR Platform - New Screenshots | Works in Progress | Oculus Rift Developer Forums
- 仮想現実プラットフォーム
- Ocean Rift (featuring sharks) | Works in Progress | Oculus Rift Developer Forums − スキューバ体験
- Undercurrent - Deep Sea Exploration Indie Game | Works in Progress | Oculus Rift Developer Forums
- 深海調査ゲームデモ
その3 YouTube
- Oculus Rift Movie test 2 - More fisheye
- 3次元
- Oculus Rift Car Driving
- F1 2012 on the Oculus Rift Pt. 2 / 3D testing - Rain Effects - Spa Francorchamps
- レースゲーム。シートとハンドルとペダルとペダルを揃えている人にとってはOculusがあれば最高のゲーム体験ができる?
- EVE-VR: Oculus Rift View Demo
- ゲームのデモ。これが先駆けとなるか?
- War Thunder on the Oculus Rift Pt. 1
- War Thunder on the Oculus Rift Pt. 3 - Arcade Online
- Flying Inside the Rift
- Outerra + Oculus Rift Test 2 - MiG 29 flight
- おそらびゅんびゅん
- Oculus Rift - My First Trip into Tuscany
- OculusのUnityデモに付属のもの
その4 UnityでParaisoを作る
- 導入
- 注意
- Unityの正しい知識が欠如しています。間違いは
Pull RequestTwitterからご指摘ください。 - MMD for Unity SVNから直接Checkoupしてきた
r129
使用Mac
のUnity
では、PMD Loader
でモデルデータをConvertすると、生成されるMaterials
Physics
ファイルが文字化けして、参照に失敗するみたいなので Windows必須
- ただし、
Windows 32bit
ではOculus Unity
でdll参照時に64bitのdllをみてエラーっぽい(未確認)ので、実行はMac
のUnity
でやっている。
- Unityの正しい知識が欠如しています。間違いは
- Unity導入
- UnityでOculusを使うにはProライセンスが必要(133,875円)
- Oculusユーザーは4ヶ月Trialできるらしいけど?
- すでにインストール済みで普通のLICENSEの人は、「Manage License」から適当にライセンスリセットで途中からUnityのライセンス切り替えができる。
- UnityでOculusを使うにはProライセンスが必要(133,875円)
- MikuMikuDanceを手に入れる
- UnityでMMDを動かす会 プロジェクト日本語トップページ - SourceForge.JP
- SVNから直接チェックアウト
r129
- SVNから直接チェックアウト
- UnityでMMDを動かす会 プロジェクト日本語トップページ - SourceForge.JP
- Oculus VR Developer登録してSDKを入手する
- Oculus VR Developer Center
- Download - Oculus Rift SDK, Docs, Integrations, Wiki & Forums | Oculus Developer Center
- Oculus SDK v0.2.2
- Unity 4 Integration
- Unity + OculusのためのPluginとか
- Oculus Unity Tuscany Demo
- Unity + OculusのDemo、 Unityプロジェクト付き
- Oculus SDK
- Unity 4 Integration
- Oculus SDK v0.2.2
- Download - Oculus Rift SDK, Docs, Integrations, Wiki & Forums | Oculus Developer Center
- Oculus VR Developer Center
- 注意
- 手順
- Unity新規プロジェクト作成〜Oculus・フィールド下準備
- OculusUnityIntegrationに入ってるサンプル「が僕達の新居にふさわしいので、この中で同居します。フヒヒ」『内にMMDのモデルを配置する』
OculusUnityIntegrationGuide.pdfを参考に、元となるプロジェクトをUnityで準備する- Unityで新規プロジェクトる
- プロジェクトにサンプル読み込ませる(Windowsだと強制終了食らったのでMacで作業 Oculus Unity v0.22)
- メニューの
Assets
->Inport Package
->Custom Package
でOculusUnityIntegrationTuscanyDemo.unitypackage
を選ぶ Project
ビュー のTuscany
Scenes
SRDemo_Tuscany.unity
をダブルクリック 出てきた ダイアログは Don’t Save を選ぶ
- メニューの
Scene
に表示されるはず。上の▶
押して試してみる。- 操作はFPS風のWASD(詳しくはOculusUnityIntegrationGuide.pdfのp5, 2.2)
- OculusUnityIntegrationに入ってるサンプル「が僕達の新居にふさわしいので、この中で同居します。フヒヒ」『内にMMDのモデルを配置する』
ミクに裸YシャツになってもらうUnityでMMDモデルを追加する(MMD for Unity、MFU r129)- 全面的にこちらの記事を参考に作る
【MMDforUnity】UnityでMMDモデルを動かす: 名も無き製作室- Unityで作ったプロジェクトでMMDが動くようにPluginとか追加
- SVNからチェックアウトしてきた
mmd-for-unity/trunk
下のMikuMikuDance for Unity
フォルダごとProject View
に D&D- メニューバーの
Plugins
にMMD Loader
が追加されたら成功
- メニューバーの
- SVNからチェックアウトしてきた
- 嫁を手に入れる
- VPVP wiki - モデルデータ
- VPVP wiki - モデルデータ/MMD付属モデル から同棲したいミクを選択する
- ここでは ワイシャツを着た初音ミク(生足バージョン) に毎朝味噌汁作ってもらうことにしました。
が、後述の方法でPMDLoader
で読み込めないっぽい。
いろいろ試した結果、ki式初音ミクAct4
さんなら ShaderType: MMDShader、他すべてONで取り込めてきちんと表示できた。
- ここでは ワイシャツを着た初音ミク(生足バージョン) に毎朝味噌汁作ってもらうことにしました。
- VPVP wiki - モデルデータ/MMD付属モデル から同棲したいミクを選択する
- ちなみに、
.pmm
pmd
の拡張子ファイルの種類については次のサイトが詳しい- VPVP wiki - MMM/拡張子
- みくだん MMD・MME・PMD Editorなどで使用される主な拡張子一覧 より抜粋
.pmd
- Polygon Model File
MMDモデルファイル.vmd
- Vocaloid Motion Data File
MMDモーションファイル.pmm
- Polygon Movie Maker File
MMD本体で使用するプロジェクトファイル。直接使えない.pmx
- Polygon Model File eXtend Version
.pmd
の仕様拡張版。たぶん直接使えない
- VPVP wiki - モデルデータ
- MMDモデルファイル
.pmd
を変換してUnityプロジェクトに読み込ませる- Unityの
Project View
にMMDModel
フォルダを追加して、MMDDaccs_0150
フォルダごとどらっぐどろっぷ- ものによって依存とかあるみたいで、単品で最低限コピーするとめんどくさそう。
- これがいいのか悪いのか知らないけど
ハーレム後からばかすか入れるつもりで管理が用意だからこうする。
PMD Loader
を使って.pmd
ファイルをConvert
PMD Loader
起動- メニューバー
Plugins
から、MMD Loader
>PMD Loader
- メニューバー
- Convert対象の
.pmd
ファイルを選択してConvert
Project View
のMiku wDummy.pmd
を、PMD file
:None(Object)
の上にD&D- (それか
None(Object)
の右にある丸アイコンをクリックして出るとこから選ぶ)
- (それか
Convert
クリック- 正常に取り込めたら、
Hierarchy View
に生成されたモデルをProject View
の同じく生成されたAsset
(白い四角アイコン)にD&D
- これをやらないと
VMD Loader
のPrefab
の選択肢に出てこない。
- これをやらないと
- TroubleShooting
NullReferenceException: Object reference not set to an instance of an object
- メッセージ押せばエラー発生箇所がでる。コード嫁
- 取り込んだモデルのテクスチャがかけている、真っ白、真っ黒
.pmd
が参照するテクスチャ画像ファイルをProject View
に持ってき漏れている。
そもそもモデルのディレクトリまるごとコピーしていれば問題ない
- ただでさえ天使で眩しいミクさんが眩しすぎて辛い
- 取り込んだ
Materials
の設定で光の当たり方を変える必要がある。 Project View
の生成したPrefab
(青い四角アイコン)と同じ階層にあるMaterials
フォルダ以下のファイルを全選択Inspector View
のShader
でDiffuse
を選ぶ
- 取り込んだ
- 浮気したわけでもないのに天使のはずのミクさんの顔の影が怖い
- 他の物体から影を計算する
Receive Shadows
が効いている。 - 本来は正しくモデルを直すべきだが、一生を共にするつもりはないので OFF にする。
Project View
の生成したPrefab
(青い四角アイコン) ファイルを選択Inspector View
のSkinned Mesh Renderer
Receive Shadows
をOFF
- 他の物体から影を計算する
- ネクタイ・スカートがめり込む
- いろいろ方法があるみたい。
Ki式初音ミクAct4
さんの場合は、MFU
をr122
からr129
に変えて取り込み直したら、スカートめり込まないようになった。- ネクタイは
ネクタイ1
のConfigurable Joint
のAngular XMotion
をLimited
→Locked
で(Limitedのまましきい値設定でも良さそう)
- 晴れて配置が終わったら、巨人ミクさんのサイズを変える
- Convert直後に配置されるミクは駆逐対象サイズなので、自分の性癖の身長に変更
Project View
の生成したPrefab
(青い四角アイコン) ファイルを選択Scale
のX
Y
Z
を次の値で統一する。
目安としては、ペドは0.1以下
、ロリは0.1
、普通は0.15
あたりで。モデルによって変わるかもしれない
- Convert直後に配置されるミクは駆逐対象サイズなので、自分の性癖の身長に変更
- Unityの
- Unityで作ったプロジェクトでMMDが動くようにPluginとか追加
- 全面的にこちらの記事を参考に作る
- 配置したモデルにMotionを割り当てる
- MMDのモーションデータ
.vmd
を変換する- モーションデータを拾ってくる
VPVP wiki - モーションデータ/日常系・その他
- 今回は 【MikuMikuDance】歩き&走りモーション【公開】 - ニコニコ動画:Q の 歩き&走りモーション - Bowl Roll を使用
- DLしたら解凍して、
Project View
にMMDMotion
フォルダを追加してその中に歩きと走り
フォルダごと突っ込む
VMD Loader
を使って.vmd
ファイルをConvert
VMDLoder
起動- メニューバー
Plugins
から、MMD Loader
>VMD Loader
PMD Prefab
には先程生成してこちょこちょしたPrefab
ファイルPMD Loader
取込、Convert
直後に次の操作が必要(上から読んでいたら実行済)Hierarchy View
に生成されたモデルをProject View
の同じく生成されたAsset
(白い四角アイコン)にD&D
青い四角アイコンに変わればOK- しないと
VMDLoder
の選択肢で、PMDLoader
でConvertしたモデルが選べない。
VMD file
に歩く10.vmd
- よく知らないけど
Create Asset
にチェック - よく知らないけど
Interpolation Quality
はそのまま1
Convert
Prefab
と同じ階層にAnimation
フォルダが生成され、その中に 再生ボタンっぽいアイコンのファイルができる。
- モーションデータを拾ってくる
VPVP wiki - モーションデータ/日常系・その他
- モデルに変換したモーションデータをバインドする
- このままじゃモデルにバインドされてないので、再生ボタンっぽいアイコンのファイルを選んで青い四角アイコンの
Prefab
に D&D - 一回しかモーションしてくれないので
Loop
させる- 再生ボタンっぽいアイコンのファイルを選んで
Inspector View
のWrap Mode
からLoop
を選ぶ
- 再生ボタンっぽいアイコンのファイルを選んで
- ここまでを確認
▶
押して試してみる。- 操作はFPS風のWASD(詳しくはOculusUnityIntegrationGuide.pdfのp5, 2.2)
- このままじゃモデルにバインドされてないので、再生ボタンっぽいアイコンのファイルを選んで青い四角アイコンの
- MMDのモーションデータ
- Unity新規プロジェクト作成〜Oculus・フィールド下準備
Oculusに関連するもの
ガジェット
DELTA SIX
- DELTA SIX: A new kind of game controller. by David Kotkin — Kickstarter
- 2013/12 発売予定
- VRモーションコントローラー対応の銃コントローラ
Omni by Virtuix
- Omni: Move Naturally in Your Favorite Game by Virtuix — Kickstarter
- 2014/1 発売予定
- ウォーキングマシンから着想を得た移動コントローラ
Leap Motion
- Leap Motion
- Oculus Rift + Leap Motion (WIP 4) - YouTube
- 2013/7/22 発売予定
- 現在あるガジェットの中で、指先のモーションキャプチャの精度が一番いい
Razer Hydra
- GDC 2013 Oculus Rift Tuscany Razer Hydra Demo Hands-on
- 今購入できるガジェットの中で腕の動きのモーションキャプチャの精度が一番いい
Oculus + Unity + Razer Hydraで VRDemo Tuscany を動かす
- Sixense Razer Hydra Oculus Rift Tuscany Demo RELEASED
- SourceCodeの公開渋ってるから自分でやってみた
- ポイントは3つ
- RazerHydraをUnityで使えるようにするAssetを入れる
- 手のオブジェクトを移動に追従するようにする
Hierarchy
でオブジェクトの入れ子を変更OVRPlayerController/OVRCameraController/CameraLeft/Left Hand
OVRPlayerController/OVRCameraController/CameraRight/Right Hand
- RazerHydraのJoystickで移動する
OVRPlayerController.cs
書き換え(// Razer Hydra
の3箇所)public virtual void UpdateMovement() { // Do not apply input if we are showing a level selection display if(OVRMainMenu.sShowLevels == false) { bool moveForward = false; bool moveLeft = false; bool moveRight = false; bool moveBack = false; MoveScale = 1.0f; // * * * * * * * * * * * // Keyboard input // Move // WASD if (Input.GetKey(KeyCode.W)) moveForward = true; if (Input.GetKey(KeyCode.A)) moveLeft = true; if (Input.GetKey(KeyCode.S)) moveBack = true; if (Input.GetKey(KeyCode.D)) moveRight = true; // Arrow keys if (Input.GetKey(KeyCode.UpArrow)) moveForward = true; if (Input.GetKey(KeyCode.LeftArrow)) moveLeft = true; if (Input.GetKey(KeyCode.DownArrow)) moveBack = true; if (Input.GetKey(KeyCode.RightArrow)) moveRight = true; if ( (moveForward && moveLeft) || (moveForward && moveRight) || (moveBack && moveLeft) || (moveBack && moveRight) ) MoveScale = 0.70710678f; // No positional movement if we are in the air if (!Controller.isGrounded) MoveScale = 0.0f; MoveScale *= DeltaTime; // Compute this for key movement float moveInfluence = Acceleration * 0.1f * MoveScale * MoveScaleMultiplier; // Run! if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) moveInfluence *= 2.0f; if(DirXform != null) { if (moveForward) MoveThrottle += DirXform.TransformDirection(Vector3.forward * moveInfluence); if (moveBack) MoveThrottle += DirXform.TransformDirection(Vector3.back * moveInfluence) * BackAndSideDampen; if (moveLeft) MoveThrottle += DirXform.TransformDirection(Vector3.left * moveInfluence) * BackAndSideDampen; if (moveRight) MoveThrottle += DirXform.TransformDirection(Vector3.right * moveInfluence) * BackAndSideDampen; } // Rotate // compute for key rotation float rotateInfluence = DeltaTime * RotationAmount * RotationScaleMultiplier; //reduce by half to avoid getting ill if (Input.GetKey(KeyCode.Q)) YRotation -= rotateInfluence * 0.5f; if (Input.GetKey(KeyCode.E)) YRotation += rotateInfluence * 0.5f; // * * * * * * * * * * * // Mouse input // Move // Rotate float deltaRotation = 0.0f; if(AllowMouseRotation == false) deltaRotation = Input.GetAxis("Mouse X") * rotateInfluence * 3.25f; float filteredDeltaRotation = (sDeltaRotationOld * 0.0f) + (deltaRotation * 1.0f); YRotation += filteredDeltaRotation; sDeltaRotationOld = filteredDeltaRotation; // * * * * * * * * * * * // XBox controller input // Compute this for xinput movement moveInfluence = Acceleration * 0.1f * MoveScale * MoveScaleMultiplier; // Run! moveInfluence *= 1.0f + OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.LeftTrigger); // Razer Hydra uint buttonsCount = 0; string buttonsText = ""; string buttonsText2 = ""; if (SixenseInput.Controllers[0].Enabled) { foreach (SixenseButtons button in System.Enum.GetValues(typeof(SixenseButtons))) { if (SixenseInput.Controllers[0].GetButton(button) && (buttonsCount < 4)) { if ( buttonsText != "" ) { buttonsText += " | "; } buttonsText += button; buttonsCount++; } else if (SixenseInput.Controllers[0].GetButton(button) && (buttonsCount >= 4)) { if (buttonsText2 != "") { buttonsText2 += " | "; } buttonsText2 += button; buttonsCount++; } if (SixenseInput.Controllers[0].GetButtonDown(button)) { Debug.Log("Pressed = " + button + ":" + buttonsText2); } if (SixenseInput.Controllers[0].GetButtonUp(button)) { Debug.Log("Released = " + button + ":" + buttonsText2); } } } //guiText.guiText.text = "Buttons = " + buttonsText; //guiText2.guiText.text = "" + buttonsText2; // Move if(DirXform != null) { float leftAxisY = OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.LeftYAxis); float leftAxisX = OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.LeftXAxis); // RazerHydra if (SixenseInput.Controllers[0] != null) { leftAxisY = SixenseInput.Controllers[0].JoystickY; leftAxisX = SixenseInput.Controllers[0].JoystickX; if (buttonsText == "JOYSTICK") { leftAxisY *= 2.0f; leftAxisX *= 2.0f; } } if(leftAxisY > 0.0f) MoveThrottle += leftAxisY * DirXform.TransformDirection(Vector3.forward * moveInfluence); if(leftAxisY < 0.0f) MoveThrottle += Mathf.Abs(leftAxisY) * DirXform.TransformDirection(Vector3.back * moveInfluence) * BackAndSideDampen; if(leftAxisX < 0.0f) MoveThrottle += Mathf.Abs(leftAxisX) * DirXform.TransformDirection(Vector3.left * moveInfluence) * BackAndSideDampen; if(leftAxisX > 0.0f) MoveThrottle += leftAxisX * DirXform.TransformDirection(Vector3.right * moveInfluence) * BackAndSideDampen; } float rightAxisX = OVRGamepadController.GPC_GetAxis((int)OVRGamepadController.Axis.RightXAxis); // RazerHydra if (SixenseInput.Controllers[1] != null) { rightAxisX = SixenseInput.Controllers[1].JoystickX; } // Rotate YRotation += rightAxisX * rotateInfluence; } // Update cameras direction and rotation SetCameras(); }