2017年2月19日日曜日

ARMMOを実現するとしたら。劇場版ソードアート・オンライン -オーディナル・スケール- 公開を機に。



新木は空いてそうなナイトショーがいいなと思ったら、正真正銘1発目公開の2/18 0:00上映会の予約をいつの間にかポチり、深夜の渋谷で観てきました。

ラノベも全部読んでるし、立派なファンですねw

HADOは現在、テクノスポーツとしてガンガン進化中ですが、
ARMMOも将来実現したいことのひとつ。
HADOモンスター戦の延長線上で実現したいと考えてます。
ARMMOとは、普段の町中がゲーム世界と融合して他プレイヤーと協力してモンスターとの闘いを繰り広げようぜ!ってことです。
最近アップデートされて再燃してるポケモンGoもARMMOの一部を体現してるアプリ。

ちなみにMMOて何?な人は下記参照
MMORPG(Massively Multiplayer Online Role-Playing Game、マッシブリー・マルチプレイヤー・オンライン・ロール・プレイング・ゲーム)とは、「大規模多人数同時参加型オンラインRPG」などと訳され、オンラインゲームの一種でコンピューターRPGをモチーフとしたものを指す。

MMORPG - ウィキペディア

https://ja.wikipedia.org/wiki/MMORPG
そしてソードアート・オンラインは川原礫さんが執筆したライトノベルをベースにアニメやゲームなどになってる作品。詳細はリンク先を見てちょ。

さて、今回のソードアートオンラインは、これまでの作品の舞台であったVR(バーチャル)世界ではなくAR(拡張現実)世界で物語が展開されます。今回、舞台となっているのは2025年の4月後半~5月初旬、場所は東京で都内各所のランドマークがふんだんに出てきます。

予告映像はこちら。約2分。

そして冒頭の12分映像がこちら。

ネタバレを防ぐため、この12分内にトピックを絞ります。
はじめに、この劇場版について語るのに欠かせないARデバイス オーグマーについて。
視覚、聴覚、触覚情報を送り込む事が可能。
耳にひっかけている部分で脳波をスキャン、発汗、脈を感知し、
耳から先に尖っている先端部分で視線追跡&映像を出力する。
基本コンセプトはARデバイスの網膜照射型(QDレーザーなど)ですね。






ちなみに、ソードアート・オンラインはもともとVR世界の物語なので、
原作中ではVRデバイスとしてナーブギア、後継機のアミュスフィアなどがあります。

これらAR・VRデバイスの根幹を為す技術として、NERDLES(ニードルス)という脳に直接データを送り込み、かつ読み取れるチート技術があります。詳細は以下。
本作の根幹を成すバーチャルリアリティ技術。名称は直接神経結合環境システム(NERve Direct Linkage Environment System)の略称。ハードの内側に埋め込まれた無数の信号素子によって発生した多重電界でユーザーの脳と直接接続し、目や耳といった感覚器にではなく、脳に直接仮想の五感情報を与える事で仮想空間を生成する。同時に脳から体への電気信号も回収するので、仮想空間でいくら動き回っても現実世界の体はピクリともしない。

NERDLESが実現した、という設定のもとソードアートオンラインは描かれてます。このとんでもないブレークスルーが起きたが故にソードアートオンラインが実現たらしめられています。

さて、前置きはこのくらいで本題に。
冒頭の12分間映像をベースに、ARMMOを実現するポイントに触れていきます。

・プレイヤーのモーショントラッキング
・プレイヤーのポジショントラッキング(当たり判定)
・AR世界でのフィールド表現
・プレイヤー装備のビジュアル化
・プレイヤーへの体感フィードバック
・ARデバイスのUI
・その他(プレイヤー人数、データ通信、分散処理)
【おまけ】
・プレイヤー独自の追加アプリによるブースト
・身体能力増強スーツ
・物理攻撃
・転ぶ → 激しい動きによる影響
・爆風
・ARによるビジネスへの影響
・求心力となるマスコットキャラ
・価値観について
【まとめ】

新木自身、テクノスポーツHADOに取り組んでる起業家観点・サービス事業者観点で以下語ります。ソードアート・オンライン制作者観点、リアルビジネス観点、研究者観点、SAOファン観点など、別のアプローチからだとまた違った考えをお持ちの方、いらっしゃると思います。そんな方々と、どうやったら実現できるか、web上、現実世界問わず、ディスカッションできたら嬉しいです。
そのため、前提として、2017年現在からARMMO実現へアプローチするにあたり、現実的な要望として「スタンドアローンのウェアラブルデバイス構成で成り立たせたい」があります。環境設置型デバイス(kinectやモーションキャプチャーカメラなど)を街中に配置して運営するのは、かける必要がある人手を考えると現実的にサービスとして成り立たないのです。
この前提だけは重要なので、冒頭で触れておきます。

・プレイヤーのモーショントラッキング

大きく振りかぶって勢いよく振ったら大技出したいし、
力を抜いて素早く狙いすまして刺突したら弱点鮮やかに打ち抜きたい!
プレイヤー達はオーグマーだけでなく、タッチペン(出典:パンフレット)により武器を操りプレイします。

