Tumblrあけましておめでとうございます!!新年早々(というか大晦日から)インフルエンザでぶっ倒れておりました。いやぁ、死ぬかと思った。12.0(バージョン表記が変わった?)ハンドトラッキングとは昨年末に公開されたOculusQuestの新機能です。ソフトウェアアップデートのみで、手の動きをトラッキングできるようになります。やばいよ、すごいよこの機能。対応ソフトはまだまだ少ないのですが、これからが楽しみなところです。実装方法まずはOculusIntegrationをアップデートしましょう。現行の最新バージョン(12.0)を入れればオッケーです。OVRCameraRigを追加します。Onlyを選びましょう。RaightHandAnchorにも同様にくっつけます。くっつけたOVRHandPrefabはデフォルトで左手設定になっているので、RightHandAnchorのそれを、右手用に設定します。Rightにしましょう。これで実装完了です!ビルドして動かしてみましょう。手を使用を選択します。Editor上で開発したQuestアプリは、ビルドして端末にインストールしないと動作確認することができません。ALVR(PCで動かしたVRアプリをWi-fiでQuestに飛ばすソフト)を使用する方法もあるのですが、私のネットワーク環境ではスペックを満たしていなく・・。試したらめっちゃカクカクしており、とても使えたものではありませんでした。いう訳で仕方なく、修正してはビルド&インストールを繰り返しており、とても効率の良い開発環境とは言えませんでした。LinkはALVRの有線版といったところでしょうか。Type-Cでつないで、PC上で動かしたVRアプリをQuestでプレイできる機能です。Editor上で動作させた開発中のアプリをUSB接続中のQuestでもプレイすることができるのではないか!?と思って試してみたら、できましたー!!・・・まあ、当たり前っちゃ当たり前?wでもでも、これで本当に開発が捗ります。Linkについてはコチラの記事でも紹介しています。atelier-hinata.hatenablog.comセットアップについてはコチラ。LinkってばRiftのソフトをQuestで動かせるようにするんだから、プラットフォームはPCに変えるのかな?と思っていたのですが、Androidのままでいけました。OVRCameraRigのTargetDeviceもQuestのままです。動いたのかな?ただ、コントローラでの方向転換がうまく動いていませんでした。Rコントローラのジョイスティックで方向転換するはずが、移動になってしまいます。Lコントローラのジョイスティックを操作した直後の1回のみ、方向転換できます。Setupをインストールする・・・のだが。Linkとはatelier-hinata.hatenablog.com前回の記事でご紹介していますが、RiftのアプリをQuestでも使えるようになる機能です。ソフトウェアのアップデートのみでいけちゃいます。β版ではありますが、この機能がついにリリースされました!!www.oculus.com詳細は公式サイト様にて。Questのソフトをバージョンアップする■2019/11/25更新■スマホアプリで自動アップデートをONにし、スリープ状態で放置しておくと、自動的にアップデートされます。Setupというアプリをインストールする必要があるとのことです。上記URLからダウンロードしましょう。Setupをインストールする・・・のだが。何度やっても、この画面でインストールが止まってしまいます。調べた結果、インストールのログが出るので、それを確認してエラー要因を突き止めることが出来るとか。C:\Users\(ユーザ名)\AppData\Local/Oculus/OculusSetup.logがそのログになります。ユーザ名が日本語だとログが出力されませんでした。ログの中身さっそくログを確認してみます。すると、こんなのが出ていました。failed.おおぅ、確かにインストールでコケとる!!(知ってた)oculus-driver.exeってやつが失敗するんだな?てことでコイツのインストールエラーについてGoogle先生に聞いてみましたが、結構いろんな人が困っている割には明解な回答が見つからず・・・。レジストリをゴッソリ消すとか、Windowsをガッツリ再インストールするとか、怖いことばかり目につきました。見かけた中でも比較的安心な、Windowsの更新を実行してみることにしました。自動で実行されてると思ってたんだけど、そうじゃなかったみたいwこれにより、NVIDIAのドライバが更新されました。LinkはPCのスペックに制約がありますのでご注意ください!グラボはNVIDIAのみが対応となっています。詳細は、こちらのサイト様にて紹介されています。Setupのインストールにチャレンジしたら、見事成功いたしました!!いや~、ここまでの道のり長かった・・・。あとは画面に従って、セットアップを継続すれば完了です!さっそく遊んでみるとりあえず無料のやつでw視点を動かすとすこーしだけ、画像の細かい部分がカクカクしましたね。Riftで遊んだとしても、この細かさだったらカクカクするのかも知れませんが。Meetup」に参加してきました。結論イベントの構成イベントは、次の構成で行われました。交流会なのですが、いかんせん台風19号直撃前夜。3,4はごく短時間に省略されました。Connectとは、年2回(5月と10月だったかな?)にシリコンバレーで開催されるFacebook公式のOculusイベントです。マークザッカーバーグ氏も登壇したとのことでしたが、すみません、無知な私はどなたか存じ上げませんでした・・・。FacebookのCEOだったのですね。来春以降にもOculusQuestのソフトバージョンアップのみで実現されるハンドトラッキング機能についても、紹介があったようです。いやー、これ本当に楽しみですよね!この後紹介されたビジネス向けVRでは、ハンドトラッキングが非常に好評だったようです。なんてったって、ゲーマーじゃない方にコントローラの説明が不要になったわけですから!!(笑)ビートセイバーやる時にコントローラをぶん投げそうになるんですよ。私もコントローラが不要になるのは非常にうれしいです。そのビートセイバー開発者の方が、赤いTシャツの登壇者の方。ご覧になってください。Tシャツのプリントwww左に映っている方も、何かの開発したすごい人(すみません、大事なところ失念)なようです。その方が会場を徘徊されていて、フランクに参加者の質問等に答えていたとのことでした。そんなイベントなので、次回はぜひ皆さんもご参加してみては?と登壇者の方がおっしゃられていましたが、英語というドデカイ壁があるやん・・・。あと費用とかもさぁ・・・。OculusQuestのアップデートOculusQuestの今後のアップデートについても発表がありました。RiftのアプリをQuestでも使えるようになる機能です!!これでソフトの幅が大きく広がりますね。PCとQuestをType-Cで接続するわけですが、Unityエディタでのデバック実行もできるようになったりするのでしょうか。個人的な話ですが、ALVRで実行するには家のWi-fi環境がヨロシクなくて・・。変えなければと思っています。Riftと全く同等の体験ができるわけではなく、だいたい80%くらいの実現度だそうです。いずれはType-CではなくWi-fiでも実現したいとのことでした。今はエンコード/デコードでどうしても遅延が発生するとのことです。ハンドトラッキング前述の通りです。Dome可変焦点を実現した次世代VRデバイスです。可変焦点とは、焦点を当てているものはハッキリ見えるけれど、それ以外のものはぼやけて見える機能のことです。現時点のVRでは焦点を当てていようが当てていまいがハッキリ見えてしまい、それが違和感として残ってしまっています。Domeは現時点で3まで開発が進んでいるそうです。普及を考えると、Quest同様の5万円が上限とのこと。Avatarヘッドセットのカメラで顔を認識し、アバターの表情をリアルに合わせるといった機能です。アバター自体は事前に作る必要があります。Businessビジネス向けのVRに特化したヘッドセットです。実際にヒルトンホテルや外科手術の訓練現場で使用され、未使用よりも成果が上がったとのこと。NOW(VRビジネスの時はきた)」がロゴになっていたようです。ARトレンドSparkARFacebookやInstagramで利用できるAR機能。カメラアプリで撮影した写真を使っていたので、そんな機能がついてること知らなかったとですよ・・・。LiveMapsARグラスになるのか、はたまたコンタクトレンズになるのか。形態は不明ですが、これが実現したらマジでSF映画の世界になります。映画館に行くと、映画の情報が空間に浮かんで表示されたり竹林に行けばバーチャルな鶴が現れたり。同じ時間・同じ場所にいる人たちが全員同じ映像を見れるようになるとのことで、実現できたら末恐ろしいとまで思いました。私自身はVR会議どころか、TV会議もSkype会議もしたことがないのですが。表情や目線、手の動きが見える会議が一番とのことでした。Skype会議だと話がかぶってしまい、結局はトランシーバーのような会話になってしまう。TV会議だと映らない人もいる。いった経緯から開発に至ったとのことでした。実際にVR会議をしながらVR会議ソフトを開発され、実体験をもとに改良されていったようです。Tumblr制限時間のカウントダウンを、イライラ棒の先端に表示してみました。数字表示と共に時間ゲージの円が欠けていく仕組みになっています。Spaceに設定しましょう。CenterEyeAnchorを設定します。カウントダウン用のTextをCanvasに追加するアウトラインをつけたかったのでTextMeshProにしましたが、普通のTextでもOKです。時間ゲージ用のImageをCanvasに追加する時間ゲージ用の画像を準備します。TypeをSpriteに設定しておきましょう。これをImageのSourceに設定します。Typeという項目が出てきます。MethodをRadial360に設定してやります。Amountは1にしましょう。イメージエフェクトの使用」に記載されていますが、イメージエフェクトは非常に負荷が高くVR向けではありません。よって、使用の有無をよく検討する必要があります。SABERっぽくするのが大目的です。よって遠慮なく使うことといたしました。Processingを使うことだと思います。Managerから表示されるPackageウィンドウからインストールします。※未インストール時は、上記画面のボタンがInstallになります。Layerコンポーネントをアタッチします。にアタッチしましょう。アタッチしたら、エフェクトを適応するLayerの設定を行います。Anti-aliasingのModeですが、せっかく準備されているのです。Processで適応するので今回は外してみました。Rangeレンダリング)を有効にする必要があります。Settingsから設定します。HDRをONにします。Low・Middle・Highの設定項目がありますので、同様にすべて設定します。Layerで設定したのと同じものを設定します。Volumeスクリプトををアタッチしましょう。GlobalはONにしておきます。OFFにすると、オブジェクトからの距離でエフェクトをかける範囲を設定できます。ProfileでNewボタンを押下すると、プロファイルが作成されます。このプロファイルにエフェクトを追加していく感じになります。Profileを開くと、エフェクトを追加する画面が出てきます。こちらからBloomを追加しましょう。IntensityはBloomの強さ、Thresholdは発光の閾値です。オブジェクトのIntensityが設定値以上のオブジェクトのみが発光します。ModeはぜひONにしておきましょう。ShaderのEmissionを使用します。Emissionについては、下記URLに詳しく記載されています。docs.unity3d.comVRイライラ棒ではイライラ棒とステージが発光しています。発光の度合いを変えるために、イライラ棒側のIntensityを強めに設定してあります。左がイライラ棒、右がステージのIntensity設定です。TumblrOculusQuestはスタンドアロンなVR機です。立ってプレイしたいですよね!?そんなあなたの希望を叶える方法をご紹介します。2017OVRPlayerControllerを使うatelier-hinata.hatenablog.com↑の記事でご紹介しましたが、OVRPlayerControllerを使うとVR空間内を自由に移動することができます。Dataというパラメータがありまして、プレイヤーの物理的な身長データを使用するかどうかを選択できます。こいつをONにしましょう。Typeを変更しましょう。これでオッケーです!あとはプレイ前のガーディアン設定で、床の調整をしっかりとやっておきましょう。コントローラを床にタッチさせることで、正確に検知することができます。比較してみるあああ、めっちゃ分かりづらい(汗1個目の動画がUseProfileData=あり、TrackingOriginType=FloorLevel2個目の動画がUseProfileData=なし、TrackingOriginType=EyeLevel1mのキューブを床に配置しています。なんとなく違いがお分かりいただけたでしょうか・・・。立ってプレイするアプリを作るには、OVRPlayerControllerのUseProfileData=あり、OVRCameraRigのTrackingOriginType=FloorLevelに設定する。OculusQuestに床位置をきちんと認識させるには、ガーディアン設定時にコントローラで床をタッチすると良い。Tumblrイライラ棒を作った時の苦労話をツラツラと書いていきたいと思います。苦労したんですよ、本当に。Integrationをインポートすると、膨大な量のサンプルシーンやPrefabがインストールされます。今回はその中から、OVRPlayerControllerを使用しました。OVRPlayerControllerにはCharacterControllerがアタッチされているので、スクリプトを組むことなくVR空間内を自由に移動することができます。これにはOVRCamerRigがアタッチされていますので、通常のCameraがシーン内にある場合は削除しましょう。AvatarGrabberRightを使う今回は右手でイライラ棒を操作するので、AvatarGrabberRightを使用します。これを使ったかというと、最初は手のアバターを表示してイライラ棒を掴んで操作しようと思っていたからです。SABERを思い出してみたら、手のアバターは表示されていないんですよね。いう訳で、その名残というのが理由ですwコントローラの位置や角度が取得できれば、他でも良いと思います。AvaterGrabberRightはOVRameraRigの子オブジェクトとして設定します。Dataを使用する設定にしていると、こうしないと手の位置が正しく表示されませんでした。イライラ棒を作る柄の部分を中心位置としたいので、柄(Cube)の子オブジェクトとして刃(Cylinder)をくっつけました。イライラ棒を引っこ抜けないように(引っこ抜いたらビリビリさせる)、刃の前後にもコライダをくっつけました。最初は透明にしていたのですが、透明だとビリビリしたときに「なんで!?」となってしまったので、すこーしだけ見えるようにしてみました。なんだか余計に見えづらくなってしまったという・・・(汗)動かしてみるこれでイライラ棒が出来上がりました!なお、イライラ棒ですので失敗すると当然のごとくビリビリしますwOVRInput.SetControllerVibrationメソッドを使用すると、コントローラをビリビリさせることができます。エフェクトは、勉強中のUnityゲームエフェクト入門で作ったやつをそのまま使ってしまいましたwwww.shoeisha.co.jp結論OVRPlayerControllerを使うと、VR空間内を自由に移動できるAvatarGrabberRightを使うと、コントローラの位置を取得できるコントローラをビリビリさせるには、OVRInput.SetControllerVibrationメソッドを使うイライラ棒すっぽ抜け防止のアイディアが最悪。Tumblrメッシュを爆発させるアセットで有名なExploderを買ってしまいました。Bundle祭りで、お財布のヒモが緩んだ隙の出来事でした。VRイライラ棒の記事を次回から・・・と言っておきながらまさかのアセットネタです。書きたかったんだもん。紹介するのが、Bundleの中身じゃないという。結論Exploderとはassetstore.unity.comexplodeとは爆発させるという意味でして。その名の通り、メッシュを爆発させてくれるアセット(35ドル)になります。いろんなものを爆発させたくなります。使い方まず、Exploderを購入&ダウンロード&インポートします。消費税はキッチリ10%取られました。9月のうちに買っておくんだった・・・。次に、ヒエラルキー上にExploderのPrefabを配置します。Assets>Exploder>Prefabsに入っています。破壊したいオブジェクト(青)と破壊したくないオブジェクト(赤)を並べます。スフィアと衝突したら破壊する仕組みです。破壊したオブジェクトには「Exploder」タグをセットします。これはアセットをインポートすると自動で追加されます。こんなコードを書いて、スフィアにアタッチします。Vector3.zero;}これで動かした結果がこちら。1回目の爆発は余韻が、破片の飛び散りがあっという間に終わってしまい2回目の爆発はぶつかってからのタイムラグがありすぎる。ナニコレ珍百景、アゲイン。原因を探ってみるOnCollisionEnterで出力しているデバッグログを見てみると、こんな感じになっていました。なにこのfragment_xxってヤツら。配置してないんだけど!?ナニコレ珍百景、リターンズ。Exploderが破壊したメッシュたちの破片にぶつかっていてそいつらをも破壊しようとしているんだと思われます。設定値を確認してみるそれって、まず最初にやることなんじゃないの・・・?まずは爆発関連から。Radius・・・爆発判定の半径。後ほど記述しますが、オブジェクトを爆発させることの他に、自身を爆破して周囲を巻き込むことができます。その巻き込む半径になります。Fragments・・・爆発させた後の破片の数。Tag・・・爆破したいオブジェクトの判定に、タグを使いたくないときにONにします。その場合、爆破したいオブジェクトにはExplodableスクリプトをアタッチする必要があります。Self・・・爆破させた後、自身を非アクティブにします。Self・・・爆破させた後、自身を非表示にします。Object・・・爆破したオブジェクトをdeleteします。オフの場合は、非アクティブになります。Distribution・・・デフォルトでは、Exploderの中心から近い位置にあるオブジェクトは、多くの破片になります。遠いオブジェクトは、少ない破片になります。このオプションをオンにすると、オブジェクトの中心からの距離に関係なく、オブジェクトごとに均等にフラグメントの数が作成されます。Islands・・・同じメッシュの非接続部分を分離して破片にします。Physics・・・2Dに適応する際、ONにします。Radius・・・爆破範囲をスフィアではなく、キューブに設定します。Angle・・・破片の形状を選択します。Size・・・破片オブジェクトはプールされているのですが、その上限数を設定します。TargetFragmentより大きくしないと、例外が発生します。Fragment・・・破片を爆破対象とするかどうか、です。これをオフっておけば、爆破した破片にあたって爆破して、さらにその破片を爆破して・・・っていう永久ループを免れます!!Layer・・・破片オブジェクトのレイヤーを設定します。Colliders・・・破片のコライダをメッシュコライダにします。重たいので、非推奨とのこと。Colliders・・・オンにすると、破片にコライダが適応されません。Velocity・・・破片の最大速度を設定します。Velocity・・・破片の最大角速度を設定します。Physics・・・親オブジェクトの物理プロパティを継承します。Mass・・・破片の重量を設定します。Gravity・・・オンにすると、重力がかかります。Velocity・・・破片オブジェクトの角速度を設定します。MaxAngularVecocityで設定した以上にはならないっぽい。Velocity・・・角速度をランダムにします。オフの場合、自身でセットした値にすべてのオブジェクトが回転します。Rotation・・・回転しない軸を設定します。Material・・・破片のマテリアルを設定します。設定しない場合は、爆破されたオブジェクトのマテリアルが適応されます。Deactivation・・・破片の無効化を設定します。Camera/Timeoutから選択します。Particles・・・破片にパーティクルを付けることができます。以上を踏まえてやりたいことを整理しましょう。スフィアに青いキューブがぶつかったら、その青キューブのみを爆破。スフィアに赤いキューブがぶつかったら、赤いキューブの半径2m範囲で爆破。破片は爆破対象ではない。したがって、スフィアがぶつかっても爆発しない。3秒後にフェードアウト。設定値はコチラ!コードは、OnCollisionEnterをこんな感じにしてみました。Vector3.zero;}直接オブジェクトを爆破したい時はExplodeObjectを、周囲を巻き込みたい時はExplodeRadiusを使います。巻き込まれて爆破したいオブジェクトには、タグにExploderを設定しておきましょう。Runを実行したら、こんな画面が出てきた。Unityでapkをビルドする際、毎回上図のようなエラーが出るようになってしまいました。昨日までは、問題なくビルドできていたにも関わらず、です。PCのエクスプローラからは、Oculusが見えていました。OculusをPCとつなぎ直すたびに、Oculus側で「このデバイスとの接続を許可しますか?」のメッセージが出るようになってしまいました。原因なぜだか、OculusQuestの開発者モードが、勝手にOFFになっていたことが原因でした。なに勝手にオフってくれてんだよ!!開発者モード設定は、モバイルにインストールしているOculusソフトの設定>Oculus>その他の設定>開発者モードから確認できます。急にUnityがOculusを認識しなくなったら、Oculus側の開発者モードを疑おう勝手に開発者モードがオフられた原因は不明。TumblrOculusQuest、めちゃめちゃ楽しいです。あちこちでドハマリします。今回はポートフォリオ用に、VRでイライラ棒を作ってみました。SABER的な雰囲気で。え、似てない?光ってるだけやん?いいんだよ、雰囲気だから。いうことで、イライラ棒が出来上がるまでにドハマリした部分を(というかほぼ全部)ご紹介してきたいと思います。詳しいことは、次回から。記事にする内容をラインナップしてみます。QuestでのVRアプリ制作にハマッています。本日は衝突判定について、新たに知ることができたネタをご紹介します。基本中の基本かも知れないけど。Oculus関係ないけど。Integrationでは、手のアバターで物体をつかめるようにする機能が用意されています。それが掲題のOVRGrabberです。これを手のオブジェクトにアタッチするわけなのですが、詳細な使い方はまた今度ご紹介するとして。このスクリプトをアタッチしたオブジェクトには、ご覧の通りColliderはアタッチされていません。Rigidbodyはありますけど。コードを見てみましょう。コード内では、OnTriggerEnterとOnTriggerExitが実装されています。あれれ、Colliderを持っていないのにどうしてコールされるんだ??親オブジェクトがRigidbodyを持つ場合、子オブジェクトの衝突も検知できるということらしい。ためしにColliderなしのCubeを2個配置します。それぞれに子オブジェクトを作成し、そちらにBoxColliderをアタッチして実験してみました。親にRigidbodyなし版。親にRigidbodyあり版。親オブジェクトにRigidbodyを付けることで、子オブジェクトの衝突を検知できるOculusハマる。Questでビートセイバーやっていたら、腕が筋肉痛になりました。できれば上腕二頭筋ではなく、上腕三頭筋に効いてほしい。QuestHMDを外すとポーズになるゲームがあるビートセイバー等のゲームは、HMDを外すとポーズ状態になりますよね。その後15秒ほどすると、Oculus本体がスリープになります。スリープはOculus自体の設定ですが、ゲームのポーズはゲーム側で設定するようです。IntegrationにはOVRManagerというクラスが用意されています。こちらのisUserPresentというプロパティから、HMDの装着状態を取得することができます。developer.oculus.com↑相変わらず素っ気ない埋め込みリンクですがwOVRManagerのリファレンスです。