tag:crieit.net,2005:https://crieit.net/tags/WebVR/feed 「WebVR」の記事 - Crieit Crieitでタグ「WebVR」に投稿された最近の記事 2019-08-18T15:51:43+09:00 https://crieit.net/tags/WebVR/feed tag:crieit.net,2005:PublicArticle/15332 2019-08-18T15:51:04+09:00 2019-08-18T15:51:43+09:00 https://crieit.net/posts/A-Frame-VR-5d58f5583988c A-FrameでVRモードに切り替える方法を追加する <p>A-Frameはページ表示時にはVRモードではなくブラウザで表示するための通常の3Dモードで描画されており、右下のメガネボタンをクリックするとVRモードに切り替わる。</p> <p>ただしこれを使わなくても適宜自由にVRモードに切り替えたりVRモードから脱出したりすることができる。</p> <p>具体的にはsceneコンポーネントにそれらのメソッドが用意されている。</p> <h2 id="VRモードに切り替えるメソッド"><a href="#VR%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89">VRモードに切り替えるメソッド</a></h2> <p>例えばボタンをクリックしたときなどにVRモードに切り替えたい場合は下記のような形。</p> <pre><code class="javascript">document.querySelector('a-scene').enterVR() </code></pre> <p>exitVRというメソッドもある。</p> <h2 id="イベント"><a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88">イベント</a></h2> <p>VRモードに切り替わったり出たりした場合にイベントが発生するのでそのタイミングで処理を入れることも出来る。具体的には<code>enter-vr</code>や<code>exit-vr</code>イベント。</p> <p>他にもフォグ(霧のようなエフェクト)を入れたりもできるためちらっとドキュメントを見てみると面白い。</p> <p><a target="_blank" rel="nofollow noopener" href="https://aframe.io/docs/0.9.0/core/scene.html">Scene – A-Frame</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15197 2019-07-03T22:06:49+09:00 2019-07-03T22:09:21+09:00 https://crieit.net/posts/Oculus-Quest Oculus Questのコントローラの角度が謎 <p>A-FrameでOculus Questのコントローラを使う場合、oculus-quest-controlsコンポーネントを使うことができる。この動きに連動して銃を撃つようなアクションを作っていたのだが、どうもどうやっても角度が合わない。そのためちょっと調べてみたところ謎の角度になっていることがわかった。</p> <h2 id="ベースの角度"><a href="#%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%A7%92%E5%BA%A6">ベースの角度</a></h2> <p>手を真下に下ろしているような状態がベースの角度となり、x, y, zともに0になる。</p> <h2 id="上下の動き"><a href="#%E4%B8%8A%E4%B8%8B%E3%81%AE%E5%8B%95%E3%81%8D">上下の動き</a></h2> <p>その状態からそのまま手を上に上げるとxの角度。段々と180に近づいていき、そのまま後ろに行くと-180度から-0に近づいていく。</p> <h2 id="左右の動き"><a href="#%E5%B7%A6%E5%8F%B3%E3%81%AE%E5%8B%95%E3%81%8D">左右の動き</a></h2> <p>次に真下の状態から左右方向に手を上げるとzの角度。手を右方向に上げていくと180に向かっていき、左方向に傾けると-180度に向かっていく。</p> <h2 id="yの傾き"><a href="#y%E3%81%AE%E5%82%BE%E3%81%8D">yの傾き</a></h2> <p>yの傾きは、手を真下に下ろしたまま手の位置を固定したまま自分が手を中心に回るような動きとなる。これがちょっと不思議。</p> <p>左回りに回転させると、段々と90度に近づいていく。ところが、90度を超えてからは今度はだんだんとそのまま0に近づいていく。右回りも同様で、段々と-90度に近づき、そこを経由して0に戻っていく。</p> <p>ここの挙動が他と変わっているおかげで連動して生成する物体の傾きがどうしてもうまくあわなかったっぽい。</p> <p>もしかしたら知っている人からすれば一般的な話なのかもしれないが、とりあえずメモ。</p> <p>ちなみにダンプは適当に<code>a-text</code>を配置してそれに値を<code>setAttribute('value', value)</code>して直接VR上で見た。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15174 2019-06-29T22:02:34+09:00 2019-06-29T22:02:34+09:00 https://crieit.net/posts/Oculus-Quest-aframe-teleport-controls Oculus Questのコントローラでaframe-teleport-controlsを使う <p>A-Frameには <a target="_blank" rel="nofollow noopener" href="https://github.com/fernandojsg/aframe-teleport-controls">aframe-teleport-controls</a> という、VR空間内を近くにテレポートしつつ移動するためのコンポーネントがある。</p> <p>VR空間内は勝手に自分のカメラの位置が移動してしまうと乗り物酔いと同じ原理で酔ってしまう。そのためそれを避けるためテレポートが役立つ。</p> <p><a href="https://crieit.now.sh/upload_images/db533b3a0aed988d0281041f4b51b36b5d176052239d0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/db533b3a0aed988d0281041f4b51b36b5d176052239d0.png?mw=700" alt="" /></a></p> <p>ただ、Oculus Questで試すとこのリポジトリにかかれているサンプルのコードだとデフォルトでは動かない。というのも、上記の画像のとおりにコントローラが違うためデフォルトで設定されているボタンが異なる。</p> <p>下記のようにボタンを例えばトリガーボタンに変更したりすれば動作するようになる。これで簡単にワープすることができる。</p> <pre><code class="html"> teleport-controls="cameraRig: #cameraRig; teleportOrigin: #head; button: trigger;" </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15163 2019-06-24T19:48:11+09:00 2019-06-25T09:12:57+09:00 https://crieit.net/posts/TypeScript-A-Frame TypeScriptでA-Frameのコンポーネントを書く <p>TypeScriptを使っているプロジェクトでA-Frameのコンポーネントを書く時の方法。まだざっと試したところなのでおかしなところがあれば適宜調整が必要かも。</p> <p>とりあえず型を入れる。</p> <pre><code>yarn add @types/aframe </code></pre> <p>これで適当なtsファイル内で<code>AFRAME.registerComponent</code>とかを実行しても未定義エラー等が発生しなくなるため定義できるようになる。</p> <p>また、下記のようにimportして実行する方法もある。</p> <pre><code class="typescript">import { registerComponent } from 'aframe' registerComponent('my-component', { </code></pre> <p>コンポーネント内部で使うパラメータはオブジェクト内に定義すればいい。JavaScriptの場合だと、initメソッド内で初期化したりするが、それだと型エラーになるので要定義。</p> <pre><code class="typescript">registerComponent('my-component', { hoge: true, fuga: 100, </code></pre> <p>というか、型定義のテストファイルに一通りのものが書かれている。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/aframe/test/aframe-tests.ts">https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/aframe/test/aframe-tests.ts</a></p> <pre><code class="typescript">const Component = registerComponent('test-component', { schema: { myProperty: { default: [], parse() { return [true]; } }, string: { type: 'string' }, num: 0 }, init() { this.data.num = 0; this.el.setAttribute('custom-attribute', 'custom-value'); }, update() {}, tick() {}, remove() {}, pause() {}, play() {}, multiply(f: number) { // Reference to system because both were registered with the same name. return f * this.data.num * this.system!.data.counter; } }); </code></pre> <p>他にも色々書かれているのでこちらを参考にしていけばなんとかなるのではないかと思う。</p> <h2 id="プロパティの型を明示的に指定する場合は?"><a href="#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%9E%8B%E3%82%92%E6%98%8E%E7%A4%BA%E7%9A%84%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%EF%BC%9F">プロパティの型を明示的に指定する場合は?</a></h2> <p>事前にinterfaceを定義する感じ? ただこれだとメソッドも再定義しないといけないので非常に面倒。何か良い方法は無いのだろうか。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15121 2019-06-17T23:27:42+09:00 2019-06-17T23:27:42+09:00 https://crieit.net/posts/A-Frame-VR A-FrameでVRラジコンを作る <p>前回3D空間でキーボード操作のラジコンを作ったが、それをOculusQuestのVR空間内でスティックで操作して遊べるようにしてみた。前回のは下記。</p> <p><a href="https://crieit.net/posts/A-Frame-5d06dabaa8db2">A-Frameでキーボード操作のラジコンを作ってみる</a></p> <p>これにスティックによる処理を追加していく。</p> <p><a href="https://crieit.now.sh/upload_images/3b22aacb23f3a5542c2d4be1d05aaf725d07a26a1847d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3b22aacb23f3a5542c2d4be1d05aaf725d07a26a1847d.png?mw=700" alt="" /></a></p> <h2 id="スティック操作による値を取得"><a href="#%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E6%93%8D%E4%BD%9C%E3%81%AB%E3%82%88%E3%82%8B%E5%80%A4%E3%82%92%E5%8F%96%E5%BE%97">スティック操作による値を取得</a></h2> <p>左手右手の各コントロールコンポーネントはtracked-controlsというをベースとしており、これのaxismoveイベントを使うことでスティックの傾きを取得することができる。</p> <p>そのためイベント受信用のコンポーネントを作り、それをhand-controlsに割り当てれば取得することができる。例えば下記のような感じで左手用、右手用のcar-controller-left, car-controller-rightコンポーネントを作った場合は下記のようになる。</p> <pre><code class="html"> <a-entity hand-controls="left" mixin="controller" car-controller-left></a-entity> <a-entity hand-controls="right" mixin="controller" car-controller-right></a-entity> </code></pre> <p>コンポーネントは下記のような感じ。左手の上下でスピード、右手の左右でハンドルをさばく。</p> <pre><code class="javascript"> AFRAME.registerComponent('car-controller-left', { init: function () { this.el.addEventListener('axismove', function (e) { const car = document.querySelector('[car]').components.car car.onAxisMoveSpeed(e) }) } }) </code></pre> <p>あとはもう面倒になったので傾きも使わず前回作った処理をそのまま呼んでいるだけ。</p> <pre><code class="javascript"> onAxisMoveSpeed: function(e) { if (e.detail.axis[1] == 0) { this.speeding = null } else if (e.detail.axis[1] > 0) { this.speeding = 'down' } else if (e.detail.axis[1] < 0) { this.speeding = 'up' } }, onAxisMoveAngle: function(e) { if (e.detail.axis[0] == 0) { this.rotating = null } else if (e.detail.axis[0] > 0) { this.rotating = 'right' } else if (e.detail.axis[0] < 0) { this.rotating = 'left' } }, </code></pre> <h2 id="実際のもの"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AE%E3%82%82%E3%81%AE">実際のもの</a></h2> <p>実際にVR上でプレイしたものを録画したやつ。</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">VRでのスティック操作バージョン(モデル変える前に撮影したやつ) <a target="_blank" rel="nofollow noopener" href="https://t.co/9v34bxapMu">pic.twitter.com/9v34bxapMu</a></p>— だら🍔技術系投稿サービスや100の質問メーカー運営中 (@dala00) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/dala00/status/1140624336404938752?ref_src=twsrc%5Etfw">June 17, 2019</a></blockquote> <p>GitHubページで実際に試せる。実機がない人はキーボードのWASDでもOK。</p> <p><a target="_blank" rel="nofollow noopener" href="https://dala00.github.io/a-frame-car-sample/">https://dala00.github.io/a-frame-car-sample/</a></p> <p>ソースはGitHubにもアップしてある。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/a-frame-car-sample">dala00/a-frame-car-sample: Car control sample with A-Frame</a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>めちゃくちゃ簡単なのでぜひみんなやってみましょう。</p> <p>次はFirebaseのRealtime Databaseいれてみんなで同時に部屋の中にいる、みたいなの試したい。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15100 2019-06-12T22:28:14+09:00 2019-06-14T07:38:28+09:00 https://crieit.net/posts/A-Frame-Super-Hands-VR A-FrameのSuper HandsでVR空間のオブジェクトを掴んでみる <p>A-Frameという、マークアップとJavaScriptを使ってOculus Quest等のブラウザだけでVRアプリケーションを作ることのできるフレームワークがあります。</p> <p>サンプルなどを試してみると本当に簡単にVR空間を作ることができて面白いのですが、やはりWebエンジニアとしてはただ物を配置するだけではなく色々とインタラクティブにVR空間で遊べるようにしてみたいと感じます。</p> <p>とくにOculus Questのようなコントローラは物を掴んだりという操作が非常にすべてが直感的で、VRをはじめてみて一番の衝撃でもありました。なんとかそのあたりを簡単にできるようにしたいと思い調べてみたところ、下記のライブラリが見つかりました。</p> <h2 id="Super Hands"><a href="#Super+Hands">Super Hands</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/wmurphyrd/aframe-super-hands-component">wmurphyrd/aframe-super-hands-component: 👐All-in-one natural hand controller, pointer, and gaze interaction library for A-Frame</a></p> <p>公式のマニュアルでも紹介されており、恐らく簡単にコントローラを使えるようにしてくれているのだと思います。</p> <p>実際に上記のページのサンプルを試してみました。</p> <p><a href="https://crieit.now.sh/upload_images/7acd26c9fa4d2d46370d8e514f588d615d00fc61c5d5d.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7acd26c9fa4d2d46370d8e514f588d615d00fc61c5d5d.jpg?mw=700" alt="" /></a></p> <p>こんな感じで手が表示され、青いボックスを掴んだり、両手で掴むと拡大縮小することもできます。GitHubのREADMEを見るとわかりますが、ソースもたったこれだけです。</p> <pre><code class="html"> <a-scene> <a-assets></a-assets> <a-entity> <a-camera></a-camera> <a-entity sphere-collider="objects: a-box" super-hands hand-controls="left"></a-entity> <a-entity sphere-collider="objects: a-box" super-hands hand-controls="right"></a-entity> </a-entity> <a-box hoverable grabbable stretchable draggable dropppable color="blue" position="0 0 -1"></a-box> </a-scene> </code></pre> <h2 id="注意点"><a href="#%E6%B3%A8%E6%84%8F%E7%82%B9">注意点</a></h2> <p>多分ですが、ローカルやCodePenなどでもうまく動かなかった気がします。手のモデルを読み込んでいるのでとりあえずサンプルのHTMLをどこかWeb上にアップしてアクセスして試さないとダメっぽいです。</p> <p>ですのでもしかしたら公式で紹介しているコントローラなどでもうまく手を使ったりすることができるのかもしれません。</p> <p>ちなみにサーバーアップされているサンプルが下記です。(対応端末でないと手は出てきません)</p> <p><a target="_blank" rel="nofollow noopener" href="https://wmurphyrd.github.io/aframe-super-hands-component/examples/physics/">https://wmurphyrd.github.io/aframe-super-hands-component/examples/physics/</a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とにかくA-Frameでできることのサンプルやプレビュー画像がWeb上に不足しているので、何かしら試したら投稿していってみたいと思います。</p> だら@Crieit開発者