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

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

2016の振り返りと2017年でやりたいことメモ

年明けましたね。あけましておめでとうございます。
2016年に作っていたものとか、大きめな買い物とかをふり返ろうと思います。

2016

1月

・GearVR + GalaxyS6edge購入

2月

3Dプリンタ買う

・沖縄のハッカソンのコーチ役的なポジションで行ってきた

・UnityVRの勉強がてら、PRIME BIRD作り始める
OcuFesで展示する

楽天声優ハッカソンにでる
Live2Dのキャラクターがしゃべってくれるみたいなやつを出す。
東芝賞とUnity賞をもらう。

3月

・お仕事でTHETAアプリリリース

・「cluster.」でLTする(VR内での初講演)

・ロボットハンド作りはじめる

4月

・VRで遠隔で操作できるロボットを作り始める
VRCアワードに提出、一次選考は通過する。

・GearVRアプリ「PRIME BIRD」リリース

5月

・ロボットハンドを調整
・Live2Dアプリ「NURIEW」を開発開始

6月

・OculusRift CV1がやっと届く

・Japan VR Hackathon
JAPUZZLEを作り、NEURONグローブ賞もらう

・Live2D Awardの作品「Live2Dロボ(仮)」を公開

・Live2D Awardの作品「 NURIEW」を公開

7月

・結婚!
高校の頃から付き合ってるデザイナーさんと入籍する。
結婚式はVR / AR絡めてなにかやりたい。

・起業!
2016年7月1日に株式会社ViRDを設立する。未だに社員は1人の模様。
http://vird.co.jp/
VR技術で世界をIntegrationするようなプロダクトを作りたいと思って設立したものの、色々作って迷走なような。

・Live2D Award 2016でクリエイティブ賞を受賞
かっこいい盾もらった!

・SPAJAMで前年度優勝者として参加
一人ハッカソンでGearVRとGoogle Translation APIを使った自動翻訳機みたいなの作る。
codeiq.jp

・HTC Viveの購入

・Unity VR ExpoにViveアプリの「LABOTA」を出展
Good Contentsで4位という結果に。(Vive購入から10日で、作って展示してる…)

・Gear360購入

・Gear360をUnityで動かすネタを書く

・Japan VR Hackathonの賞品のNEURONが届く


8月

・MakerFaireに「LABOTA」を展示

9月

・THETAアプリ「VANISH360」のリリース

10月

・ちょっとした展示が辛くてゲーミングノート買う
GS43VR (画像はおまけのブロック)


11月

・「VANISH360」がTHETA Developersコンテストで賞もらう

・Oculusアプリケーションの「Makebox」を開発開始

12月

・Oculus Touchが届く

・OculusTouchアプリの「Makebox」のアルファテスト開始

・熱海の温泉開発合宿で締め

2017年の目標

2016年は模索や、試しや、起業、結婚など、身を固める感じだったので、今年は攻めていきたい。
具体的には、
・Makeboxで10万人のユーザー数を集める
・自社アプリで1億の売り上げを出す
・VRコンテンツ開発会社として知られる企業になる

2016年はふらふらしてたけど、Makeboxに集中してがんばるぞー!

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

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: []

インストールが通る!