学部二年の土鍋です。
最近、ハードウェアに興味があるのでArduinoとUnityを利用して遊べないかなと思い、今回自作コントローラーを作ってみました。
準備
作りたいもの
「VR刀バトルゲーム」
Arduinoと9軸センサーを用いて制作した刀型コントローラーを振るとUnity内の刀も連動して動く。
ぶっちゃけ、既存のVRコントローラーでできるし、Wiiのコントローラーも似たような感じ…
でも自分で作ることに意味がある!
使用したもの
- Arduino UNO
- Fabo #501、#202
- Unity 2020
Arduinoとは?
知ってる人も多そうですが…
イタリアで生まれたオープンソースのマイコンで、初心者でもプログラムを書いてかんたんにハードウェアで遊べます。
Faboとは?
会津大学のOBが起業した会社、及び製品。
簡単にセンサー等をセットアップでき、サンプルコードなどが充実しているため、初心者でもすぐに様々なセンサーを扱えます。
製作過程
- センサーで加速度とジャイロ(角加速度)を取得
- 値をシリアル通信でArduinoからUnityへ
- 取得した値を利用して物体を移動させたり回転させたりさせる
センサーの値を取得
9軸センサー(Fabo#202)は加速度、ジャイロ、コンパスの情報を獲得できます。
今回はFaboが提供するライブラリを使用し、コードはサンプルコードをもとに書きました。
取得した値↓
ArduinoとUnityをシリアル通信する
取得した加速度、ジャイロの値をシリアル通信で受け取ります。 受け取った値を物体にローカル座標(センサ座標)に加速度を加えるメソッドと角加速度を加えるメソッド(RigidBodyのAddRelactiveForceとAddRelactiveTorque)に入れます。
取得した値を利用して物体を移動させたり回転させたりさせる
ここで問題発生
取得した値には重力の加速度も含まれるため、単純に値を使うことが出来ません。
うーん重力うざいですね…
地球から重力が無くなればいいのに...
そうもいかないので
重力を打ち消したい
単純にZ軸の加速度から重力を引くと傾けたときに値がおかしくなります。
つまり、センサーの座標軸ではなく重力に関してはワールド座標で考える必要があります。
ではワールド座標Z軸正の向きに重力と同じ加速度を与えてみましょう。
ただUnityではY軸です(ややこしい)
動いた!!!
しかし、なぜかめちゃくちゃ重かった。
苦労したこと
- シリアル通信を行うととんでもなくUnityが重くなった
どうやらReadTo()の部分が原因のよう (結局改善出来なかったので、どなたか教えて下さい…) - 重力を考慮すること
- センサ座標とワールド座標を考慮すること
- もともと三軸でどうにか実装しようとしていたがうまく行かなかった
まとめと今後の目標
そんな重い処理じゃないはずなのになぜか重すぎるのでどうにか修正したいと思います。その影響か挙動のずれが大きいのでそこも修正が必要。 また、物理と数学はゲーム作る上で重要だと改めて感じました。
VRの中でも五感再現等に興味があるので、刀で切られた感覚を再現できたら面白いですよね(ただの妄想)
今後、もっと勉強を進めてIVRC等に挑戦出来たらなと考えています。
ご覧いただきありがとうございました。
参考資料
202 9Axis I2C Brick - FaBo Arduino Docs
【Unity/Arduino】UnityとArduinoの加速度センサを連携してみた - ソースに絡まるエスカルゴ
【Unity】 Rigidbodyの回転方法 - エフアンダーバー
Rigidbody-AddRelativeForce - Unity スクリプトリファレンス