Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
非推奨;: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。
多くの WebVR ハードウェアは、ヘッドセットとゲームパッドがセットになっています。WebVR アプリにおいては、ヘッドセットとゲームパッドはゲームパッド APIを通じて接続されます。中でも、ゲームパッド拡張 API は、ゲームパッドの状態(controller pose)、触覚アクチュエータ(haptic actuators)などの情報を取得します。この記事では、その基礎となる部分を解説します。
メモ: WebVR API は WebXR API に置き換えられました。 WebVR は標準として批准されることはなく、ごく少数のブラウザーでしか既定で実装・有効化されず、少数の端末しか対応していませんでした。
WebVR API は初期段階ではあるが、開発者がウェブベースのバーチャルリアリティー経験を生み出すことのできるとても興味深いウェブの新しい機能です。コンピュータとつながっている VR ヘッドセット(VR ディスプレイ)へのアクセスを与えることで、ディスプレイをスタートしたり、ストップする操作ができます。動きのデータ(例:方向や位置)へアクセスして得られたデータは、各アニメーションループのフレームごとにディスプレイをアップデートするためなどに使用されます。
この記事を読む前提として、Web VR API の基礎についてすでに知っていることを想定しています。 — もしまだ WebVR API の使用 を読んでいない場合には、まずはそちらを読んでみましょう。その記事の中では、ブラウザー側がハードウェアの設定をサポートしたり、設定を要求したりすることについて詳しく説明しています。
ゲームパッド API はよくサポートされた API であり、 これを使用することで PC につながっているゲームパッドやゲームパッドに開発者がアクセスすることができるようになります。また、ウェブアプリケーションをゲームパッドやゲームパッドを通じて操作することもできるようになります。基本としてゲームパッド API は、ゲームパッドオブジェクトとしてつながっているゲームパッドに対してアクセスの許可を与えます。そしてどのボタンが押されているか、軸がどの方向に向いているかなどの情報を取得するよう要求します。
ゲームパッド API の基本的な使い方については、ゲームパッド API の使用やゲームパッド API を使用した制御の実装の中で詳しく知ることができます。
しかしながら、この記事では主に、位置、方向、触覚アクチュエーター(バイブレーション)などの高度なゲームパッド情報へのアクセスのような、ゲームパッド拡張 API で与えられたいくつかの新しい特徴に注目します。この API はとても新しく、Firefox 55+ Beta や Firefox Nightly のブラウザーでのみデフォルトで WebVR API がサポートされています。
VR ハードウェアに付随するゲームパッドには、2つの種類があります。
ここではいくつかのコードを紹介します。まず、Gamepad API を使用して VR ゲームパッドへの基本的なアクセス方法を見ていきましょう。いくつかのおかしなニュアンスを心に留めておきましょう、それは後から調べる価値があるものです。
シンプルな例を紹介します。-vr-controller-basic-info のソースコード (see it running live here also) を御覧ください。この例は VR ディスプレイやコンピューターと接続したゲームゲームパッドへ情報を出力するシンプルなものです。
最初のコードです。
ここでは、initialRun というトラッキングの変数を使います。これは、「このページを初めてロードした」ことを示します。この点については、あとで詳しく述べます。次に、Navigator.getVRDisplays() と Navigator.getGamepads()メソッドがあるかないかをチェックして、WebVR と Gamepad APIs がサポートされているかどうかを検知します。もし、サポートされていれば、検知するプロセスを OFF にするために、カスタム機能である reportDisplays() を実行します。 reportDisplays() は、以下のような構成になっています。
この関数は最初にプロミスベースの Navigator.getVRDisplays() メソッドを使用し、接続されたディスプレイを表す VRDisplay オブジェクトを含む配列を使用して解決します。次に、各ディスプレイの VRDisplay.displayId と VRDisplay.displayName 値、およびそのディスプレイに関連付けられた VRCapabilities オブジェクトに格納されている多くの有用な値が表示されます。これらのうち最も有益なのは hasOrientation と hasPosition で、これにより機器が向きと位置のデータを返すことができるかどうかを検出し、それに応じてアプリを設定することができます。
この関数に含まれる最後の行は setTimeout() 呼び出しで、 1 秒後に reportGamepads() 関数を実行します。なぜこのようなことが必要なのでしょうか?まず第一に、 VR コントローラーは関連する VR ヘッドセットがアクティブになって初めて準備が整います。そのため、getVRDisplays()が呼び出されてディスプレイ情報を返した後に、この関数を呼び出す必要があります。 2 つ目として、ゲームパッド API は WebVR API よりもずっと古く、プロミスベースではありません。後ほど説明しますが、getGamepads() メソッドは同期型で、Gamepad オブジェクトをすぐに返すだけです - コントローラーが情報を報告する準備ができるまで待つことはありません。少し待たないと、返された情報は正確ではないかもしれません(少なくとも、我々のテストではそうでした)。
reportGamepads() 関数は、このような構成になっています。
これは reportDisplays() と同じように動作します。プロミスでない getGamepads() メソッドを使用して Gamepad オブジェクトの配列を取得し、それぞれのオブジェクトを循環して情報を表示しています。
コントローラー情報を含むリスト項目には、それぞれ gamepad というクラス名を付けていることに注意してください。これが何のためにあるのかは、後で説明します。
最後に、initialRun 変数を false に設定します。これで初期実行は終わりです。
この章の仕上げとして、ゲームパッドに関連するイベントを見ていきます。1 人または 2 人です - gamepadconnected と gamepaddisconnected - そしてこれらが行うことはかなり明白です。
この例の終わりには、まず removeGamepads() 関数を記載しています。
この関数は、クラス名が gamepad であるすべてのリスト項目への参照を取得し、DOM から削除します。その後、reportGamepads() を再実行して、接続されているコントローラのリストを更新しています。
removeGamepads() は、ゲームパッドが接続または切断されるたびに、以下のイベントハンドラーで実行されます。
ここでは、スクリプト上部の初期化コードで行ったように setTimeout() を所有しており、各ケースで reportGamepads() が呼び出されたときにゲームパッドが情報を報告する準備ができていることを確認することができます。
しかし、もう一つメモがあります。 gamepadconnected ハンドラーの内部では、 initialRun が false のときだけタイムアウトが実行されることがわかると思います。これは、文書内の最初のロード時にゲームパッドが接続されている場合、ゲームパッドごとに gamepadconnected が発行されるため、 removeGamepads()/reportGamepads() が複数回実行されることになるからです。そのため、removeGamepads()は gamepadconnected ハンドラーの中で、最初の実行時ではなく、実行後に実行するようにしたいです。そのために initialRun があります。
実際の WebVR のデモで使用された Gamepad API を見てみましょう。このデモはraw-webgl-controller-example (ライブデモご覧ください).で見ることができます。
私達のraw-webgl-example (詳しくは Using the WebVR API を御覧ください。)と同じ方法で、このデモにおいても回転する 3D 立方体をレンダリングしています。また、これを VR ディスプレイへ投影することもできます。唯一の違いとしては、VR ディスプレイへ投影モードでは、VR ゲームパッドを使って立方体を動かすことができます。(オリジナルのデモ動画では、VR ヘッドセットを動かすことで、立方体を動かすことができる。)
以下に、このバージョンでのコードの違いをより詳しく紹介します。webgl-demo.js を御覧ください。
drawVRScene() 関数についてのコードの一部です。
Navigator.getGamepadsを利用して、ゲームパッドが接続されました。また gp 変数の中に最初に認識したゲームパッドを保存します。 デモでは、ゲームパッドを一つしか使用しないので、その他のゲームパッドは無視します。
次に行うことは、gpPose に格納されているコントローラーの GamepadPose オブジェクトを取得し (Gamepad.pose をクエリーして)、またこのフレームの現在のゲームパッドの位置と方向を変数に格納して、後で容易にアクセスできるようにすることです。また、 displayPoseStats() 関数を使用して、このフレームのポスト統計情報を DOM に表示します。この処理はすべて gp が実際に値を保有している場合(ゲームパッドが接続されている場合)にのみ行われ、ゲームパッドを接続していない場合にデモがエラーにならないようにしています。
コードの少し後に、このブロックを見つけることができます。
ここでは、接続されたコントローラーから受け取った position と orientation データに従って、画面上のCubeの位置を変更します。これらの値(curPos と curOrient に格納されます)は X、Y、Z の値を含む Float32Arrays です (ここでは X である [0] と Y である [1] だけ使用しています)。
変数 gp の中に Gamepad オブジェクトがあり、位置値を返すことができる場合 (gpPose.hasPosition) は、6DoF コントローラーを示しているので、位置と方向の値を使ってキューブの位置を変更しま す。前者のみが真の場合、3DoF コントローラーを示し、方向値のみを使用してキューブの位置を変更します。ゲームパッドが接続されていない場合、キューブの位置はすべて変更されません。
displayPoseStats() 関数では、GamepadPose オブジェクトのうちの表示したいすべての情報を取得することができます。そして、そのようなデータを表示するためのデモの中に存在する UI パネルに表示します。
この記事は、WebVR アプリの中で VR ゲームパッドを使うためには、どのように Gamepad Extensions を用いればよいのかというとても基本的な概念を解説したものです。実際の WebVR アプリの中では、VR ゲームパッドのボタンに紐付けられたゲームパッドにより、おそらくより複雑なコントロールシステムをもたせることになるでしょう。 そして、ディスプレイとゲームパッドの両方の情報(位置や方向)を同期的にディスプレイへフィードバックするという複雑な処理を行うことになります。しかし、この記事でやりたかったのは、Gamepad Extensions の中の純粋な Gamepad Extensions 部分を切り分けるということです。
This page was last modified on 2026年4月12日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.