劇中ではNERDLESにより、首根っこを通る神経データを読み取り体中の微細なモーションを読み取っているという設定なのだろうが、2017年現在はそうもいかない。VR・AR界隈では現在もプレイヤーのモーショントラッキングは大きな課題。
いかにしてプレイヤーの腕の動き、位置、速度、言い換えれば身体の軌跡を読み取るか。どのタイミングでスキルを発動しようとし始め、終わったのか、これらタイミングをシステム側でどうやって把握するか。
特にARでは環境設置型デバイスを用いず、スタンドアローンでモーショントラッキングを実現するために加速度ジャイロセンサ解析・筋電位センサ解析・脳波脳血流解析・ボディスーツを着る・赤外線・超音波・磁場など様々なアプローチが試みられ、各企業が鎬を削っている。

蛇足ですが、名称タッチペンはもう少し何とかならなかったのかな。。
魔法の杖のような見た目だし、オーグスティックとかさ。

・プレイヤーのポジショントラッキング(当たり判定)
ボスキャラの攻撃を数十cmで際どく避ける!
自分がプレイヤーで、タイミング計って避けれた時の快感といったら!
クラインの数十cmでボスキャラの鞭を避けるのは、2017年時点でもなんとかできそう。深度センサーもしくはUWBによるアプローチでポジトラなど。バトルフィールドにすごい数のドローンを浮かし(ただし機体のブレは数mm以内に限る)、深度センサーで鬼のようにリアルタイムスキャンしまくるのも一つの手だが、ドローンも環境設置型デバイスと言える。運用考えるとまじでつらい。というか都内だと規制が邪魔すぎる。屋内だったらドローンではなく天井にセンサー固定できるけど、やっぱりARで、かつ屋外でのびのびとやりたいよね。遮蔽物がなるべくない屋外空間(樹木なんてスキャニングに邪魔w)でれっつぷれい!

劇中のボスバトルが常に夜なのは、バトルフィールドの通行人少なくなるといった配慮だけでなく、様々なデータ解析のために直射日光や太陽光による明暗がないようにするためでしょう。HADOも屋外でやれるっちゃやれるけど均質な明るさにするためテント張ったり、設営場所の太陽光角度計算したり、日照時間を事前に考えなきゃなので、夜にユーザが集まってくれるイベントだったら明るさをあまり気兼ねせずやれる。ただし、夜だとお金的な問題で運営側のオペレーション人員をほぼ0にしたいのが本音。

惚れた。
エイジなんて他プレイヤーが放った弾丸を空中で打ち返しおる!!
きっとARなしの現実世界でもエイジは剣の達人なのでしょう。
こんなプレイかませたら相手が男でも惚れる。
弾丸とソードがタイミング完璧で当たった、かつ方向もボスキャラへと飛んでいくと判定しきれるオーディナルスケールの精度に脱帽ですわ。
時速100km近くで飛んでる弾丸スキルに対し、タッチペンの角度・位置情報によるソード装備をエイジの神経データ読み取りによって描かれるソードスキルの軌跡が衝突したと判定し、かつ弾丸スキルの反射方向・打ち返し速度も瞬時に計算するオーディナルスケール。レイテンシーどうなってんじゃ。
2017年現在ではちょっと無理ゲー。だがこの次元を目指してHADO進化させたい!

・AR世界でのフィールド表現
レイドボスとのバトルが始まる時、街並みが一気に3Dモデルに変換される!
そう、オーグマーをかけてるプレイヤーにとっては、バトル時、街並みはファンタジー感溢れるビジュアルが重ね合わされて表示されるのだ。
街並み3Dモデル変換により、秋葉原のUDXが。。
なんということでしょう。ファンタジー感あふれる古城に!
街路灯なんて魔法陣のような照明に!
オーディナルスケールの世界観にどっぷり浸れる!
Google street viewの如く、バトルフィールドとなるランドマーク付近は深度センサ積んだドローンによって空間スキャニングを絨毯爆撃のごとくやったのね。スキャン時に邪魔者でしかない通行人や車は、きっと深夜のいない時を見計らってやったのでしょう。そして現実の街並みに変更が加えられたら(建物立て直し、ゴミ箱設置・撤去など)、再スキャンが必須。あ、ボスバトルスタート前にドローンが自動で再スキャンして街並み3Dモデルをアップデートしてるのか。このスキャン、数分で終わらせたいね。
プレイに没頭して何もないと思ってた道端に、実際はゴミ箱があって躓き、派手にケガするなんて笑えないからまじで。
一方で、溶岩ステージやジャングルステージも表現したい!けど現実問題、矛盾が起きる。問題は足元の表現なのだ。ゴツゴツした岩場、落ち葉や枯れ木・ぬかるみのある地面を3Dモデルで鮮やかに表現すると、人は錯覚して躓いたり転んだりしちゃう。
事故を避けるとしたら、周りは灼熱の溶岩、うっそうとしたジャングルだけど半径1~2mの足元は現実のアスファルトや石畳をそのまま表示。なんてシュール。
モンスター大暴れして建物大破壊!
大迫力だしこんなシーンも魅せ場としてほしい。
レイドボスの体力が残り3分の1になったら大暴れ的な。
あーなんということを。美しい古城が。
モンスターふっ飛ばして建物にぶち込み大ダメージ!
堅めの壁に突っ込んだし追加ダメージももちろんゲット!!!
プレイヤーは間違いなくテンション激高。
さらに何ということを。

