Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【イベントレポ】: Japan VRFest銀座VR3

イベントのレポート(メモ)です。
参加したのはこちら、「Japan VRFest銀座VR3」
会場は銀座フェニックスホールさんです。

sites.google.com

ハッシュタグ : #銀座VR

 

f:id:Raspberly:20190914231627j:plain

f:id:Raspberly:20190914232004j:plain


 

 

9月16日追記

No16 株式会社ダズル様の展示作品に関する記述が抜け写真のみ掲載されており、
No17 あまた株式会社様の展示作品と誤認させるような表示となっておりました。
大変申し訳ありませんでした。現在は修正されております。

 

 

 

 

 

時間の関係で全て体験することはできませんでしたが、体験させていただいた作品を紹介します。
マップはこんな感じです。

f:id:Raspberly:20190914232237p:plain




 

No.6 VR猪鹿蝶 ナナキ(@nanaki_pg)

猪鹿蝶の各生き物をモチーフにしたVRゲーム(Oculus Quest)

 

鹿にまたがり、空を飛びながら家にプレゼントをシュートしていくゲームです。
後半のフィーバータイムはBGMのテンポアップも相まって大変焦ります。

コントローラーですが、鹿のレリーフ(っていうのかしら)とサメのぬいぐるみを選ぶことができます。
サメはもちろん、ぬいぐるみがコントローラーのゲームってかなりユニーク。

f:id:Raspberly:20190914231641j:plain

 

 

 

 

 

No.23 ハプティックデバイスでのバーチャル打楽器 岸本慎也(@hunyun_ )

Looking Glass

 

触覚デバイスを使った打楽器コンテンツ。
左右のペンのようなものを使い演奏していきますが、対象によってさわり心地が違います。
動かしにくかったり、引き込まれるような感触だったり、ぶるぶるしたりします。

f:id:Raspberly:20190914231700j:plain

 

 

 

 

 

No.12 懐中電灯 miyamo(@DMiyamo3)

懐中電灯コントローラーでLookingGlassに映し出される光と影のインタラクションが楽しめる作品です。
(Looking Glass)

 

懐中電灯とLookingGlassを使ったコンテンツ。
懐中電灯の横についているRealsenseで位置の取得を行っているとのこと。

f:id:Raspberly:20190914231712j:plain

 

 

 

 

 

No.21 VR海戦シューティングゲーム 最上土川

自ら戦闘艦になって大砲やミサイルをぶっ放し敵をやっつけよう!
タイトル「DD FLEET」
(Rift,RiftS, Quest)

 

VR海戦シューティングゲームです。
プレイヤーは手に連装砲などを装備、画面下部にはレーダーや現在の速度などHUDがあります。
砲撃とミサイルを使って洋上の敵を殲滅していきます。

 

 

 

 

 

