投稿者アーカイブ: jmp

UnityでOculus Questの開発を始める

以前の投稿でOculus Rift S向けのコンテンツ制作の準備を説明しました。Oculus Rift Sは有線端末で、PCに依存しますが、Oculus Questは単体で動きます。PCも不要で、邪魔なコードもありませんが、処理をすべて端末で行っているため、表示できるコンテンツに制限があります。とはいえ、十分に楽しめる品質のVR体験が作れます。 Unityの準備 Unityの準備についてOculus Rift Sのチュートリアルで説明しましたが、Oculus Questを利用したい場合、重要な注意点があります。Oculus QuestはAndroid端末ですので、基本的にスマートフォンと同様に開発を行います。そのために、Unityをインストールする時にAndroid開発に必要なモジュールを必ずインストールしなければなりません。 もし「Android Build Support」モジュールを選択せずにUnityをインストールしていれば、Unity Hubで簡単に追加することができます。 Android関連のモジュールをインストールする時に利用規約に同意しなければなりません。 これでUnityの準備が終わります。 Oculus Questの準備 Oculus QuestはPCを使わないので、設定をスマートフォンの「コンパニオンアプリ」で行います。 iPhone版はこちらでAndroid版はここからダウンロードしてください。 Oculusアプリを利用するためOculusアカウントまたはFacebookアカウントが必要ですが、新規のOculusアカウントを作成することができなくなりました。 Oculusアプリをスマートフォンで立ち上げて、ログインが終わるとデバイスタブで新しいデバイスを追加します。 追加したい端末を選択すれば、スマートフォンで非常にわかりやすい説明が流れるのでここでは省きます。 OculusアプリとOculus Quest本体の準備が終わったら、Oculusアプリで重要な設定を追加で行います。デバイス一覧からQuestを選択して、「開発者モード」設定をタップします。 開発者モードを有効にして、Unityで作ったアプリを動かせるようにします。 これでOculusアプリでの設定が終わりますが、USB接続で開発PCとつなげられるようにしなければなりません。この設定では開発PCにもOculusアプリのインストールが必要です。Oculus Rift S開発と同様に公式サイトからダウンロードしてインストールしておいてください。 開発者モードを有効にして、PCにOculusソフトウェアをインストールしてからOculus Questの付属のUSBケーブル(兼充電ケーブル)でOculus Questと開発PCを接続します。(ケーブルはUSB Cなので、USB C対応のポートがあるのを確認しましょう。) Oculus Questを装着するとこのような画面がVR空間で表示されます。 Oculus Linkを有効にするかと聞かれます。Oculus Linkは通常単独で動くOculus QuestをOculus Rift SのようにPCに接続して使うモードです。Unityで開発する時に有効にしましょう。 PC側ではOculusアプリが自動的に起動するはずです。 画面に表示される指示に従ってすすみます。 端子がUSB-Cでもポートの速度が遅すぎる場合もあります。他のUSB-Cポートがあれば接続しなおしてみてもいいです。ここで設定が完了するとUnityに移りましょう。 UnityでOculus Quest用のプロジェクトを準備する Oculus Rift Sとまた同様にUnity Hubで新しいプロジェクトを作成して、VRテンプレートを選択します。 VRテンプレートを初めて立ち上げる時に英語で警告が表示されます。 […]

Unityの新しいInput SystemでOculusを使用する

