ジャイロの値
ジャイロに関して、昨日は値を出力してみましたが、クォータニオン値だと直感的ではない。
そのため、更に直感的に理解できるよう、XYZ軸に平行に線を引き、その線に対して
クォータニオン値で回転をかけてしまうのが理解のためには手取り早い。
すると以下の点の理解が出来た。
- Landscapeモードにてクォータニオンの単位回転(回転していないと一緒)は、LeftモードRightモード関わらず北向きの地面に並行な状態である。また、この状態のInput.gyro.gravityは(0,0,-1)である。
- 単位回転状態からLandscapeモードのLeft<->Rightを反転させる(つまり見た目は逆から見たように変わる)とGyroはUnity回転軸のZ軸回転を180度行う結果になる
- Landscapeモードにて単位回転状態からの現実のX軸回転を起こすとUnityGyroもそのままX軸回転を起こす
- Landscapeモードにて単位回転状態からの現実のY軸回転を起こすとUnityGyroはUnity回転軸のZ軸回転を起こす
- Landscapeモードにて単位回転状態からの現実のZ軸回転を起こすとUnityGyroはUnity回転軸のY軸回転を起こす
つまりUnityにおけるGyroは”端末の傾きを取得する”というよりは”描画状態の傾きを取得する”。
また、その回転においてはUnityの回転軸と統一されていない。
これが”傾き”をベースにしたゲームにおいて、Landscapeモードを回転させないようにしている理由のようだ。
また、ジャイロ使用ゲームでは地面と水平もしくは垂直な状態で遊べる、というものが多いのも”そもそもユーザが基準とする回転角”がどこか、という点が問題になるから固定的にしてしまって混乱をさせないようにしているのだろう。
更にこの状態からVRを起動させると、起動したタイミングの位置(とは言ってもY軸回転しか追わない)を基点としてしまうため、更に別の軸が出来てしまう。
そのため、2つの遊び方に切り替えて実装を行おうと思う。
傾けて遊ぶ
傾けて遊ぶ場合は、以下3つの遊び方になると思われる。
- 地面と平行に置き、XZ軸回転を駆使して遊ぶ(お盆の上にボールがあるような遊び方)
- 地面と垂直に置き、Z軸回転を駆使して遊ぶ
- 地面と平行に置くが、液晶は地面側でXZ軸回転を駆使して遊ぶ(寝ている状態でスマホを操作している感じ)
この3種を動的に切り替えることはInput.gyro.gravityを監視してスイッチすれば不可能ではないが、どこからが垂直操作か、どこからが平行操作かという判断はひとそれぞれであり、感覚に頼るところが大きいしオプションで設定できるようにしても難しいだろう。
自分のやりたい遊びとしては、XZ軸回転でバランスを取る、というよりハンドルを握る感覚に近いので傾けて遊ぶモードは地面と垂直に置き、Z軸回転を駆使して遊ぶようにしようと思う。
VRで遊ぶ
VRで遊ぶといってもコントローラ有りか無しかで大きく変わる。
俺の買ったVox+はボタンなどついていないし、
このゲームはカジュアルなものを目指しているので、傾けて遊ぶのと一緒の遊び方がいい。
VR側は起動時の東西南北によってジャイロと違う向きを正とするため注意が必要だが、
傾きとVR、両方とも同じ操作方法ならあまり時間もかからず実装できるだろう。