No.18 MW Shock(ムゥ ショック) VR IMAGINATORS(with めーぷる

『無職』が『社畜』を救う、VR魔法アクション
カメラのファンダーを覗く指の動作で対象をロックオンし、より多くの『社畜』を苦しみから解き放て!
(Quest)

 

前回のすたみと#3でも展示されていた無職VR
両手でひし形を作って社畜をロックオン、ビームを撃って無職にし浄化するゲームです。
私のスコアは25でした、当時の最高スコアは26だったのでかなり上位かも!

f:id:Raspberly:20190914231731j:plain

 

 

 

 

 

No.20 市原 督之

前回のJapanVR Fest銀座に出展した「VR空間移動用いす型デバイス」の改良品になります。オフィスチェアを改造した入力デバイスです(VRのゲームできます。通常のディスプレイでもプレイ可能)。(1)いすに座った状態で上半身を前後左右に動かす(重心を偏らせる)ことで移動やジャンプをします。(2)いすを回転で進行方向の変更します。(3)振動モーターにより振動します。
(Rift,RiftS)

 

椅子をコントローラーにしたゲーム。
椅子に座った状態で、前に傾けると加速、横に傾けると平行移動、椅子自体を回すと方向転換できます。
視点が一人称視点と三人称視点の両方を選ぶことができ、操作のしやすさか没入感かを選択できます。

f:id:Raspberly:20190914231742j:plain

 

 

 

 

 

No.13 Mirror2.0(仮称) ドコカノうさぎ

自分自身と触れ合える鏡。現在~過去の自分の動きをトレースするもうひとりの自分と対峙する体験ができます。過去の自分と向きあうだけではなく握手したり髪に触れることができます。アバターを変更するとまるで生きているような動きで眼の前に現れます。その動きは過去の自分の動きなので極めて生々しいものになります。VRキラーコンテンツ「鏡」が次のステージに進化します。
(Quest)

 

モーションを録画し、再生できるシステムです。
少女と少年の二人を切り替えることができ、それぞれモーションを録画して最後に2つ再生することができます。
再生中は第三者の目線で二人を眺めることができます。

f:id:Raspberly:20190914231758j:plain

 

 

 

 

 

No.7 バレーボールVR しちE

サーブ、トス、アタックの気持ちいいとこだけを集めた、サクッとできるバレーボール!(Quest)

 

特定の動作をするだけで簡単にスーパープレイができるバレーボールコンテンツです。しかも観客の声援つき。動作はサーブ、トス、シュートなど。

f:id:Raspberly:20190914231807j:plain

 

 

 

 

No.26 パラレルパラソル(仮)こりん

(Quest)

傘をデバイスにした雰囲気コンテンツです。
体験自体は1分30秒ほどですが、傘を使って音を奏でたり、浮遊したりと独特な世界観と空気を体験できます。

 

 

 

 

 

 

No.10 VRシューティングゲーム あやり

魔法で敵を倒すシューティングゲームです。色んな方向から敵が来るので音を聞いて冷静に魔法を放ちましょう!!
(Quest)

 

全方位シューティングゲームです。
あちこちからモンスターが迫ってくるのでグルグル見渡しつつ魔法で迎撃していきます。
遠くだとなかなか当たらないので近くまで引き付けたいところですが、わらわら湧いてくるので注意!f:id:Raspberly:20190914231821j:plain

 

 

 

 

 

No.14 バーチャルメール 目玉P

仮想空間内で撮影したビデオをメールで送る。トップを狙えのホログラムメッセージみたいなイメージ。
(Quest)

 

OculuQuestで動作や音声を記録し、それをメールで送信しLookingGlassで再生できるシステムです。
ホログラムメッセージを送るという非常に未来的SF的なことができます。

f:id:Raspberly:20190914231830j:plain

f:id:Raspberly:20190914231846j:plain

 

 

 

 

 

No.17 Last Labyrinth(ラストラビリンス) あまた株式会社


VR時代の新しいアドベンチャーゲーム」をコンセプトに開発され、VRだから実現できる世界観と、仮想キャラクターとのコミュニケーションを体感できるVR脱出アドベンチャーゲームです。謎の館に閉じ込められたプレイヤーが、謎の少女「カティア」と力をあわせて数々の謎を解きながら館からの脱出を試みます。
イベント当日に整理券を配布し、時間指定での試遊となります。
体験時間はお一人様当たり5分~15分程度の想定です。
公式サイト:https://lastlabyrinth.jp/
(Rift,RiftS)

 

VR脱出ゲームです。
プレイヤーは椅子に縛られ、話すこともできない拘束状態です。
動けない代わりに、少女に目線や首の動きで指示を出し脱出を目指していきます。
例えばドアを指せば開けてくれるし、怪しい所を指せば調べてもらえます。


私は見事バッドエンドでした。
行動してくれるのは少女ですが、指示をだしているのは自分なので少女を巻き込んでしまったという罪悪感がすごい

ちなみに初見クリア率は20%ほどとのこと。

f:id:Raspberly:20190914231909j:plain

 

 

 

 

 

No.16 フリーロームVR(完成品とたぶんその時開発中のもの) 株式会社ダズル

(Quest)

 

ロケーションベースのVR作品、狂気の城を体験させていただきました。
いわくつきの館を舞台に懐中電灯片手に脱出を目指すホラーVRです。
難易度は高くありませんが、様々な恐怖演出に仕掛け・通路分岐などがあります。
懐中電灯のバッテリーが切れたらゲームオーバーなので、おぞましい部屋でも進まなければいけません。


ロケーションベースのためストアでのリリースではなく、各地の商業施設などで展示されております。

店舗ニュース詳細|有楽町マルイ

f:id:Raspberly:20190914231924j:plain

 

 

 

 

 

 

No.2 アテンド者の喋りも含めた観光VRコンテンツ でちでち

VR-CMS(https://virtua.work/ )を使用し、誰でも作れる、誰でも使えるVRコンテンツを用いてお仕事に役立つ物を作って見ようか、と。
VRは、オフィスに入り込まなきゃ普及しない。オフィスに入り込む為には、Unity使わずサクッと1日で使い物になるレベルの物が出来なきゃ、誰も使わない。
VRにおけるパワポのプレゼンテーションを目指し、企画-展示まで一括の手法として纏めた物を展示します。
柏の葉二子玉川羽田空港で合計2,900人に被らせ、十勝のファンを獲得した手法を展開します。
GOと、観光リーフレット、後はでちでちのしゃべり!!

 

 

Oculus Goを使った観光VRコンテンツです。
ゴーグルではなく持ち手で装着できるためとても楽。
犬ぞり体験やファイアーパフォーマンスなどを視聴できます。

f:id:Raspberly:20190914231934j:plain

 

 

 

 

 

 

感想

私は午後2時頃からエントリーしましたが、(混雑にもよるが)もう1時間ほど早くこないと全て体験はできないかも。
午後3~4時頃はTGSからの参戦者も増えてきて大盛況でした。
展示作品はOculusQuestが多めでしたが、バッテリー切れ問題があちこちで起きていた模様。


ちらほらお子様の参加もありましたが、LookingGlassなどの展示もあり十分楽しんでいかれたようです。
そしてパルマーラッキーさんとも初遭遇しました。

 

 

 

No.5 REFLECT-ON と No.15 BOW MANすたみと#3で、
No.11 パイロットクロスVRまつりで体験させていただきましたが、どちらも行列が長く断念。
吊るされる系のVRも同様でした。
ただし桜花一門さんによると、オフィスに来てくれれば必ず吊るしますとのこと。

raspberly.hateblo.jp

raspberly.hateblo.jp

 

 

 

全て体験はできませんでしたが、とても面白いコンテンツばかりでした。
展示された開発者の皆さんありがとうございました。

 

 

間違っている箇所、消してほしいツイート、
ブログに書いてほしくない内容などがありましたらコメントにお願いします。

【Oculus Quest開発メモ】物を掴むとき位置と角度を固定する part2【Unity】

今回はOculus Questの開発ネタをやっていきます。
内容的にはOculus Rift Sなどにもそのまま応用できるかと思います。

OVR Grabberなどで物を掴んだ時に、位置と角度を固定する方法について紹介します。

 

 

 

本記事は過去の記事の追記バージョンになります。
前回の記事にこのようなフィードバックをいただきました。

改めて見直すと完全に説明不足でした。本当に申し訳ありません。
前回をベースにGifと解説を増やしてお送りいたします。SnapOffsetをNullにする方法です。

f:id:Raspberly:20190913020415p:plain




 

 

 

開発環境

Windows 10

Unity 2018.4.5f

Oculus Integration ver1.40

Oculus Quest

ALVR

※ALVRだと、物を掴んだ時に人差し指が正常にアニメーションしないことがあります。
本記事の画像やGifでもたびたびありますが、機能的には何も問題ありません。

 

 

セットアップ

開発環境を整えていない方は先にこちらをどうぞ。

raspberly.hateblo.jp

参考

Unity で Android アプリをビルドするには - フレームシンセシス

Unity+Oculus Quest 開発メモ - フレームシンセシス

 

 

 

 

 

サンプルシーンの確認+準備

基本的な掴む投げる動作を学ぶことができるAvatarGrabシーンを使います。
OVR Grabber、DistanceGrabber共に動くのでDistanceGrabシーンでも特に問題はありません。

f:id:Raspberly:20190911231416p:plain

 

手を出す

ALVRでやる場合はこちらを参考に手を用意しておきましょう。
CustomHandプレハブをシーンに置くだけです。

raspberly.hateblo.jp

 

Hand.csの修正も忘れずに

raspberly.hateblo.jp

 

 

 

 

 

3Dモデルの用意

前回に引き続き、刀と銃のアセットを使用します。
自前で3Dモデルをお持ちでしたらそちらで構いません。

刀アセット Wakizashi

 
高品質な刀です。AssetStoreまとめさんでも紹介されていました。

www.asset-sale.net

ハンドガンアセット

弾丸やマガジンも含まれたハンドガンのアセットです。

 

 

 

 



3Dモデルの配置

まずステージ内に先ほどインポートした、刀と銃を配置します。
その前に、目の前のテーブルが少し狭いので邪魔なオブジェクトは予め非アクティブにしておきましょう。

f:id:Raspberly:20190912000346g:plain

Wakizashiプレハブをシーンに置きます。

f:id:Raspberly:20190911231748p:plain

この時、空のGameObjectを作りその中にWakizashiプレハブを子オブジェクトとして登録しておきます。
こうすると後々楽になります。今回はKatanaという名前をつけました。

f:id:Raspberly:20190912001136p:plain

そのままだと垂直に置かれるため、PositionやRotationを変えて寝かせるといいでしょう。

f:id:Raspberly:20190912001203p:plain

f:id:Raspberly:20190911232354p:plain

ついでに、Wakizashiプレハブの子オブジェクトにある_Collidersは非アクティブにしておきます。

f:id:Raspberly:20190912002019p:plain



 

Handgun_M1911A_Blackプレハブをシーンに置きます。
この3Dモデルにはマガジン(弾倉)がついていません。
同じフォルダ内にあるM11911A_Magazine_Blackを子オブジェクトにしてあげるといい感じになります。

f:id:Raspberly:20190911233006p:plain

ただし、そのままシーンに置くとスケール感がまったく合わないためこちらもTransformを調整します。

f:id:Raspberly:20190912000322p:plain

f:id:Raspberly:20190911233552p:plain

 

 

コンポーネントのアタッチ

配置しましたら、必要なコンポーネントをアタッチしていきます。
必要なのはOVR GrabbableコンポーネントRigidbodyColliderです。

Katanaオブジェクトのインスペクターを以下のようにします。

f:id:Raspberly:20190912001906p:plain


Handgunプレハブに直接アタッチしていきます。

f:id:Raspberly:20190912002143p:plain

 

刀銃共にコライダーは適当につけています。細かい調整はSnap設定後にしましょう。

f:id:Raspberly:20190912002251p:plain

 

 

 

 

これで掴むことができます。
ここまではOVR GrabberとOVR Grabbableの復習を兼ねています。

この状態だと、オブジェクトのどこでも掴むことができるので、刀の刀身をそのまま掴めます。

 f:id:Raspberly:20190912005415g:plain

 

 

 

 

 

Snapの設定

ここからが本題です。Snap機能を追加します。
今回は刀の方をメインで行います。銃も同じ手順で設定できます。

OVR Grabbableの設定

まずは、刀、銃共にOVR GrabbableSnap PositionSnap Orientationにチェックを入れます。
Snap OffsetはNullのままです。 

f:id:Raspberly:20190912004939p:plain

 

次にUnityエディターのHandle PositionをPivotにしておきます。(標準だとPivotのはず)
ここはボタンになっていて切り替えることができます。

f:id:Raspberly:20190912005638p:plain

 

Colldierの設定

今までは親オブジェクトにColliderを付けていましたが、3Dモデルに沿った当たり判定を付けたいため、
親ではなくMeshRendererのついた子オブジェクトにColliderをつけます。(最初からこうしてもよかったかも)

KatanaオブジェクトのBoxColliderを無効化、あるいは削除します。

f:id:Raspberly:20190913005248p:plain

 

WakizashプレハブにBoxColliderをアタッチします。この時パラメータも自動でいい感じに設定してくれます。
また、最初からついているRigidbodyを削除します。最終的に↓のような感じ。

f:id:Raspberly:20190913005940p:plain


最後にKatanaオブジェクトのOVR GrabbableにあるGrabPointsにWakizashiプレハブのBoxColliderを紐づけます。

f:id:Raspberly:20190913010144p:plain



 

 

Snapする位置と角度(刀の場合)

Katanaオブジェクトを選択してシーンビューを見てみましょう。
XYZの矢印が表示されます(この矢印のことをGizmo(ギズモ)といいます)
ここがKatanaオブジェクトの原点座標です
Katanaの場合、鍔の部分が原点になっていますね。

f:id:Raspberly:20190912011132p:plain



先ほど、OVR GrabbableのSnap OffsetをNullのままにしましたが、
ここがNullだとSnapしたときの位置と角度はオブジェクトの原点座標と同じになります

試しにこの状態のまま動かしてみると、どこを掴んでも鍔の部分にSnapされているのがわかります。

f:id:Raspberly:20190912011037g:plain

 

 

3Dモデルの位置調整

刀の場合、MeshRendererコンポーネントがあるのはWakizashiプレハブです。
そのため、Wakizashiプレハブの座標を掴ませたい位置と角度に合わせて移動してあげます。

f:id:Raspberly:20190913010919g:plain

何度か実行してテストしながら、手にピッタリ合った位置と角度を見つけましょう。

 

 

効率的な調整方法

OculusQuestで毎回ビルドしながら位置角度調節するのはなかなか苦行です。
できることならRift SかALVRを使い、Unityエディター上で調整しましょう。その方が手っ取り早いです。

 

 

以下やり方を紹介

まず、エディター上で起動し、手に持ったところで一時停止します。
そうしたら、シーンビューでWakizashiプレハブをいい感じの位置と角度に調整します。

(キーボードのQWERTキーで、編集モードを変えていくとスムーズに調整できます)

f:id:Raspberly:20190913012515g:plain

 

 

無事調整できたら、この時点のWakizashiプレハブのTransform値をコピーします。
プレイモード解除後に値はリセットされますが、そこに先ほどコピーした値を上書きします。

f:id:Raspberly:20190913013151g:plain



これで手にフィットした形に、Wakizashiプレハブの位置と角度が設定されました。

f:id:Raspberly:20190913013424p:plain

最後にWakizashiプレハブのTransformは変えずに、親であるKatanaオブジェクトの位置を調整して完成です。

刀のどこを掴んでも、掴んだ瞬間位置と角度が矯正されます。

f:id:Raspberly:20190913014510g:plain

 

 

銃オブジェクトも同様に設定できます。

f:id:Raspberly:20190913020821g:plain

これで、掴んだ時の位置と角度を固定できるようになりました。 

 

 

 

 

 

まとめ

SnapOffsetはnullのまま、子オブジェクトの3Dモデルの位置を調整する

 

 

 

 

 

 

別の方法について

とても使いにくいことで評判のSnap Offsetですが、@udo_nbaさんが大変わかりやすい記事を投稿しています。

qiita.com

作るのが面倒なSnapOffsetを簡単に作る方法を解説しています。
こちらも参考にしてみてください。

 

 

 

 

 

わかりにくい所、間違っている箇所がありましたらコメントにお願いします。
特に、「ここがよくわからん」「それどうやってるの?」「そんな項目ないんだが」など
詰まる箇所がありましたらドシドシコメントに書き込んでください。よろしくお願いします。

【勉強会レポ】: 夏のxR自由研究発表祭【すたみと#3 特別編】

勉強会のレポート(メモ)です。
参加したのはこちら、「夏のxR自由研究発表祭【すたみと#3 特別編】」
会場はDMM.comさんです。

standalone-vr.connpass.com

ハッシュタグ : #すたみと

 

f:id:Raspberly:20190910073952j:plain

 

今までStandalone VR Meetupでしたが、今回からStandalone xR Meetupになります。

xR(VR/AR/MR)に関する知見共有や作成したxR関連コンテンツを自慢する"祭"です。
エンジニア/クリエイター同士が気軽に自分の取り組みについて共有して楽しみましょう!
今回は特別編の為、スタンドアローンVRに限定せずxR関連の話題であれば何でも構いません!

 

 

 

 

 

 1. ARデザイン。アイデアのスピーディーな共有方法と、プロトタイプ作成まで 

今回紹介するのはアイデアの出し方とプロトタイプ手法

イデア出し Spatial大喜利

イデアブレスト法の一つ。Spatialにかけた大喜利をします。
かなり頭が柔らかくなります。

プロトタイプ手法

今回使うツールはFigma(デザインツール)とTorch(ARプロトタイプツール)。
まず体験のフローを洗い出し、どこまでが非AR体験で、どこからがAR体験化を考えます。

 

Figmaでのデザインを学びたい方は、こちらを参考に

note.mu

 

 

 

 

 

 

2. AR x α の掛け算でちょっと変わったXRコンテンツ作り

この業界、つよつよな人が多すぎる。

 

この中でどうやって生き残るかという生存戦略についてお話しします。
キーワードは技術の掛け算。

シンプルなものでも、掛け合わせることで新しい体験を実現できる

 

ARといろいろな技術や要素をかけあわせてきました。今回はその中からうまくいった作品を2つ紹介します

SPELL MASTER

AR * 文字認識 * 3Dモデル検索
英単語学習を魔法学習に変える魔法陣

PAINTER

ボールを当てて色を変えるブロックランプ

katakoto.tokyo


サンプルレベルのものを切り貼りしてパッキングしたものでも、このように新しい体験を作れます。

 

 

 

 

 

 

3. XR, VFXGraph and UniversalRP with SensitiveCube

パーティクルとVFXグラフの組み合わせについてと、Houdiniについて話します

 

 

 

 

 

 

 

4. Rift用で開発したゲームをQuestに移植したい!~DMM VR labの場合~

DMM VR labでBOW MANをリリースしました

bowman.vrlab.dmm.com


今回はRIft用に作ったBOWMANをQuestに対応させた話をします

そのままビルドした結果

・片手が消える
・描画がちらつく
・なんか重い

ちらつく問題

画像の解像度が低すぎたので修正

手が消える問題

マニフェストの修正

動作改善したこと

・背景のテクスチャは解像度を下げる
・影の表示は、的と敵キャラのみとする
・矢を撃った時のディストーションエフェクトを非表示に
・テクスチャの解像度を適度に下げ、影の描画を限定的にする。
Androidの最適化技法が割とそのまま役に立ちました。

 

 

 

 

 

5. Photogrammetry on Cloud

フォトグラメトリのお話

 

フォトグラメトリは写真から3Dモデルを生成する技術、ただしこれは結構ハードルが高い。
ソフトにお金がかかるし(オープンソースで対応)、GPUが足りない(いろいろ動かしているため忙しい)。

そこで他人のGPUでフォトグラメトリをしよう

Google Colab

Googleが用意している機械学習用のGPU環境、ブラウザから使えるし無料。

これとMeshRoomというソフトを使います。これをColab上で使います。
この辺は後日Qiitaで解説記事を投稿します。

使用制限

ただし制限があります、
・セッションがきれるとデータが全部飛ぶ
・連続稼働12時間まで
・MeshRoomはTPU非対応

 

まとめ、完全無料のクラウドGPU環境でフォトグラメトリ環境が作れる!

 

 

 

 

 

6. 〇〇でLチカしてみた

MRでLTをします。

 

今回はSTYLYでLチカやってみました
STYLYはVR空間やXR空間をウェブ上で作れて、他のプラットフォームで配信できるプラットフォームです。
LT資料は全てSTYLYで作りました。

 


STYLYはまだクエストに対応していないことに注意。

そこでSTYLYのGo版をみなさん遊んでいただいてレビューを書いてください。
これでOculusに圧力をかけていきましょう。(STYLE GOGOキャンペーン)

 

 

 

 

 

7. フォトグラメトリ×VR/MRの魅力と可能性

フォトグラメトリの魅力

・誰でも3dモデルを作れる時代をもたらす

誰でも写真や動画をとれるようになったように誰でも3Dモデルを作れるようになる

 

・写真、動画のようにアーカイブとして残し、新しい記憶媒体となる

建築物などをその状態のまま保存することができる

 

・人間の創造性を表現する新しいメディアとして機能する

新しい可能性を切り開いていける

 

ぜひフォトグラメトリにチャレンジしてみてください
そしてSTYLYに送ってください
簡単にVR空間を作ることができます

 

 

 

 

 

展示会 & 懇親会

展示作品の一覧です、これ以外にも野良展示がいくつかありました。
※時間の都合上、全て体験できていません。

 

タイトル / 展示者(敬称略) 内容 種別
① ARおさんぽ / @HhotateA_xR ARCoreとOculusQuest(VR)を連携させたおさんぽあぷり AR/VR
② MW SHOCK!(ムーショック) / @MapleSyrupCS6 社畜を魔法で浄化して無職にしてあげるゲームです! VR
VRクリエイティブプラットフォームSTYLY / @from2001vr STYLYで作られたコンテンツをVR/MRモードを切り替えながら複数人で同時体験できる新機能をご体験いただけます VR/MR
④ XXX / @XXX    
⑤ REFLECT-ON / @JackMasaki エフェクト盛り盛りの3Dエアホッケーゲーム VR
⑥ 自作6DoF ARグラス / @emonxmusic Realsense T265 + スマホ用AR HMDで6DoF AR体験。フォトグラメトリなお城をARで鑑賞出来ます。 AR
⑦ Mirror2.0 @patsupyon 過去の自分と触れ合える鏡アプリケーション(OculusQuest用) VR
⑧ きんくら @z_zabaglione てっぺんを目指す筋肉クライマーとなって、ボクセルユニティちゃんの踏破せよ! VR
VRクリエイティブプラットフォームSTYLY

STYLYとMirageSoloによる、VR空間やMR空間を複数人で体験できるコンテンツ。
VRモードではお互いの位置がHMDで表示されるため、ぶつかることなく移動できます。
(ただし手が当たることはある)

f:id:Raspberly:20190910081546j:plain

 

BOW MAN @DMM VR Lab

銃を撃つVRはたくさんありますが、これは弓を使うシューティングゲームです。
左手で構え、右手で弦を引く操作は多少慣れが必要ですが、レティクルがあるので狙いはつけやすいです。
ステージクリア型のカジュアルゲームですが、二人プレイもできるらしい。
現在はRiftとRift S向けがリリースされています。

f:id:Raspberly:20190910081602j:plain

BOW MAN公式サイト

きんくら @z_zabaglione

ボクセルユニティちゃんにクライミングするゲームです。
手をめり込ませトリガーボタンを押すことで捕まることができます。
スラスラと登れますが、達成感だけでなく程よい疲労感もありとても面白かったです。
場合によってはぶら下がりながら進むことも。

f:id:Raspberly:20190910081619j:plain

REFLECT-ON  @JackMasaki

Oculus Questによる対戦型3Dエアホッケーです。
ボタンの操作は行わず、Touchコントローラーの移動のみでホッケーを行います。
通信はこのつよつよルーターさんによって行われているらしく、遅延などはまったくありませんでした。

球の軌道予測線が表示されているので、何が何だかわからないまま負けることはありません。
途中から球が増えてくるので大変忙しくなります。

 

3Dエアホッケーは少し前にOculus Questハッカソンで作ったことがありますが。
REFLECT-ONは、より操作やシステムが洗練されているためとても遊びやすかったです。

raspberly.hateblo.jp

 

REFLECT-ONは今週の銀座VRでも展示されるようです。

JapanVRFest 銀座VR3

 

SPELL MASTER & PAINTER

セッション2で登場したPAINTERを体験させていただきました。

スマホの画面をスワイプし、ボールを飛ばします。
飛ばしたボールがキューブにぶつかるとキューブのライトの色が変わるというAR作品です。

ただのARと違い現実世界のオブジェクトに影響を与えられるのが特徴。

f:id:Raspberly:20190910081905j:plain

 

 

 

 

 

 

タイムライン

 

 

 

 

 

 

前回のすたみとはこちら

raspberly.hateblo.jp

 

 

 

 

本記事は引用ツイートをしています。
間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。

【アセット紹介】Advanced Dissolve でディゾルブエフェクトを作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはAdvanced Dissolveです。
オブジェクトのディゾルブエフェクト(消滅エフェクト)を実装できるアセットです。

f:id:Raspberly:20190909151427p:plain

有料アセットですが、頻繁に50%オフセールが行われています。

 

 

去年のUniteTokyo2018で電脳少女シロ様にも紹介いただいたアセットです。

f:id:Raspberly:20190909110349p:plain

www.youtube.com



 

 

※この記事にはGifが多く使われています。軽量化していますが読み込みまで時間がかかる恐れがあります。

 

 

どんなアセット?

これはオブジェクトやTextMeshProをディゾルブさせるアセットです。
ディゾルブとは融解を意味し、オブジェクトの消滅や出現を表現できます。

モバイルやVR、LWRPにも対応しています。

f:id:Raspberly:20190909003621g:plain

f:id:Raspberly:20190909020523p:plain

f:id:Raspberly:20190909025203p:plain







 

 

サンプルシーンの確認

DemoとExampleが用意されています。

Demo

Demoシーンは別途インポートする必要があります。

f:id:Raspberly:20190904213430p:plain

f:id:Raspberly:20190904213645p:plain

f:id:Raspberly:20190904214137p:plain

アセットストアのイメージでも登場しているシーンを確認できます。

f:id:Raspberly:20190909003621g:plain

ちなみにUIのCanvasの設定で画面上に全て表示されません。

f:id:Raspberly:20190909003611p:plain


Sample

こちらもマスクを使ったディゾルブシーンがたくさんあります。

f:id:Raspberly:20190909032741g:plain

 

 

 

 

 

 

 

クイックスタート

付属のドキュメントに従ってとりあえず動かしてみます。
シーンを新しく作りましょう。

単純なディゾル

単純なディゾルブエフェクトから入ります。

スフィアの作成

CreateからSphereを作り、AdvancedDissolveShaderを使ったマテリアルを割り当てます。
この段階ではまだディゾルブエフェクトはでません。

f:id:Raspberly:20190908223243p:plain



マテリアルの作成

作るマテリアルはこんな感じ。シェーダーの種類はたくさんありますが、とりあえず今回は
VacuumShaders/Advanced Dissolve/Legacy Shaders/Bumped Diffuseを使います。

f:id:Raspberly:20190905225654p:plain

 

CutoutのSourceからCustom Mapを選択します。

f:id:Raspberly:20190905230930p:plain

Textureにはノイズの画像を設定します。
ノイズの画像は20種類ぐらいあるので好きなものを選びましょう。今回はD_1を使います。

f:id:Raspberly:20190905231320p:plain

これでディゾルブエフェクトがでます。
Mask/Dissolveのスライダーを動かすとシーンビューから確認できます。
テクスチャ、ブレンドマッピングモードは複数あります。

f:id:Raspberly:20190908230154g:plain

また、RenderFaceオプションで、前面だけあるいは背面だけレンダリングといったこともできます。
デフォルトだと両面レンダリングです。

f:id:Raspberly:20190908225836p:plain

 

 

動的なマスクディゾル

Planeを使って動的なディゾルブエフェクトを使うことができます。

マテリアルの設定

MaskのTypeをPlaneに変更します。

f:id:Raspberly:20190908230559p:plain

この時、描画が変になりますが仕様です。問題ありません。

f:id:Raspberly:20190908231535p:plain

動的なマスクはマテリアルエディター内にパラメータを持ちません。(一部を除く)
そのため別のスクリプトから更新してあげる必要があります。

Planeの作成

Create/3D Object/PlaneからPlaneをシーンビューに配置します。
真っ白いPlaneが出来上がりますが、少し見た目を整えます。

PlaneのMeshRendererからマテリアルを変更します。
アセットに付属しているMaskマテリアルを使いましょう。

f:id:Raspberly:20190908231916p:plain

f:id:Raspberly:20190908231843p:plain

Maskコンポーネント

シーン内に空のゲームオブジェクトを作成し、Controller_Mask_Planeコンポーネントをアタッチします。
このコンポーネントはTutorial_PlaneMask_Controllerに似ていますが、
複数のマテリアルを最大4つのマスクオブジェクトで同時に更新できます。

f:id:Raspberly:20190908232031p:plain

コンポーネントのMaterialsには、最初に作ったディゾルブ用にマテリアルを、
Plane1には先ほど作ったPlaneをそれぞれ紐づけます。

f:id:Raspberly:20190908232253p:plain

これで完成です。

Planeの位置よってディゾルブされているのがわかります。

f:id:Raspberly:20190908232645g:plain

 

ポストプロセスでもっと見た目をきれいに

PostProcessingStakを使ってディゾルブをきれいにします。

カメラの設定

カメラにPostProcessingStakc v2を設定します。

f:id:Raspberly:20190908235753p:plain
詳しくはこちら

tsubakit1.hateblo.jp

マテリアルの設定

EdgeからShapeをSmoothに、Intensityを2にします。
Shapeは好みでいいとおもいます。Intensityは値が大きければ大きいほど輝いて見えます。

f:id:Raspberly:20190908233611p:plain

これで完成です。 

f:id:Raspberly:20190909000210g:plain

Colorから色を変えることもできます。

f:id:Raspberly:20190909000242g:plain

 

Invertでマスクを反転

重要な機能としてInvertがあります。これはマスク処理を反転させる機能です。
マスクの外側にいるとディゾルブする状態マスクの内側にいるとディゾルブする状態の2つを作ることができます。

 

設定は非常に簡単です。
MaskコンポーネントのInvertにチェックを入れるだけです。
これによりマテリアルのInvertにも自動的にチェックが入ります
(というよりもマテリアルのチェックを手動で切り替えられなくなります)

f:id:Raspberly:20190909010202p:plain

試しに先ほど作ったディゾルブマテリアルを複製し、Maskコンポーネントももう一つ追加してInvertにチェックを入れます。

これでマスクの外側内側でディゾルブする対象を分けることができます。

f:id:Raspberly:20190909010432g:plain

これにより2つの世界を切り替えるといった表現も作れます。

 

 

 

 

 

 

 

実演 ユニティちゃんをディゾルブ 

ここから実践です。
ユニティちゃんをディゾルブしてみます。
アセットストアから「SDこはくちゃんズモデル」をインポートします。

 

マテリアルの設定

こはくちゃんズのマテリアルを編集します。
編集前に複製してバックアップをとっておくといいかもしれません。

f:id:Raspberly:20190909005620p:plain

基本的な設定はクイックスタートのマテリアルと一緒です。
シェーダーをVacuumShaders/Advanced Dissolve/Legacy Shaders/Bumped Diffuseに変えます。

f:id:Raspberly:20190909010816p:plain

この時、マテリアル全体が少し灰色っぽくなることがあります。
これはSurfaceInputのMainColorを真っ白にすることで解決します。

f:id:Raspberly:20190909011041p:plain

 

コンポーネントの設定

こちらもクイックスタートと同様にします。

f:id:Raspberly:20190909012059p:plain

 

あとはシーン内にユニティちゃんのプレハブを置くだけ。

f:id:Raspberly:20190909014432p:plain

これで完成です。とても簡単。
ユニティちゃんの消滅/出現エフェクトを作ることができました。

f:id:Raspberly:20190909014214g:plain



 

他の使い道

キャラクターモデルだけでなく、ステージの3Dモデルにも当然使えます。

2つの世界

こちら、「保健室+冬服」と「教室+夏服」の2つの世界をディゾルブで切り替えています。
保健室にはトーコちゃんが、教室にはマリエちゃんがいます。

f:id:Raspberly:20190909030723g:plain

f:id:Raspberly:20190909030810g:plain

InvertマテリアルInvertではないマテリアルを作り、それぞれを同じPlaneでディゾルブさせています。

教室と保健室のアセットはUTUTUYAさんのものを使わせていただいています。
少し前のほぼ半額セールの時に購入しました。

 

 

 

アセットによっては細かい設定が必要

物によってはマテリアルのシェーダーを差し替えるだけではうまくいかない場合もあります。

例えばThe Phantom Knowladgeのユニティちゃんのように元のマテリアルが少し複雑だと、
色がやテクスチャの設定が抜け落ちることがあります。↓の場合髪の色が白になっている。

f:id:Raspberly:20190909015253p:plain

こうなると手動でいろいろと設定しなければなりません。

 

 

 

 

 

描画を切る分軽くなるのか

ディゾルブされると画面上には描画されません。
オクルージョンカリングのように、軽くなっているように感じますが、
実はドローコールは普通に呼ばれています。プロファイラーを見ても軽くなっていません。

なのでディゾルブしたオブジェクトは、使わないのであればSetActiveなどで非アクティブ化したほうがいいでしょう。

 

 

 

 

 

まとめ

Advanced Dissolveを使うとノンコーディングでディゾルブエフェクトをつけることができる。

設定方法はマテリアルのシェーダーを差し替えるだけ。(ケースバイケース)

ただしドローコール自体は呼ばれている。

 

 

今回はPlaneのみでしたが、BoxやSphereなど特定のメッシュに合わせてディゾルブをかけることができます。

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

 

他間違っている箇所、わかりにくい所がありましたらコメントにお願いします。

 

© Unity Technologies Japan/UCL
この記事に含まれている画像はユニティちゃんライセンス条項の元に提供されています

【イベントレポ】: VRまつり2019夏

イベントのレポート(メモ)です。
参加したのはこちら、「VRまつり2019夏」
主催はPANORAさんです。

atnd.org

ハッシュタグ : #VRまつり

 

 

●スケジュール
・15:00〜 開場&風呂フリータイム
・18:00〜 OP、GOROman&桜花一門 この4年を振り返る弾丸トーク
・18:30〜 懇親会&VRデモタイム
・20:00〜 懇親会終了&再お風呂タイム

 

 

 

 

 

 

今回は懐かしのVRまつり復刻版に行ってきました。

会場は永山健康ランド 竹取の湯です。

f:id:Raspberly:20190901112506j:plain

 

 

 

会場&風呂フリータイム

18時から開始なので、それまではフリータイムです。
お風呂や岩盤浴が楽しめます。

f:id:Raspberly:20190901112705j:plain

 

タイムライン

 

 



 

OP、GOROman&桜花一門 この4年を振り返る弾丸トーク

2時間の飲み放題とからあげ祭りのはじまりです。
最初はごろまんさんと桜花一門さんによるトークショー

f:id:Raspberly:20190901130822j:plain

f:id:Raspberly:20190901130836j:plain

Oculusの読み方

Oculusをオキュラスと発音するようになったのはごろまんさんが由来とのこと。
他ではオキュラスで通用しないらしい。

正しい読み方は「アキュラス」に近い。
これは日本語に存在しない音なのでカタカナでは正確に発音できない音だからです。
英語の正しい発音をすると笑うのは日本人の悪いとこ

 

未来の話

2013年や2014年のわくわく感がなくなった。
2017年から停滞していると言われるが、それは2016~2018年で「できること」「できないこと」がはっきりしたから。
これはドローンも同じで、これからは地に足のついたVRがでてくる。
我々が見たいのは地に足のついていないVR

 

銀座VR

コンセプトは「パルマーが驚くようなものを見せたい」
新作に限定しているのはそのため。
日程は9月14日、TGSビジネスデイの後になります。

JapanVRFest 銀座VR3

 

タイムライン

 

 

 

 

 

 

懇親会&VRデモタイム

ここからは懇親会タイムです。お酒を飲みながら語らう人、VRデモを体験する人など。

ちなみにこの時点で、からあげはほぼ全滅状態でした。

 

自分のデモ展示であまり見て回ることができませんでしたが、同じ島で見させていただいた作品を紹介します。

 

レンチキュラーレンズによってLookingGlassのような立体視ができるデモ

f:id:Raspberly:20190901140047j:plain

 

VRフライトレース「パイロットクロス」のデモ
独特の浮遊感を持ったフライトゲームです。
慣性がありますが、ブレーキですぐに止まれるのですっ飛ぶことはありません。
慣れてくるとかなりすいすい動けます。

f:id:Raspberly:20190901140059j:plain

こちら収益化を視野にいれているようですので、みなさんフォローお願いします。

 

 

タイムライン

 

 

 

 

 

 

 

作品展示

懇親会にて、お手製のVRゲームの展示を行いました。持ってきたのはマスコット大逃走VRです。
逃走中のようなゲームで、時間いっぱいまでハンターから逃げるというゲームです。
自分だけでなく他の逃走者もNPCとして参加しています。

f:id:Raspberly:20190901152603g:plain

 

こちらは去年のマスコットアプリ文化祭2018で応募したゲームを、2日かけVR無理やり移植したものです。

元々はWebGLビルドしたブラウザ向けのゲームです。↓のリンクから遊ぶことができます。

マスコット大逃走 v1.5f | フリーゲーム投稿サイト unityroom

 

 
オリジナル版は好きなキャラクターを選んで、プレイすることができました。

f:id:Raspberly:20190901152452g:plain

 

移植に当たってやったこと

Oculus Integrationを導入して、カメラを置き換えてuGUICanvasをWorldSpaceにしたくらいです。
実は最適化などは一切やっていません。やる時間なかった

元々ローポリなステージにSDキャラの組み合わせなのでそこまで負荷がかからないようにしてますが、
OculusQuestでも問題なく動きました。
実機でのプロファイラーでも大体100fpsぐらいは確保できています。

f:id:Raspberly:20190901145618g:plain

 

VR版でオミットされた機能

時間がなくて実装できなかった機能

・タイトル画面(30秒で作った簡素なものを急遽用意)
・ステージセレクト
・他の逃走者が確保されたときに、その場所にドクロマークを表示する機能

f:id:Raspberly:20190901142243p:plain

ダッシュ機能 (それに伴って通常の移動速度を早めにしています)
・ポーズ機能、ミニマップ機能
・クリア後のツイート機能

 

 

体験会では多くの方に体験していただきました。
このゲームはBGMがない代わりに常に心音が鳴っており、
ハンターが近くにいると心音が激しくなるというシステムを取り入れていますが、とても受けが良かったです。
中には一回もハンターに出会わずにクリアする方、安置を見つけた方もいました。

 

課題点としては集客用にポスターみたいなのを作っておいたり、PCにミラーリングで表示など。
体験待ちの方や、どんなコンテンツなのか見に来た方用に必要かなと思いました。

 

 

 

 

 

 

感想

学生の頃でしたがVRまつりは過去にも参加したことがあり、
学校の備品であるDK2を持って行って展示も行ってました。

atnd.org

peatix.com

それからしばらくVRから離れていましたが、
Questの発売を機にVR開発を開始して、今回のイベントで久々の作品展示をさせていただきました。

昔会ったことのある方もたくさんいてとても楽しかったです。
作品の方もいろいろフィードバックがいただけたので、改善に取り入れていきます。

 

第二新卒が使える内にVR業界(またはゲーム業界)に転職したい身なので、
これを機に開発実績を増やしていきたいところ。

 

 

 

 

 

過去の関係してそうなイベントレポ

raspberly.hateblo.jp

raspberly.hateblo.jp

raspberly.hateblo.jp

raspberly.hateblo.jp

 

 

引用ツイートをしています。

間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。

【勉強会レポ】: Unity道場8月〜イケてるエフェクトの作り方と、Uniteを256倍楽しむ為に知っておくべき知識〜

勉強会のレポート(メモ)です。
参加したのはこちら、「Unity道場8月〜イケてるエフェクトの作り方と、Uniteを256倍楽しむ為に知っておくべき知識〜」
会場はユニティ・テクノロジーズ・ジャパンさんです。

meetup.unity3d.jp

f:id:Raspberly:20190830011522p:plain

ハッシュタグ : #Unity道場

 

動画はこちらから


Unity道場8月〜イケてるエフェクトの作り方と、Uniteを256倍楽しむ為に知っておくべき知識〜

 

 

 

 

1. エフェクト作成のために知っておきたいShader Graphの話

本日のデータはgithubから確認できます

ShaderGraphの特徴

・ノードベースで作れる
・エンジニアだけでなくアーティストでも使える
・SRPの登場によりパイプラインごとにシェーダーを書かなければいけないつらみを吸収する
・逆にBuiltInでは動かない

 

今回作るエフェクト

今回はこんな感じのエフェクトを作っていきます。
これらには以下のようなポイントがあります。

f:id:Raspberly:20190830002211p:plain

それ以外のポイント
・ノーコーディング
・オフィシャルなものだけ使う
・DCCツールを使わない(がフォトショを使います)

エナジー・シールド

詳しい手順は動画を参照してください。

 

ポイント

・マテリアルは2つ
・揺らぎを描画の方が先

ゆらぎエフェクト

ゆらぎは汎用的に使えます
・ガラスや水流、トレイルなど

 

たつまき

主にモデリングとUV

モデリング

ProBuilderで作りましたた
だしパーティクルとして使うには、メッシュデータをアセットとして登録する必要があります。
Probuilderでは標準でできないので設定から変えましょう。

UVスクロール

ノイズテクスチャをしきい値にカットアウトして実装
アニメーションはParticleSystemで行う

今回使いませんでしたが、ParticleSystemにはvertex streamという強力な機能があります。

ノイズを与える

ノイズを表示しスクロール
ShaderGraphにはノイズテクスチャが3種類用意されています
ただしタイリングできないことに注意、こういう時はフォトショを使うしかない。

安原さんが解決方法をQiitaに載せています。

頂点アニメーション

ParticleSystemで表現できない動きを作れる
ピクセルシェーダーと違い処理が軽い

 

関連する動画の紹介

learning.unity3d.jp

learning.unity3d.jp

learning.unity3d.jp

 

 

 

 

 

 

 

 

 

 

2. Unite Tokyo 2019の講演を256倍楽しむための基礎知識

今年の特徴

・全員UnitePartyに参加できる
・講演と出展ブースが隣接しているので移動が楽
・VIPクラス 特別な特典
・他クラスにもラウンジがあります
・各時間最も人気のある講演はサテライト会場で上映されます

新企画アーリーチェックインデイ

事前のパス引き換えが行われます。
限定グッズの先行販売も。

Unite Tokyo 2019 - Unity

今年の会場

グランドニッコー東京台場

最寄り駅は、台場駅(ゆりかもめ)、東京テレポート駅(りんかい線)
バスで行けるパターンもあります。(要確認)

メシ事情

ダイバシティ、パレットタウンあたり
VIPの方はランチビュッフェがあります。


朝来るとドーナツがもらえるという噂があります

懇親会でもらえることが確定しました

 

 

 

 

本題 楽しむために知っておくべき知識

レンダーパイプライン

これまでのBuiltInとSRP(LWRP・HDRP)
2つを把握しておくとよいでしょう

BuiltIn

・安定している、機能も豊富
・機能の削除や無効化による最適化ができない

まだまだBuiltInでも大丈夫
新しいレンダリングシステムはまだ開発途中
ただし絵作りの基本は新システムでも変わりません

LWRP

・全てのプラットフォームに対応
・ShaderGraph、VFX Graphなどに対応
・カスタマイズしやすい
・BuiltInとは非互換、一部機能は使えません

なにが対応していて何が対応していないのかスプレッドシートで見ることができます

connect.unity.com

まだわからないという方はこちらをどうぞ

learning.unity3d.jp

テラシュールブログもあるよ

tsubakit1.hateblo.jp

 

LWRPの名称が変わります、新しくUniversalRPになります

 

HDRP

・リアリスティックな映像向き
・次世代機やハイエンドなコンシューマ向け
・デフォルトの状態でも機能が豊富
・正式リリースは2019.3以上

 

パイプラインの選択

フォトリアルなものはHDRP、他の者ならLWRPかBuiltin
2021年以上ではLWPRがメインになるでしょう。

 

オススメの講演

f:id:Raspberly:20190830005925p:plain

f:id:Raspberly:20190830005854p:plain

 

 

DOTS

新しいアーキテクチャのこと
このDOTSは3つのテクノロジーを指します
・ECS
C# Jobsytem
・BurstCompiler
この3つでパフォーマンスをゲットします


DOTSで作るメリット

・たくさんのオブジェクトが出せる
オープンワールドが作れる
・ロードが早くなる

つらいところ

・データ指向プログラミングの経験がないとつらい 
・学習コストがかかる
・機能が潤沢ではない


ではどうするのか

技術の先行投資をし、差別化を図りたいなら少しづつ始めてみましょう
試したい方は、海外のYoutuberでチュートリアル動画があるのでオススメです。

www.youtube.com
オススメの講演

f:id:Raspberly:20190830010721p:plain

f:id:Raspberly:20190830010752p:plain
CEDECでも公演します。

 

 

パーティクルを作りたい

おすすめはVFX Graph

・表現力が上がる
・対応プラットフォームが多い
・Houdiniとの相性がいい
・AssetStoreに代替機能がない

ぜひ習得してほしいツールの筆頭

ShaderGraph
オススメの講演

f:id:Raspberly:20190830011025p:plain

 

他にもいろいろ公演があります。
ぜひタイムテーブルを確認してみてください

events.unity3d.jp

 

 

 

 

 

 

 

懇親会

f:id:Raspberly:20190830011408j:plain

 

 

 

 

 

 

タイムライン

 

 

過去のUnity道場

raspberly.hateblo.jp

 

 

 

感想

前半はShaderGraphの実践的な使い方、
後半戦では、最近話題のUnity新機能がとてもわかりやすくまとまっていました。

これは個人的な知見ですが、スライド公開・動画公開されないものを優先的に受講するのも手だと思います。
それ以外のものは後から見直すことができますが非公開のものはそうはいかないからです。
去年のUniteですと「ゲームの中の質感」が非公開の講演でしたが、とても面白かったです。

 

 

宣伝

Unite直前の9月23日に、とと様主催のUniteTokyo2019前々前夜祭が行われます。
現在参加枠が埋まっていますが、増枠する可能性があるため興味のあるかたは参加登録しておきましょう。

connpass.com

 

 

 

 

 9月はUniteがあるためUnity道場はお休みです。

 間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。

【Oculus Touch開発メモ】拳で物を殴る、指でつっつく【Unity】

 

今回はOculus Touchの開発ネタをやっていきます。
使う機材はOculus Questですが、Oculus Rift Sでもそのまま使うことができる内容です。

 

Oculus Questをお持ちの方は公式チュートリルアプリであるFirst Stepsをプレイ済みかと思われます。
ãFirst Stepsãoculusãã®ç»åæ¤ç´¢çµæ

www.oculus.com


このコンテンツは物を掴んで投げるだけでなく、拳(握った状態)で殴ることができ、
人差し指を立てた状態でツンツンすることもできます。

f:id:Raspberly:20190817175200g:plain


これは今までやってきたAvatarGrabなどにあるOVR Grabberではできないことです。

f:id:Raspberly:20190817175249g:plain



そこで今回は拳で物を殴ったり、指でつんつんするなど、手を使った物理挙動を作ってみます

f:id:Raspberly:20190826133057g:plain

f:id:Raspberly:20190828231129g:plain

 

 

 

 

 

 

 

 

開発環境

Windows 10

Unity 2018.4.5f

Oculus Integration ver1.39

Oculus Quest

ALVR

 

 

 

アプローチ

OVR Grabber(とそれを継承しているDistance Grabberなど)では
掴むといった判定はすべてIsTriggerで行われます。
つまり、CustomHandやAvatartGrabでは物理衝突を行うことができません

 

探してみたところ、OculusIntegration内に物を殴るといった機能はないようです。(あったらごめん)
そのため、手に沿ったコライダーを付け、物理衝突を制御するコンポーネントを独自実装していきます。

 

 

セットアップ

始めてVR開発をする方はこちらを参考にしてみてください

raspberly.hateblo.jp

既にこちらを終えてあることを前提として進めていきます。

 

 

 

サンプルシーンの確認

Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
学習や挙動の確認にとても有益です。見てみましょう。

今回はお馴染み、AvatarGrabシーンを使っていきます。

f:id:Raspberly:20190816190502p:plain

 

 

 

 

OVR Fist

今回はOculusIntegrationにない機能ですので独自コンポーネントを実装していきます。
その名もOVRFistコンポーネントです。

github.com

インスペクターパラメーター

f:id:Raspberly:20190828233101p:plain

Controller

HandやOVRGrabberにあるものと同じです。
右手であればR Touch左手であればL Touchを選択します。

 

 

 

 

 

実際に使ってみる

手の用意

あらかじめ手を用意しておきましょう。

raspberly.hateblo.jp

 

手っ取りばやく用意するのであれば、CustomHandプレハブをそのまま使いましょう。

f:id:Raspberly:20190817184608p:plain

AvatarGrabにあるLocalAvatarWithGrabの中に右手と左手を加えます。
最初から入っているAvatarGrabber2つは非アクティブにしておきましょう。

f:id:Raspberly:20190817223758p:plain

 

ついでにLocalAvatarWithGrabの中にあるOvrAvatarコンポーネントも無効にしておきます。

f:id:Raspberly:20190828232236p:plain





 

 

余談ですが、デフォルトのCustomHandプレハブは左右の手でマテリアルが違います
見た目を統一したい場合はマテリアルを差し替えましょう。

変え方は前回の記事で紹介しています。

 

 

 

 

 

手に当たり判定をつける

まずは手に当たり判定をつけましょう。
AvatarGrabなどの手には最初からCapsuleColliderがついていますが、これはGrab用のIsTriggerなものです。
当然物理衝突はしません。

f:id:Raspberly:20190818174456p:plain


そのため物理衝突をするコライダーを手の形に沿ってつけていきます。
手にはSkinnedMeshColliderがついているのでMeshColliderをつけたいところですが、
MeshColliderはメッシュの変形に対応していないので、プリミティブなコライダーを組み合わせて再現します。

 

使うのはこちらのアセット「SAColliderBuilder」

複雑な形の3Dモデルでも簡単に当たり判定をつけることができるアセットです。

詳しくはこちらで解説されています。

kan-kikuchi.hatenablog.com

 

 

SAColliderBuilderの設定

SA Bone Collider Builderのアタッチ

このコンポーネントはAnimatorのあるオブジェクトにアタッチする必要があります。
CustomHand内にある、hand_skeltal_lowersにSA Bone Collider Builderをアタッチします。

f:id:Raspberly:20190825125038p:plain

 

Animatorがアタッチされているのが目印。

f:id:Raspberly:20190825131840p:plain

 

 

コライダーの生成

SABoneColliderBuilderのインスペクターを編集します。

・Shape TypeをCapsule
・Optimize Rotationのチェックを外す
・Rigidbody IsCreateのチェックを外す
最後にProcessを押して生成

f:id:Raspberly:20190828081729p:plain

これでいい感じにコライダーが生成されます。
片手が終わったらもう片方の手もやりましょう。

f:id:Raspberly:20190825145601p:plain

 

 

テスト段階で偶然見かけましたが、コライダー生成時にRigidbodyをつけ、IsKinematicを外すと。
手のメッシュが崩れとんでもないことになります。
似たような現象が起きた方はRigidbodyあたりを確認してみましょう。

f:id:Raspberly:20190827083621g:plain

 

 

 

動作確認

ここまでできたら実際に動かしてみたいところですが、このままでは問題があります。
なんとせっかくつけたコライダーが実行時に無効化されてしまいます。

 

犯人はHandコンポーネントです。
Handがアタッチされている子オブジェクトのコライダー(IsTriggerでないもの)はStart時に無効化されます

// Collision starts disabled. We'll enable it for certain cases such as making a fist.
m_colliders = this.GetComponentsInChildren<Collider>().Where(childCollider => !childCollider.isTrigger).ToArray();
CollisionEnable(false);

 

OVRFistではここも考慮しています。

 

 

 

 

OVRFistの設定

GitHubからOVRFistを持ってくる

GitHubからOVRFistを持ってきます。

github.com

Handオブジェクトにアタッチ

これをHandコンポーネントやOVRGrabberコンポーネントがある同じオブジェクトにアタッチします。
ちなみにOVRGrabberコンポーネントは必須ではありません。

f:id:Raspberly:20190828233209p:plain

インスペクターのControllerパラメーターを変更します。
右手であればR Touch左手であればL Touchに設定します。

 

これで終わりです。

 

 

 

 

 

操作方法

First Stepsとほとんど同じ操作感です。

HandTrigger(中指のボタン)を握っている間のみ拳の当たり判定が有効になります。
ただし、OVRGrabbableが掴める範囲内にある場合は掴むことを優先します。

f:id:Raspberly:20190826133057g:plain

物を放り投げて殴り飛ばすこともできます。

f:id:Raspberly:20190828231129g:plain

 

 

 

 

まとめ

SAColliderBuilderを使えば簡単に手に当たり判定をつけることができる。

OVRFistコンポーネントで拳に物理的な衝突判定を実装できる。

 

 

 

 

 

 

 

 

参考文献

 

movie-impression.com

kan-kikuchi.hatenablog.com

 

 

 

おまけ OVR Fistのコードについて

正直OVR Grabberのm_grabCandidatesをPublicにして直接参照すればOnTriggerなどは不要になりますが、
できるだけOculusIntegrationのコードに手を加えたくないためこういう書き方になっています。

 

これに限らずOculusIntegrationのコードにいろいろ手を加えている方は、
アップデートのたびに手直しする必要がでてくるので注意しましょう。
あるいはアップデートしないというのも手です。

 

 

 

 

 

おまけ Handコンポーネントのバグ?

OculusIntegrationに含まれているHandコンポーネントにはバグがあります。
Handには子オブジェクトにあるIsTriggerではないコライダーを全て無効化するCollisionEnable()があります。
このメソッドが子オブジェクト全てのコライダーの有効化無効化を切り替えていますが、
同時にコライダーのあるオブジェクトのスケールも変更しています。

 


この時、有効化時にはCOLLIDER_SCALE_MAXを適応しなければならない所がCOLLIDER_SCALE_MINになっています。m_collisionScaleCurrentもなんかおかしい。
このままでは、例えコライダーが有効化されてもスケールが小さいままです。。

private void CollisionEnable(bool enabled)
{
    if (m_collisionEnabled == enabled)
    {
        return;
    }
    m_collisionEnabled = enabled;

    if (enabled)
    {
        m_collisionScaleCurrent = COLLIDER_SCALE_MIN;
        for (int i = 0; i < m_colliders.Length; ++i)
        {
            Collider collider = m_colliders[i];
            collider.transform.localScale = new Vector3(COLLIDER_SCALE_MIN, COLLIDER_SCALE_MIN, COLLIDER_SCALE_MIN);
            collider.enabled = true;
        }
    }
    else
    {
        m_collisionScaleCurrent = COLLIDER_SCALE_MAX;
        for (int i = 0; i < m_colliders.Length; ++i)
        {
            Collider collider = m_colliders[i];
            collider.enabled = false;
            collider.transform.localScale = new Vector3(COLLIDER_SCALE_MIN, COLLIDER_SCALE_MIN, COLLIDER_SCALE_MIN);
        }
    }
}

 

正しくはこうなるはずです。

if (enabled)
{
    m_collisionScaleCurrent = COLLIDER_SCALE_MAX;
    for (int i = 0; i < m_colliders.Length; ++i)
    {
        Collider collider = m_colliders[i];
        collider.transform.localScale = new Vector3(COLLIDER_SCALE_MAX, COLLIDER_SCALE_MAX, COLLIDER_SCALE_MAX);
        collider.enabled = true;
    }
}
else
{
    m_collisionScaleCurrent = COLLIDER_SCALE_MIN;
    for (int i = 0; i < m_colliders.Length; ++i)
    {
        Collider collider = m_colliders[i];
        collider.enabled = false;
        collider.transform.localScale = new Vector3(COLLIDER_SCALE_MIN, COLLIDER_SCALE_MIN, COLLIDER_SCALE_MIN);
    }
}

それとも、このままの方が正しいのだろうか、よくわからん。

 

 

 

 

 

今までGistなどを使ってましたが、今回初めてGitHubでコードを公開しました。
READMEの書き方とかおかしい所、他間違っている箇所がありましたらコメントにお願いします。