以前のチュートリアルでUnityで作成したコンテンツをOculus Riftで表示できるところまで進みました。Oculus RiftでもOculus Questでも便利なOculusコントローラーを使います。Unityの従来の入力システムが、なんといえばいいでしょうか、まあ、あまりよくないです。そのために全く新しいInput Systemが導入されました。パワフルで柔軟性がありますが、その分、複雑になりました。ドキュメントもまだ不十分で使いにくい印象を与えてしまいますが、基本を理解すれば、むしろ従来のシステムより非常に使い勝手がいいです。 Input Systemの準備 新しいInput Systemは標準でプロジェクトに追加されないので、パッケージマネージャでインストールする必要があります。 最初はプロジェクトに追加されているパッケージしか表示されないので、「Unityレジストリ」を選択して、インストール可能な標準パッケージを表示します。 「Input System」をインストールします。 そこで、重要なお知らせが表示されます。旧入力システムから新システムに移行するためにプロジェクトの設定を変える必要がありますとの事です。必ず、絶対に「Yes」を押してください。 そうするとなんとUnityが再起動します。クラッシュではなく正常の動作です。 アクションの登録 新しいInput Systemは同じゲームがさまざまなデバイスで、さまざまなコントローラで遊べるように設計されています。設定を簡単に切り替えるためにアセットとして保存されます。シンプルなコンテンツなら一つのインプット設定ファイルで十分です。 アセットメニューから新規の「Input Actions」ファイルを作成します。(Input Systemパッケージがインストールされていないと表示されません。) 「DefaultActions」など、分かりやすい名称を付けます。 このアセットをダブルクリックして編集します。 プレーヤーが引き起こすイベントをアクション(Action)といいます。アクションは基本的に自分で必要に応じて追加して定義します。Move(移動)、Jump(ジャンプ)、Fire(撃つ)などなど。複雑なゲームので、操作方法を切り替えたい場合、アクションを複数のアクションマップ(Action Map)でまとめる事ができます。例えば、戦闘の時のアクション、会話の時のアクション、メニューの時のアクションなどを別々のアクションマップで設定することができます。 今回は単純なゲームを作るので一つだけのアクションマップを使います。新しいアクションマップを追加して、「Oculus Actions」という名称を付けます。(アクションマップの名称は自由です。) 次は新しいアクションを追加します。今回は動作確認のためにキューブを落下させたいですので、「Drop」アクションを追加します。 デフォルトのアクションの「New action」の名称を変えるだけでいいです。 アクションをもっと追加したい時は「+」ボタンを押して追加していきます。 次の重要な概念はバインドです。分かりにくいプログラミング用語ですが、単純にこのアクションを引き起こす時にプレーヤーはどうすればいいのかという設定です。一つのアクションに複数のバインドを登録する事ができます。例えば、「弾を撃つ」というアクションはキーボードのCtrlキー、エンターキー、マウスの左ボタン、ゲームコントローラーのトリガーボタンなど、いくつもの操作方法を登録することができます。今回はプレーヤーが右手のOculusコントローラーのトリガーボタンを押したらキューブが落下するという風に登録します。 「Drop」アクションの表示を展開して、「<No Binding>」を選択します。 「Binding」の「Path」でプレーヤーの操作を選びます。「XR Controller」でAR・VRコントローラーを選択します。 「Oculus Touch Controller」を選ぶと… 左手(LeftHand)と右手(RightHand)のどちらかを選びます。 ここにいくつもの操作がリストアップされます。「Button」で終わる操作はボタンが押された時を意味します。「Touched」で終わる操作はプレーヤーが該当の入力を触れるだけで反応します。スティックだけ押す操作が「Clicked」になっています。コントローラーの入力デバイスの名称とそのバインドはこちらです。 「triggerPressed」を選択しますが、他の操作でも登録してもいいです。 入力設定の編集が終わったら忘れずに設定を保存します。 保存すれば設定画面を閉じます。 アクションを受け取る 登録したアクションに反応してほしいゲームオブジェクトに「PlayerInput」というコンポーネントを追加します。今回のチュートリアルではCubeになります。 PlayerInputコンポーネントに使用する設定を指定しないと動作しません。Actionsパラメータで先ほど作成した設定アセットを選択します。 初期値になっているので変更する必要はありませんが、Behaviorパラメータを必ず「Send Messages」をしておきましょう。アクションが起きた時に様々な形で通知を受け取る事ができますが、「メッセージを送信」という方法から説明します。この方法ではC#のスクリプトで通知を受け取ります。 プロジェクトでスクリプト用のフォルダーを用意します。(整理整頓!) この中に「ObjectDrop」というスクリプトを作成します。 この「ObjectDrop」をCubeに追加します。まだ書いていませんが、ObjectDropスクリプトはPlayerInputと連動するので必ずセットで使います。 スクリプトをダブルクリックしてコード編集ソフトウェアで必要なスクリプトを書きます。 void OnDrop()から始まる部分だけを追加します。このOnDropというのは「On」(起きた時に)と自分で設定したアクション名で構成されています。波括弧の中にアクションが起きた時に実行するコードを書きます。ここは自分自身のゲームオブジェクト(gameObject)に「Rigidbody」という種類のコンポーネントを追加する指示をします。Rigidbodyは物理演算を影響を受けるようにするので、追加することで重力で落下します。 Unityに戻って、再生ボタンを押すと右手のトリガーボタンを押したらキューブが落下します。 […]