作り手目線だと建物破壊行為はマジでやめてほしいw
1枚目の画像はまだいい。煙でごまかして表現できる。
2枚目はやばい。
AR世界の古城ではなく、現実世界にはしっかり無傷の建物があるのだ。
それにモンスターが激突してめり込み、壁がバラバラになるだとっ!
予め定められた建物だけ破壊できるなんて前提はプレイヤーとして冷めちゃうのでバトルフィールドにある造形物はすべて破壊可能にしたい。プロジェクションマッピングで錯覚させるような表現手法つかったらいけるかなあ。このシーンを上手いこと表現できそうな人いたらアイディアぜひw

東京タワーの後ろから回り込んでくるモンスター。
この表現だったらドローンでスキャンせずに、建物の精緻な3Dモデル制作によって2017年現在でもできそう。東京タワー自体をARマーカにして、地上のどの方角からプレイヤーが見てるかで補正かけてARデバイス内にモンスター表示。プレイヤーが集まるエリア指定、常に見上げるようなプレイ体験ならばいけそう。
うん、ごにょればいける気がする。

・プレイヤー装備のビジュアル化
普段着だったキリトとアスナが「オーディナルスケール、起動!」と叫んだら
服装や武器をあっという間に装備!高まる!夢溢れる!
気分はすっかりオーディナルスケール プレイヤー!

クライン達も、直に着てるがごとく着物風の装備を翻し全力疾走!
現実の人間に重ね合わせたスキン表示も世界観に浸るには外せない!

ただ、この服装スキンをプレイヤーにリアルタイム重畳はハードル高い。
頭はオーグマー、武器や防具はタッチペン基軸で位置・角度トラッキングできそうだけど、タッチペン持ってない手や足はどうトラッキングするのか。
地形データなどと違ってあらかじめスキャンやデータ配置しておけず、リアルタイム認識&描画しまくらなきゃいけない服装スキンデータ。
劇中はNERDLESにより神経データ読み取って各部位を把握しリアルタイム重畳か。2017年の現実世界ではkinect等の据え置き型深度センサーや衣服に再帰性反射材くっつけてリアル衣服ポジトラなどのアプローチが試みられているが、プレイヤーが動ける範囲はごくわずか。はたまたARデバイスに仕込んだ深度センサーで目の前のプレイヤーをトラッキング?これだとセンサーの及ばない遠くのプレイヤーはリアル服装か。
ARMMOには欠かせない要素だがこいつは難易度高めだぜ!

・プレイヤーへの体感フィードバック
クラインの戦友、ボスキャラの打ち下ろしを縦でがっちり受け止めてプルプル耐えてる。頑張れ!持ちこたえろ!!思わず応援したくなる!

がしかし。あのほっそいタッチペンでこれだけの反発力を生み出すような機構を備えているのか。きっと備えているのでしょう。もしくは浮いてるドローンが不思議な力場を生み出している。大の大人がプルプル耐えなければ持ちこたえられない体感フィードバック、オーディナルスケール開発者のこだわりポイントなのは間違いない。

2017年現在では、超音波などによって触れてるかのような表現、微細な電流流す、ブルブル振動するなどのフィードバック方法がある。触覚(ハプティック)デバイスに力入れてる方々がすごい進化させてくれたらいと嬉し。バカでかい動かせない機構や、「あ、ちょっと感じる」程度の体感フィードバックは研究段階では様々な進展あるが、現実のビジネスとなると触覚分野は急に元気がなくなる。なぜなら事業として成り立たせるのが非常に難しいからだ。必要?という問いかけに即答できない。インスタレーションであれば可能性ありだが、普及するレベルとなると日常生活で置き換えたくなるようなシーンが必須。規模がまるで異なる。VR・AR業界の発展がそのきっかけとなりうるか。
映像見ながら「耐えてる。。耐えてるよぅ(震え声)」だった新木だが、この体感フィードバックもリアリティ溢れるARMMOのために実現したいっ!


・ARデバイスのUI
シンプルで美しく、視界の邪魔にならないように配されたオーグマー内のUIパーツ。ARMMOでは、一人称視点で体験を楽しむため、UIパーツ表現もめちゃ大事。
モンスターや他プレイヤーが意識を払う対象となるため、視界はなるべく広く、UIパーツは視界を遮らないように、かつ形状などによって一目で意味がわかるようアイコン化する必要がある。
キャラの斜め後ろから見下ろすような3人称視点でプレイできるゲームは状況把握のためにさまざまな情報をUI表示できるが、一人称視点で同じことをすると画面内がゲージやらなんやらで溢れかえってしまうのだ。
デバイス内の視野角広さがオーグマーとは大きく異なるが、劇中のUIデザインされた方が配慮してるポイント、HADOのUIデザイン時のポイントとかなり類似してると思う。

