のしメモ アプリ開発ブログ

Unityアプリとかロボットとか作ってるときに困ったこととかメモ

ハンドコントローラーを使った開発で思ったこと

Oculus Rift Advent Calendar 2016の3日目の記事です!

Oculus touchが12/6にリリースされますね!
私もハンドコントローラーを使ってVRコンテンツを作っているので、開発中に思ったことをちょこちょこ書いておきます。

ハンドコントローラーを使った開発で思ったこと

つまむ持つ問題

ティッシュ箱が1箱あるとします。

ティッシュ箱をとって!」と言われたら、箱を持って渡します。
ティッシュを1枚とって!」と言われたら、1枚つまんでとります。
Touchでこれを再現すると、同じ「とる」というアクションでも、中指のGripボタンと、人差し指のTriggerボタンと別々のボタンを割り当てる必要がでてきます。

VR空間であっても、オブジェクトの形状からリアルでの「つまむ」、「持つ」の判断に影響されて手が動いてしまいます。

大きいものを両手でもつ


開発していると仕組みがわかっているので、大きなオブジェクトでも片手で持ってしまいますが、大きいオブジェクトを両手で持つプレイヤーがいることを忘れないでください。
それなりの大きさや、重そうなものは両手で持たれることも想定しておいたほうがよいです。
ただ、「重たいものは両手でないと持てません。」等はストレスになるので、リアリティよりも操作の快適さや、利便性をとったほうがいいケースが多い気がします。

この様に、ハンドコントローラーで持つものは「どのような形状のオブジェクトなのか」や、「オブジェクトのスケール」だけでもユーザーの操作の仕方が変わってしまいます。
つかむはボタンは中指Gripだけと統一するというアプリもあるでしょうし、柔軟にどっちのボタンでもつかめるというアプリもでてくるでしょうし、中々スタンダードを決めるのは難しそうです。
できるだけリアルの手との齟齬を感じさせないように、最初から仕組みを覚えさせて錯覚させたり、オブジェクトの形状や、オブジェクトのサイズで意識をコントロールさせるかが大切です。

真後ろにはあまり向けない設計がよさそう

Viveのルームスケールなら問題ありませんが、Riftの一般的なユーザーはルームスケールしていなさそうです。
なので、真後ろにTouchを向けると体に隠れてトラッキングが外れやすいので、Touchコンテンツで真後ろの敵を撃つとかはあまり向いていない気がします。

ハンドコントローラーを使った入力

また、ハンドコントローラーで入力する方法も様々です。
ハンドコントローラーを使った入力方法を色々調べてみました。

レーザーポインター

コントローラーからのレーザーポインターを出し、Triggerボタンで選択

・Homeアプリで採用されているので2D UIの操作では標準。
・細かい操作が可能。
・バーチャルキーボードの入力も定番はこれ。(物理キーボードには勝てませんが。。)
・移動先の選択等でも使用されている
・視点(HMDの向き)操作よりも操作が楽
・システマチックなUI向き

ボタンを押す

Push式のボタン、スイッチ
・押すものだと、ぱっと見でわかる
・フィードバックがないのでそのままでは使いにくい印象。音、振動、エフェクト、アニメーション等でなんとかする
・コントローラーが「触れたら押す」の場合、感度が悪いとストレス、感度が良いと誤反応でストレス。
 では、「触れた状態でトリガーを引いたら押す」にすると、「触れたのに押せない」という人が続出、割とボタンは地獄。
 間違えて押さない場所で、触れたら押すがベストか…?

掴んで動かす

レバー、ダイヤル
・ボタンの代役で使われている印象。掴んで動かすので、誤動作が少なく操作している感覚がある。
・前述の「つまむ持つ問題」があるので、サイズは「持つ」と感じるぐらいの大き目のサイズの方がよさそう(つまませない)

持ったものを使う

ガンコン、リモコン、武器、スプレー、懐中電灯など

持ったものと繋げる

カセットをいれる、ケーブルをつなぐなど

顔に近づける

顔に近づけて視界を変えたり、モノを食べたり、かぶったりとか
動画のFantastic Contraptionのヘルメットは秀逸

波紋式

触った場所に波紋が広がる

・ボタンを押した感覚がなくても波紋を作ることで押した錯覚ができる
・使えるシーンが限られそう。

ハンドモーション

