【Unity】エアライドマシンに乗りたかった
重心移動で動きそうなものってなんだ?
そう、エアライドマシンだ。
VRHMDと重心コントローラで君もカービィになろう!的なモノを作る。
目的
前回記事のコントローラの利用可能性について考える。
手法
カービィのエアライドマシン的なモノに使ってみる。
ソースコード
using UnityEngine; using System.Collections; public class starMover : MonoBehaviour { private float BezierCurve(float pt1, float pt2, float ctrlPt,float ctrlPt2,float ctrlPt3 , float ctrlPt4, float t) { if (t > 1.0f) t = 1.0f; float result; float cmp = 1.0f - t; result = cmp * cmp * cmp * cmp * cmp * pt1 + 5.0f * cmp * cmp * cmp * cmp * t * ctrlPt + 10.0f * cmp * cmp * cmp * t * t * ctrlPt2 + 10.0f * cmp * cmp * t * t * t * ctrlPt3 + 5.0f * cmp * t * t * t * t * ctrlPt4 + t * t * t * t * t * pt2; return result; } // Use this for initialization void Start () { } // Update is called once per frame void Update () { float tmp = BezierCurve(-1.0f, 1.0f, -1.0f, -1.0f, 1.0f,1.0f, (1.0f + Input.GetAxis("Vertical")) / 2.0f) * 0.5f; Debug.Log(Input.GetAxis("Vertical")); transform.Rotate(0, 0, tmp); transform.Translate(0, 0.05f, 0); } }
考察
普通に線形に反応させるとちょっと反応が悪いように感じた。
そこで思い出したのが電子工作のボリュームの曲線である。
マルツオンラインの解説に詳しいが、ボリュームの可変抵抗は線形に抵抗値が変化するものとそうでないものが存在する。
なんでもオーディのボリュームを線形に変更しても、人間は非線形にボリュームが上がっているように感じてしまうらしい。
それを補正するためにAカーブやCカーブと言ったものが存在するようだ。
普段は回転位置情報なんかを取得するために使うのでBカーブのものを使っているが、こういう話をちょっと流用してみる。
つまり線形の重心移動を非線形に変形してやれば良い。
つまり、入力値を出力値をこんな感じの関数を使って変換すればよい。
これは五次ベジェ曲線の関数である。ベジェ曲線大好きマンみたいな勢いでベジェ曲線使ってしまってるけどたまたまだ。
もっと高次の曲線の方が良いかもしれないので、その辺は要調整。
上のグラフで言うと、入力の値を0~1の範囲に正規化して、関数に入力し、その出力をコントローラの値として使ってやる。
ソースコードはちょっと違った処理しているけど、本質は同じ。
入力0.3~0.7の範囲だと関数値は急激に変動し、それ以上の変化だとそうでもない感じの変化をする。
トランジスタの増幅器みたいな考え方ともいう。
これで「ちょっとの移動に敏感に反応するけど、大きく移動した領域ではそうでもない」みたいなコントローラが完成した。
これでユーザーはグイングイン左右に揺れる必要が無くなったわけだ。
ちょっと使い勝手がよろしくなったかもしれない。