・その他(高速ワイヤレスデータ通信、大容量データ通信、分散処理)
言わずもがな、劇中でプレイヤーが50人前後参加するレイドボス戦では、やり取りされるデータ通信量、通信頻度は2017年時点のMMOゲームの比ではない。そしてARMMOは何たってワイヤレスだから楽しいのだ。有線のひもでネットワークやバッテリーにつながってるなんてナンセンス。
かつ、各ARデバイス、ドローン(多分こいつがローカルサーバのような役割も果たしてる)、www越しのクラウドサーバの分散処理もいい感じにやってあげなきゃだ。ぱっと見わかりづらいけど、高速ワイヤレスデータ通信・大容量データ通信・分散処理もARMMO実現のためにクソ重要なファクターのひとつ。

ちなみに、オーグマーとタッチペンのペアリングどうする問題もある。100m×100m、約1万㎡にプレイヤー参加者50人だったらまだ何とかなりそうだけど。プレイヤーが大量に集まるシーン、2017年現在では、bluetoothが有効なデバイスペアリング手段。ただし、自分のデバイスをペアリングする際に他プレイヤーのデバイスが大量に表示され、共有の通信帯で競合する。HADOのサービス開発していく中で過去にリサーチした際、元々のbluetooth仕様だと100㎡で20個のbluetoothペアリングが理論上は限界だったが、実際にデバイス用意したら40個のペアリングが稼働した。様々な補正技術(ペアリングやホッピング、混線対策など)をデバイスメーカーが盛り込んでくださってた。そう、サービス実施となると様々な変動要因があるので、やってみないとわからない。実験必須。2025年にはきっとこのあたりもどうにかしましょ!

【おまけ】
・プレイヤー独自の追加アプリによるブースト
エイジのオーグマーで、クライン達を捉えて人物特定アプリが走っている映像が一瞬だけながれる。テクノスポーツやARMMOでは、テクノロジーを駆使して自身をブーストするのは奨励する流れにしたい。自身が強くなりたい、上手くなりたいと想い、その手段を体力やテクニックだけでなく、他のテクノロジーを駆使するのも上達手段であり、努力のひとつだと思うのだ。

・身体能力増強スーツ
エイジ、よく見るととんでもないジャンプ力を発揮しつつ、5~6m飛び降りてる!きっと青光りするスーツは身体能力増強スーツなのでしょう。2017年時点でも微細な電流流すボディスーツを使って身体能力あげようとする試みがなされている。こちらも同じく、テクノスポーツやARMMOではガンガン使って自身を強化してほしい!というか新木自身が真っ先に着てると思うw

・物理攻撃
公開映像中にはないが重要なトピックなので。
ARMMOではVR世界と違い、直接押す、殴るといったことができる。
HADOは現在、互いのプレイコート範囲を制限して直接接触できないようにしてる。きっと川原礫さんもAR世界を描くうえで悩んだと思いますが、PKが生々しくなっちゃうんだよね。基本はプレイヤーに自由で創造力駆使して楽しんでほしいが、物理攻撃はなしで紳士的に楽しんでほしいな。

・転ぶ → 激しい動きによる影響
VRMMOでは無敵の黒の剣士キリト、運動不足で派手に転びます。
システム制御寄りの観点だと、まじでやめてほしいやつw
激しくゴロゴロ転んだ直後、対象物がほとんどない上空を見上げてたらトラッキングしきれないよー。でもさすがオーディナルスケール、見上げたらレイドボスが見下ろして喰い殺されそうな演出用意しちゃうなんて憎いなもう。
ARデバイスについて少し。正直オーグマーのような形状のARデバイスでARMMOをプレイするのはしんどいと思う。理由は激しく人の体が動くから、映像を左目の適切な位置に照射し続けられない。
映像を視界に表示するうえで、デバイスがガクガク動くなどもってのほか。
なのでHADOではHMDをきつめに装着し、デバイスがブレないようにしています。
テクノスポーツやARMMOを楽しむうえでは、頭にがっつり固定するようなARデバイスもしくはコンタクトレンズ状のデバイスがユーザにとっては幸せ。激しく動いても映像にブレがないなんて。。体験価値が段違いにあがる!

・爆風
爆風はね、まじでやばいw
もちろんARMMOを実現するなら絶対やりたいことのひとつなのだが。AR世界でエフェクト用いた表現はもちろんいける。問題は体感フィードバック。爆風で髪なびいてるぜ。。どうやってリアル突風発生させるの?磁場?超音波?なんなの?オーディナルスケールの開発陣は死ぬほどこだわって、突風発生装置をバトルフィールドに持ち込み、タイミング完璧に合わせて突風発生させ、爆風表現したのでしょうw