UnityとOculus Rift SでVR開発を始める

Unityの準備 UnityとOculus Rift Sのヘッドセットで仮想現実のコンテンツ制作を始めるための準備をここで紹介します。 まず、使用するUnityのバージョンを確認しましょう。このチュートリアルで利用しているのはUnity 2020.3です。バージョンによって設定の違いがあるので注意してください。Unityの準備はUnity Hubアプリ経由で行います。 Unityをインストールする時に日本語の言語パックをインストールしてUIが日本語で表示されるようにしておきましょう。 Oculusソフトウェアの準備 Unityの他にOculusのソフトウェアもインストールする必要があります。Oculusの公式サイトからソフトウェアをダウンロードして、インストールします。 Oculusハードウェアの準備 次はハードウェアの準備です。コントローラとヘッドセットを箱から取り出します。コントローラーは左右に単三電池を入れなければならないので、取っ手部分を下にずらして開けます。 次はヘッドセットのコネクタをPCに繋げます。USB端子は必ずUSB 3対応のポートに指しましょう。(通常は端子同様に青などで色が付いています。)映像コネクタはDisplay Portになっています。これは非常に重要な注意点です。Display PortからMini Display Portへのアダプタが付属されていますが、Oculusの公式ドキュメントによれば、HDMIアダプタはサポートされていないそうです。 じゃあ、ゲーミングノートPCなど、グラフィックボードの性能が十分で、Display Portが付いていないコンピュータの場合、非推奨でもUSB-C → Display Portまたは、HDMI → Display Portのアダプタを試すしかありません。試していないので何とも言えませんが、ネットの口コミではアダプタによって動作したりしなかったりするそうです。やはり、残念ながらDisplay Port対応のPCが無難です。 Oculusの初期設定 始めてOculus Riftを使う時、ユーザーアカウントの登録と初期設定を行います。 こちらも残念ですが、Oculusを利用するためにFacebookアカウントが必要です。新規のOculusアカウントを作成することが出来なくなりました。ユーザー登録が終わったら、接続の確認やファームウェアのインストールを経て、VRが体験できます。最後に「First Contact」というインタラクティブ空間が楽しめます。 終了方法が意外と分かりにくいです。バーチャル空間で動作をするのではなく、現実世界のキーボードのEscキーを押してOculusのホーム画面に戻ります。Oculusでの作業はここで終わります。 自作のアプリをOculus Riftで動かすために、Oculusのデスクトップアプリの設定を変えます。設定の一般タブで「提供元不明」のアプリを許可します。 Unityでテストプロジェクトの作成 すべてのソフトウェアとハードウェアの準備が終わったらUnityで新しいプロジェクトを作成して、動作を確認しましょう。Unity Hubで新しいUnityプロジェクトを作成します。 プロジェクトのテンプレートはリストの下の方にある「VR」を選びます。初めて使う時に、「ダウンロード」を押してから利用できます。プロジェクト名と保存場所を指定して、作成します。 VRテンプレートで作成したプロジェクトを始めて立ち上げると非常に重要な警告が(英語で)表示されます。 要するに、次の設定が必要です。編集メニューからプロジェクト設定を開いて、「XR Pluggin Management」でOculusを有効にしなければなりません。 プロジェクト設定を閉じて、エディターで再生ボタンを押すと接続されているOculus Riftでシーンが表示されます。されるはずです。が、こういうエラーが出る可能性があります。 コンソールで詳細を確認すると、コンピュータの再起動を試してくださいとのことです。確かに、再起動して、Unityを立ち上げて、Oculus Rift本体(下の部分)にある起動ボタンを押して、もう一度再生してみると見事にゲーム画面でも端末でも動作が確認できました。 新しいシーンを作る では、起動しているSampleSceneではなく、自作の新しいシーンを作りましょう。まず、SampleSceneにある「XRRig」オブジェクトが非常に便利なので、プレハブとして保存しておきましょう。整理整頓が大事ですので、新しい「Prefabs」フォルダーを作って、そこにXRRigを追加します。 空(Empty)の新しいシーンを作成します。 照明がないと何も見えないのでとりあえずディレクショナルライトを一つ追加しておきます。そして、先ほどプレハブ化したXRRigをシーンに追加します。XRRigはカメラと両手のコントローラーが入っているのでカメラの追加は不要です。XRRigの位置を(0, 0, 0)にしておきましょう。さらに、テスト用にキューブも一つ追加します。 「Cube」はカメラから見える位置に移動します。 再生するとお馴染みのUnityの空が仮想現実で現れます。これからフィールドの制作など、通常の3Dゲームと同様に進められます。

