13
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScriptを使い、Webブラウザでデバイスを振動(バイブレーション)させる

Posted at

はじめに

A-Frameを使いWebVR制作をしていたのですが、画面内のアイテム選択時にデバイスを振動させたくなりました。
が、A-Frameにコントローラーを振動させるメソッドは無さそうです。

結果、デバイスごとに振動させる方法を見つけましたが、日本語ドキュメントが全然なかったのでQiita投稿しておきます。

スマホの場合

かなりシンプルに実装できます。

var duration = 200; // 振動時間
navigator.vibrate(duration);

Vibration API - 開発者ガイド | MDN

Can I useによると、IEやOperaはまだしも、Safari未対応はキツい…
ブラウザ未対応なので、Safariで振動させることは現状できなさそうですね。
Can I use... Support tables for HTML5, CSS3, etc

VRコントローラー、ゲームコントローラーの場合

本来やりたかった本命はこちら。
VRでWebブラウザを開き、コントローラーで狙ったターゲットを選択した時に振動させる方法。

シンプルに振動させるだけなら、このコードでいけます。

var duration = 200; // 振動時間(ミリ秒)
var value = 0.5; // 振動の強さ(0.0〜1.0)
var gamepads = navigator.getGamepads && navigator.getGamepads();
for (var i = 0; gamepads.length; i++) {
  var gamepad = gamepads[i];
  gamepad.hapticActuators[0].pulse(value, duration);
}

ドキュメントはこちら
GamepadHapticActuator.pulse() - Web API | MDN

A-Frameを使ったサンプル

WebVRを簡単に構築できるA-Frameで導入してみましょう。

<html>
  <head>
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
    <script>
      AFRAME.registerComponent('vibration', {
        schema: {
          duration: {type: 'int', default: 200},
          value: {type: 'number', default: 0.5}
        },
        init: function() {
          this.onClick = this.onClick.bind(this);
          this.el.addEventListener('click', this.onClick);
          this.el.setAttribute('class', 'collidable');
        },
        onClick: function(e) {
          navigator.vibrate(this.data.duration); // スマホ用振動
          // oculus touch等のコントローラー振動
          var gamepads = navigator.getGamepads && navigator.getGamepads();
          for (var i = 0; gamepads.length; i++) {
            var gamepad = gamepads[i];
            gamepad.hapticActuators[0].pulse(this.data.value, this.data.duration);
          }
        }
      });
    </script>
  </head>
  <body>
    <a-scene>
      <a-sky color="black"></a-sky>
      <a-entity cursor="rayOrigin: mouse"></a-entity>
      <a-entity laser-controls raycaster="objects: .collidable; far: 5;"></a-entity>
      <a-plane vibration width="1" height="1" position="0 0.5 -2"></a-plane>
    </a-scene>
  </body>
</html>

Oculus QuestのWebブラウザで見たところ、こんな感じで右手コントローラーからレーザーが出て、白い四角を狙ってボタンを押すと振動します。

vr.jpg

13
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?