・ARによるビジネスへの影響
劇中ではミニゲームクリアによるファミレスのデザートプレゼント、吉野屋やローソンのクーポンなどなど盛り込まれてます。2017年現在、すでに実施されている企業コラボ。
ポケモンGOリリース直後の世田谷公園(ミニリュウの巣)行ったら、花火大会クラスに人が集まってて笑った。自動販売機もすべて売れ切れてるし、路上駐車をバンバン取り締まる警察の人。
ARの世界は、現実世界で人の移動が伴うのでその土地の様相が大きく変わる。一方で、ARスペースの取り合いが起こりそう。具体的にはARMMOとしてオーディナルスケール運営のイベントと、2025年のポケモンGO運営のイベントが同じ場所でかち合う可能性が非常に高い。ランドマークや公園にどうしても集中するので。ARスペースを整理する規格なのか団体なのか標準なのか、どんな形にしろ必要だと思う。また、経産省を巻き込んでる設定のオーディナルスケール。ある意味では現実的。一般にオーグマーを普及させるにあたり、大きな壁となるのは開発資金や末端価格。そして強力な無線電波飛ばしまくったりドローンやパーソナルモビリティ乗り回せるような都心のテクノロジー特区をぜひ設けて!劇中のように、全力で国が支援してほしい!!

・求心力となるマスコットキャラ
歌姫ユナ。みんなが一目でかわいい!見たい!応援したい!と思うようなキャラ。ライブに人がわんさか駆けつけちゃうような。何よりいいのは、リアルの人間ではないから同じ時刻に様々な場所に出現できるメリット。
サービスを普及するうえで、ユナのような求心力となるマスコットキャラはめっちゃ大事。いわゆる広報キャラ。ARMMO実現のためにこういった要素は欠かせない。理想を言えばテクノスポーツHADOだったら現実世界の人とバーチャル世界のキャラのユニットグループだといいな!どんな人だったら、もしくはどんな状況だったらマスコットキャラもしくはHADOアイドルやりたいと思う人が現れるだろうか。

・価値観について
まずは日本に限ってだけど、不特定多数の人がいる場所で「いいものはいいと言える、褒める価値観」がぜひ広がってほしい。ショッピングモールで歌声を披露しちゃうシーンがあるけども、きっと今の日本で同じことをし始めたら視線を送るだけで通り過ぎる人だらけな状況が生まれてしまいそう。自然と拍手をしちゃうような、いいものはいいと自身で決断し行動できるような世の中にしたい。
あと、AR世界を見えてる人と見えてない人、始めの黎明期ではこのギャップが何とも埋めがたい。劇中でのオーグマーはiphoneの初代発売から1~2年後くらいの普及率だとおもう。HADOも当初からデバイスをかけていない観客向け映像を意識的に提示してきた。これまで全くなかった価値観を伝えるのに、ビジュアルで伝える、体験できるようにして伝える、様々な方法あるが、一般の人が手に取れるような構成にして、少しずつ前進していくのが最善手だと考えてます。


【まとめ】
最後に。
テクノスポーツHADOを進化させ、ひとつの分岐としてARMMOを将来実現するにあたり、ソードアート・オンライン -オーディナル・スケール-は非常に大きな影響を世の中に与えてくれた。作者の川原礫さんはじめ、関係者の皆様に感謝を。
そして、新木自身、本気で夢溢れるこんな世界を実現したいと考えてる。テクノロジー面はもちろん、サービス提供面を踏まえると、段階的に進化してこういった世界に辿り着く。当然HADOも今のデバイスやソフトウェアにこだわるのではなく、より適切なアプローチがあれば大胆に採用して進化していきたい。辿り着くために歯を食いしばって乗り越えるべき壁は当然多々ある。がしかし、meleapはチームメンバーみんなで陽気に飛び跳ねながら進んでいきたい。いろんなパターンで関わり方・接し方、もちろんあります。一緒にサービス作り上げる、ディスカッションする、応援してくれる、などなど。膝がガクガク震えるほど面白い世界の実現に向けて、目をキラキラ輝かせた方々と一緒に、お互い刺激し合いながら目指していきたい。

この記事を読んでビビビと来た方、いやいや何言うてんの?などなど、何か心が動かされた方、Facebooktwitterなどなど方法問わずぜひフィードバックください。どうやったら実現できるか、web上、現実世界問わず、ディスカッションなり一緒に何かできたらとっても嬉しいです。

新木仁士

2016年3月6日日曜日

HTC Viveセットアップ

HTC Viveが届いた!
ということでViveデビュー記事です。


ちなみに2セット届いてますw
その理由は2/10-11にロサンゼルスで開催された
UnityのVision Summit 2016に弊社から2名で参加したからです。
keynoteでValveのGave Newellさんが
「ここにいる開発者全員にViveプレゼントするぜ!」
って発表し、会場が文字通り熱狂した流れから、
いま手元にViveがあります。
本当に届けてくれるとは思わなかったぜ。
しかも爆速で。(一か月経たずに届いた)
ただでさえ収穫の多いイベントだったけど、さらに最高!

さて、本題に戻します。
Viveインストール時にいくつかトラップがありました。
それらトラップを割けることを目的としてます。
2016/03/06時点の情報なので齟齬があれば
コメントくださるとうれしいです。随時アップデートします。

【目次】
1.PCの用意
2.ハードウェアのセットアップ
3.ソフトウェアのセットアップ
4.アカウントのアクティベート

1.PCの用意