Rubyで動画を造ろう

実験のために大量の単純な動画が必要になった。Flashなどで一つ一つ丁寧に作るという手はもちろんあった。今考えてみればそれほど時間はかからなかったかも知れないが、最近はもっぱらプログラミングに没頭する日々が多いせいかそういう単純労働をやる気になれない。やれやれ。どうしよう。多少恥ずかしい気分に襲われた。昔、僕ってMaxの名人と言われたことがなかったっけ?MaxとJitterなら出来ると言えば出来る。Maxを使いたいかというと、ふむ、まあ、特に使いたいと思わないのが本音だ。コードを書きたい。いや、コードを書くのが今の自分にとって自然なんだ。 ということで、Rubyでモーショングラッフィクス的な動画が作れないかと挑戦してみた。 この挑戦にとりあえず必要なツールは2つ。まず、描画はRCairoで行う。RCairoはCairoライブラリーのRubyバインディングだ。CairoはIllustratorなどのようにベクトル・グラフィックが描けるかなりパワフルなライブラリーだが、Rubyist Magazineにて日本語の紹介記事が読める。RCairoを使えば、静止画が簡単に書き出せるが動画は無理だから、RCairoで描いた絵をなんとか動画に変換する必要がある。いろいろ試した結果、結局短い動画ならフレームを1つ1つ画像ファイルに出力し、FFmpegでその画像たちを動画に仕上げるという戦略を選んだ。一見面倒な手法に見えるかも知れない。でも意外と楽で、画像を書き出した後、FFmpegでいろいろと圧縮設定を変えたりして動画を手軽に書き直すことができる。 では、まずFFmpegを入手する。便利なツールだからこんなプロジェクト以外にも役立つ。入手方法はいろいろあるが、OSXならHomebrewを使った方がおすすめ。 Homebrewそのもののインストール。ターミナルで以下のコマンドを実行する: ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" そしてHomebrewの初期処理を行う: brew doctor FFmpegをインストールする: brew install ffmpeg 最後にRCairoもインストールする: gem install cairo それで下準備ができた。早速コードを書こう。とりあえず簡単な絵の画像を書き出してみよう。 require 'cairo' width = 1280 height = 720 pixel_format = Cairo::FORMAT_ARGB32 surface = Cairo::ImageSurface.new(pixel_format, width, height) context = Cairo::Context.new(surface) context.set_source_rgb(0,0.1,0.333) context.rectangle(0,0,width,height) context.fill() surface.write_to_png("test.png") 上記のスクリプトを実行すれば… おおおおお!こんな奇麗な画像が出来上がった。 すばらしい。すばらしい。でも大したことはやっていない。Cairoで描画する前にサーフェイス(面)とコンテキストが必要。絵画で例えるとサーフェイスがキャンバスでコンテキストが筆だ。基本的にコンテキストを通して描画を行う。行7でサーフェイスを作る。その際、ピクセルのフォーマットと画像の幅と高さを指定する。ここで使うピクセルフォーマットは32ビットのRGBA(各チャンネルは8ビット)。 次はいよいよ描画だ。Contextのset_source_rgbメソッドで色を指定する。アルファチャンネルを使用するならset_source_rgbaを使う。ここは奇麗なブルーにする。次の行は長方形を描くように見える。しかし、長方形が描かれるのは次の行のcontext.fill()だ。そう。Illustratorを使っている人なら基礎中の基礎だが、ベクトル絵には「塗り」と「線」がある。英語では塗りのことを「fill」といい、線は「stroke」だ。つまり、ここで長方形を塗るという指示を出している。最後にサーフェイスのwrite_to_pngメソッドでPNGファイルを出力する。 では、何かを動かそう。 require 'cairo' width = 1280 […]

DMX 512の基礎

「DMX 512」、通称「DMX」は照明や舞台効果を制御する為の通信プロトコルです。制御信号を発信するコントローラとその信号に反応する機器(デバイス)の通信方式を定める規格です。