手を振ったり、サムズアップで入力を受け取る形。
・プレイヤー感の感情表現を表す時に自然にやりそう。
・手に持った銃のリロードを手を振ってやるとかは楽しい。
NPCへのハンドモーションは2回、3回なら楽しいが、作業的に毎回入力を要求されるのはしんどいかも?

最後に

まだまだたくさんありそうですが、とりあえずこんな感じ。

また、ハンドコントローラー周りの話はCEDECでのOculusさんのセッションが大変参考になります。
jp.gamesindustry.biz

Touchがリリースされて、色々なデベロッパーさんが生み出したTouchの使い方を見れるのがとても楽しみですね。
youtu.be

Oculus Rift Advent Calendar 2016

明日はmkt_さんのMMD4Mecanim Tessellation機能とマテリアル編集のコツです。
http://qiita.com/advent-calendar/2016/oculus-rifOculus Rift Advent Calendar 2016 - Qiita

A-Frameのモデルロード完了のイベントを受け取る

A-Frameのobjモデル等のロード完了後にイベントが受け取れるがどう書けばいいかドキュメントに書いていなかったのでメモ

A-Frameのobjのロードのドキュメント

obj-model – A-Frame

コード

html側

<a-scene>
  <a-assets>
    <a-asset-item id="tree-obj" src="/path/to/tree.obj"></a-asset-item>
    <a-asset-item id="tree-mtl" src="/path/to/tree.mtl"></a-asset-item>
  </a-assets>
  <a-entity obj-model="obj: #tree-obj; mtl: #tree-mtl" model-loader></a-entity>
</a-scene>

js側

model-loadedのイベントに処理を登録する感じです。

AFRAME.registerComponent('model-loader', {
  init: function () {
    this.el.addEventListener('model-loaded', function () {
      // ここに処理を記載
      console.log('Finish load');
    });
  }
});

実行してみると、モデルのロードが終わったタイミングで"Finish load"が表示されます!

Elastic Beanstalk上で'gem install rmagick'が失敗する

Elastic Beanstalk上でGemfileに新しくrmagickを追加した後に、Depolyしたらエラーが起きて詰まったのでメモ

エラー内容

Make sure that `gem install rmagick -v '2.16.0'` succeeds before bundling. (Executor::NonZeroExitStatus)

必要なpackageをebextensionsのyumの項目に追加する

.ebextensions/01_packacge.config

packages:
  yum:
    gcc: []
    git: []
    ruby-devel: []
    ImageMagick: []
    ImageMagick-devel: []
    libxml2: []
    libxml2-devel: []
    libxslt: []
    libxslt-devel: []

インストールが通る!

elasticbeanstalkのdbをmysqlに変更した際にエラー

elasticbeanstalk(rails2.0)のproduction環境をmysqlに変更し、デプロイ時にエラーがでたのでメモ

エラー内容

[Instance: i-0e01735f21d78e0a0] Command failed on instance. Return code: 1 Output: (TRUNCATED)...undle. Add it to Gemfile. /var/app/ondeck/config/environment.rb:5:in `<top (required)>' /opt/rubies/ruby-2.2.5/bin/bundle:23:in `load' /opt/rubies/ruby-2.2.5/bin/bundle:23:in `<main>' Tasks: TOP => environment (See full trace by running task with --trace). Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/11_asset_compilation.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.

対処

eb sshで接続して原因を調べる

eb ssh

eb-activity.logを見る

vi /var/log/eb-activity.log

Gem::LoadError: Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).
  /var/app/ondeck/config/environment.rb:5:in `<top (required)>'
  /opt/rubies/ruby-2.2.5/bin/bundle:23:in `load'
  /opt/rubies/ruby-2.2.5/bin/bundle:23:in `<main>'
  Gem::LoadError: mysql2 is not part of the bundle. Add it to Gemfile.
  /var/app/ondeck/config/environment.rb:5:in `<top (required)>'
  /opt/rubies/ruby-2.2.5/bin/bundle:23:in `load'
  /opt/rubies/ruby-2.2.5/bin/bundle:23:in `<main>'
  Tasks: TOP => environment
  (See full trace by running task with --trace) (Executor::NonZeroExitStatus)

Gemが足りていないみたいなので記載する

Gemfileにgem 'mysql2'を追記しデプロイ

なおる!