ポイント⓪ 必要スペックを満たすPCを用意します。
 Viveの必要スペックは以下の通り。
    -----------------------------------
     GPU: NVIDIA GeForce® GTX 970
             AMD Radeon™ R9 290 equivalent or greater
     CPU: Intel® i5-4590 / AMD FX 8350 equivalent or greater
     RAM: 4GB+
     Video Output: HDMI 1.4 or DisplayPort 1.2 or newer
     USB Port: 1x USB 2.0 or greater port
     Operating System: Windows 7 SP1 or newer  
    -----------------------------------

 ちなみにうちの子はこんなん。MouseComputerさんに感謝!
  これならOculus製品版の必要スペックも満たしてる。
 グラボ積み替えもできたらいいなということでBTOデスクトップPCにした。
    -----------------------------------
     NG-i650PA1-EX2
       GPU: NVIDIA GeForce® GTX 980
       CPU: Intel® i7-6700K
       RAM: 16GB
       OS: Windows 10  
    -----------------------------------



2.ハードウェアのセットアップ

届いた段ボールのサイズにビビります。でかいw
Oculus DK2の比じゃないww


定番の開封の儀な写真を撮ったりしましょう。

※片っ端からデバイスを箱から出さないこと
 大量のコードがあるので、油断すると何がどこにいったかパニックになりますw

SteamVRのユーザーガイドを見よう!
 Viveが作成したユーザーガイドは本当に分かりづらいので
 SteamVRのユーザーガイドを見ましょう。
 3/8時点でユーザーガイドが日本語対応となってます。
 もう一週間早くリリースしてくれたらすごい楽だったのに!

以下、SteamVRのユーザーガイドに沿って進めていきます。

2-1 適当な広さがある部屋を用意する
      ※この段階でリモコンの充電だけし始めておくとスムーズに遊べる

2-2 赤外線のBase Stationをセットアップする
      高さ2m程度(プレイヤーが腕上げて超えないくらいの高さ)で
      対角5m以内に設置します。
      どのご家庭にもあるカメラの三脚を使うとお手軽ですね!

      コンセントを繋げたらLEDが光るので背面ボタンを押してモード設定します。
      ひとつのBase Stationの英語表記を b に設定
      もうひとつのBase Station の英語表記を c に設定

2-3 ヘッドマウントディスプレイのセットアップ
 2-3-1 注意すべきは、リンクボックスとPCだけをはじめにつなぐこと。
        この時、リンクボックスとヘッドマウントディスプレイ(以下HMD)は
        つなげてはいけない。
        リンクボックスだけPCにつなげると初めにドライバをインストール
        しているらしい。なので一旦つなげたらしばらく抜いちゃだめ。
      
 2-3-2 ドライバのインストールが終わったかなって頃にHMDをつなげる。
        インストがいつ終わったか明確にわからないので
        自分は5分後くらいにブスっとつなげた。
        
※リモコンやらBase Stationの無線接続は!?って思うだろうけど問題ないです。
  このあとやります。


3.ソフトウェアのセットアップ

 3-1 Steamをインストールする
      ここからSteamをダウンロードする。持ってない場合はアカウントも作る。

 3-2 Steamを起動し、ライブラリ>ツールの中で
      SteamVRを見つけ、ダウンロード&インストールする。
      ※ユーザーガイド中にはSteamVR Betaがどうのこうのって書いてあるけど
        3月頭時点でそんなものはない!無視!

      
           インストールでき次第、デバイス類のステータスウィンドウが現れる。
           現れたステータスウィンドウの上にさらにひとつ、ウィンドウが現れると思う。
     指示に従い、HMDのドライバやコントローラのドライバをアップデートする。



      
 3-3 Room SetupとTutorialを実行
      出現したViveデバイス類のステータスウィンドウの中で、
      SteamVRアイコンをクリックし、Run Room Setupなどを実行する。


      あとは簡単。映像を見ながらファンキーな動きをするアバターと一緒に、
      HMDやコントローラをRoom中央に置いて認識させたり、
      動けるスペースをキャリブレったり(コントローラがトコトコ震えて楽しいw)、
      画面の指示に従ってやればまずつまづかない。
 

      画面中央下のステータスがReadyってなったら準備完了。
      後はいろんなソフトダウンロードするなりunityで開発に使うなり。

4.アカウントのアクティベート

リンク先の内容に従ってアカウントをアクティベートします。
  私はAAAAA-BBBBB-CCCCCみたいなコードでした。

  アクティベートにより、3/6時点ではTilt Brush、Job Simulator、
 Space PiratesやNinja ほにゃららなど10本以上のデモアプリを楽しめます。

  以上です。
  うまくセットアップできたでしょうか?
  では良いViveライフを!

2015年10月2日金曜日

[Android]AndroidHttpClientがNGになっていたので、HttpURLConnectionでアクセスしてみた

AndroidHttpClientを利用しようとすると利用してはいけないと怒られてしまうので、
HttpURLConnectionを使ってHttp通信を行いました。
今回はヘッダー領域はいらないのでページの内容だけを取得するクラスです。
HttpURLConnectionを使用してHTTP通信を行う
http://techbooster.jpn.org/andriod/application/6812/
HttpClient.java
public class HttpClient {
    private HttpURLConnection connection = null;

    public String get(String url){
        String pageData = "";
        try {
            URL u = new URL(url);
            connection = (HttpURLConnection)u.openConnection();
            connection.setRequestMethod("GET");
            connection.setInstanceFollowRedirects(false);
            connection.connect();

            InputStream is = connection.getInputStream();
            pageData = // ストリームの内容を転記;
            is.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return pageData;
    }
}
URLやHttpURLConnectionのインスタンスを再利用できないかあれこれ頑張ろうとしましたが、
少なくともHttpURLConnectionはインスタンスの再利用はできないようです。
それと非同期でないため注意してください。
// 使い方
HttpClient client = new HttpClient();
String page = client.get("http://localhost:8080/index.html")

2015年9月3日木曜日

[Android]ACRAを利用して好きなタイミングでクラッシュレポートを送信する

ACRAライブラリを利用することでクラッシュレポートの通知ができます。
ただ、ネットワーク環境がない状態でエラーが発生した場合の状況も入手したかったので、
その方法をメモで残そうと思います。
エラー発生時はエラー情報をファイルに保存するだけにし、
ネットワーク環境につながっているときに後から送信するという方法で実装しました。
  1. クラッシュレポート用のクラス作成
  2. ReportSenderの作成
  3. ACRAの設定

クラッシュレポート用のクラス作成

クラッシュレポートの内容をファイルに保存、読み込みを行うクラス
※Read,Write処理部分は省略
CrashReport.java
public class CrashReport {
    private static final String CRASH_REPORT_FILE = "crash_report.txt";

    private Context context;
    private StringBuilder report = new StringBuilder();
    public CrashReport(Context context) {
        this.context = context;
        // ロード処理
        .
        .
        .
        report.append(loadData);
    }

    public void add(CrashReportData errorContent) throws JSONReportBuilder.JSONReportException{
        // レポートを追加
        report.append("\n------------------------------------------------------------\n");
        report.append(errorContent.toJSON().toString().replaceAll("\\\\n", "\n").replaceAll("\\\\t", "\t"));
    }

    public void save() throws IOException{
       // レポートの保存
    }

    public void send(String email){
        // メールでクラッシュレポートを送信
        Intent intent = new Intent();
        intent.setType("message/rfc822");
        intent.setAction(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("mailto:" + email));
        intent.putExtra(Intent.EXTRA_SUBJECT, String.format("Crash report![%s]", context.getPackageName()));
        intent.putExtra(Intent.EXTRA_TEXT, report.toString());

        context.startActivity(intent);
    }

    public void clear(){
        // クラッシュレポートのクリア
        report = new StringBuilder();
        try {
            save();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

ReportSenderの作成

クラッシュしたときに動作するSenderクラスを作成
CrashReportSender.java
public class CrashReportSender implements ReportSender {

    @Override
    public void send(Context context, CrashReportData errorContent) throws ReportSenderException {
        CrashReport crashReport = new CrashReport(context);

        try {
            crashReport.add(errorContent);
            crashReport.save();
        }catch (Exception e){
            Log.e("CrashReportSender", "CrashReport save is failed.");
            e.printStackTrace();
        }
    }
}

ACRAの設定

最後にACRAを設定して完了!
AcraCrashReportApplication.java
@ReportsCrashes(
        mode= ReportingInteractionMode.TOAST,
        resToastText = R.string.acra_dialog_text,
        resDialogCommentPrompt= R.string.acra_dialog_comment_prompt // 発生状況を入力する欄のラベル
)
public class AcraCrashReportApplication extends Application {
    @Override
    public void onCreate() {
        // The following line triggers the initialization of ACRA
        super.onCreate();

        // ACRAの設定
        ACRA.init(this);
        CrashReportSender sender = new CrashReportSender();
        ACRA.getErrorReporter().setReportSender(sender);
    }
}
AndroidManifest.xml
android:name=lang:AcraCrashReportApplication
あとは、どこかの画面でCrashReportのsendを呼び出せばOKです。

2015年8月12日水曜日

[Unity][Android]Unity画面からfinishしてAndroidの画面に戻す方法

単純にfinish()するだけだとアプリが落ちてしまうようです。
次のように実行したところ元画面に遷移しました。
UnityPlayerNativeActivityを継承したActivityを作成する。
次の内容のメソッドを実装する。
public void end() {
  runOnUiThread(new Runnable() {
      @Override
      public void run() {
          mUnityPlayer.quit();
          finish();
      }
  });
}
一応これで元画面に戻ったのですが、
内部的には一回アプリを落として再起動しているようで、
static変数ですら初期化されてしまいました。

2015年7月8日水曜日

Android と Unity の座標系

ども、モーション認識部分を担当している太田です。

meleap では Android + Unity で開発を進めています。端末の位置情報なりを入力として用いてますがこれが一筋縄では行きません。なぜなら、両者で空間座標系の定義が異なるんです。涙
今回はそんな面倒くささをちょこっと紹介しておきます。

【Unity の座標】


上の図は Unity マニュアルから引っ張ってきました。Unity を使ったことのある人からすると、見慣れた座標系ですよね?でもこの座標系、ちょっと違和感感じませんか?上向きに y 軸があるって、3次元座標系として見慣れない感じじゃありません?少なくとも僕は違和感ありまくりで、初見でとても気持ち悪かったです。

この違和感、数学や物理での3次元空間座標の表現と『異なる』からです。
数学や物理はいわゆる「右手系」で「右ねじの法則」からなる座標系を設定することが多いです。対して Untiy では上図のように「左手系」を採用しています。

「だからどうした?それのどこが問題なんだ!」と思われるかもしれません。問題はここからです。
同じく Unity マニュアルから引用しましょう。
モバイルデバイス: 
(中略) 
各軸に沿った加速が重力の値としてハードウェアにより直接報告されます。 値が 1.0 の場合、与えられた軸に対する +1 G の力を示し、-1.0 の値は -1 G を示します。 目の前にデバイスを垂直に持ち(ホームボタンが下)、X 軸は右向きが正の値を示し、 Y 軸は上向きが正の値を示し、Z 軸は自身に向かう向きが正の値を示します。
Unity からもデバイスの加速度センサの値を取得することができます。上記は Input のリファレンスから一部抜粋して引用しました。ここで出てくる3軸の定義は、なんと「右手系」です!つまり、Input.acceleration で得られる値を直接 Unity 内の座標系に適応すると、期待通りには動いてくれません。

これは何も加速度に限ったことではありません。ジャイロに関しても同様のことが言えます。回転方向の定義も「右ねじ」と「左ねじ」で異なるので注意が必要です。

というわけでデバイスからの入力を Unity 内で使うには都合の良い座標変換を入れる必要が有ります。座標変換の一例として下記のサイトを参考にしてください。
http://qiita.com/fuqunaga/items/b1a3e38af71f062f0781
座標変換は一意に決まるものではないので、仕様に合った選択をするようにしましょう。

ではでは今日はこの辺で。。。


2015年6月30日火曜日

[Node.js]ファイルDB「NeDB」を使ってみた

先日「Node学園 16時限目 ES2015発行記念」に参加させていただきました。
その発表の中でファイルDBである「NeDB」を知れたので試してみました。
基本的には以下のパワポの内容を実行しているだけです。

http://www.slideshare.net/isamusuzuki54/loop-backapiswift-46901252?next_slideshow=1


準備:
npm install nedb --save

※これだけ!


ソースコード:(今回は「nedb_test.js」というファイルで作成しています。)
var NeDB = require('nedb');
var db = {};
db.users = new NeDB({
  filename: 'usersfile'
});

db.users.loadDatabase();

// insert
db.users.insert({name: 'hoge'});
db.users.insert({name: 'fuga'});
db.users.insert({name: 'uga'});

db.users.insert([
  {name: 'foo'},
  {name: 'bar'}
  ], function(err, newDoc){
    console.log("[INSERT]");
    console.log(newDoc);
});

// find
db.users.find({name: 'fuga'},
  function(err, docs){
    console.log("[FIND]");
    console.log(docs);
});
db.users.find({name: /f*uga/},
  function(err, docs){
    console.log("[FIND F*]");
    console.log(docs);
});

// remove
db.users.remove(
  {name: 'fuga'},
  {multi: true},
  function (err, numRemoved){
    console.log("[REMOVE]");
    console.log(numRemoved);
});
db.users.remove(
  {name: 'uga'},
  {multi: true},
  function (err, numRemoved){
    console.log("[REMOVE]");
    console.log(numRemoved);
});


実行結果:
%]node nedb_test.js
[INSERT]
[ { name: 'foo', _id: 'ShGylbRFFiR4nZcR' },
  { name: 'bar', _id: '7Kkhma6FdLUzQI7o' } ]
[FIND]
[ { name: 'fuga', _id: '8AKesKQfsnvVOdob' } ]
[FIND F*]
[ { name: 'fuga', _id: '8AKesKQfsnvVOdob' },
  { name: 'uga', _id: 'vbDsvmXtaB5xHNYo' } ]
[REMOVE]
1
[REMOVE]
1

実行後のファイル(usersfile)の内容:
{"name":"hoge","_id":"WuA7LFB50CWMnSX2"}
{"name":"fuga","_id":"8AKesKQfsnvVOdob"}
{"name":"uga","_id":"vbDsvmXtaB5xHNYo"}
{"name":"foo","_id":"ShGylbRFFiR4nZcR"}
{"name":"bar","_id":"7Kkhma6FdLUzQI7o"}
{"$$deleted":true,"_id":"8AKesKQfsnvVOdob"}
{"$$deleted":true,"_id":"vbDsvmXtaB5xHNYo"}


いやぁこんな簡単にDBを利用できるようになるなんてすばらしいですね!
利用できるAPIはMongoDBに準拠しているらしいので、
しっかりとしたDBに移行する際にも楽に対応できるかもしれないのがまた素敵ですね。

インストールするとついてくる次のマニュアルを見れば使い方も大体把握できると思います!

マニュアル:
node_modules/nedb/README.md