【Unity】星の上を自由に歩く
現在スーパーマリオギャラクシーのように球状の地面を歩く機能を実装しようと頑張っております。
ようやくそれっぽくなってきましたが、まだ操作が上手くいきません。
とりあえず、現状で必須と思われることをまとめることにします。
まず、球体に立つためには自分からみた球体の方向(ベクトル)と逆向きのベクトルに自分のVector3.upを向けないといけません。
これは、
Quaternion.FromToRotation(Vector3.up,球体の方向と逆向きのベクトル)
で行けるので、transform.rotationにこれを毎フレーム計算すればいいんですが、これだけだと、前方の向きの回転を毎フレーム特定の方向に強制的に変更されるようです。
このままだと、仮に”毎フレーム右回りに10°回転”とかの支持を出しても、回転せず、右に10°だけ方向を変えるようになるだけです。(方向転換できない)
なので、毎フレーム自分の現在向いている向きだけ修正しないといけません。
Quaternionは掛け算を行うことで、角度の追加が出来るようなので、前のフレーム分を加味してそれに加えて現在のフレームでの回転分を足せばなんとなく上手くいきそうです。
しかしながら、ここで注意しないといけないことが。
単純に前のフレームでの前方をベクトルで残しておいたとしても、現在のフレームではそのベクトルをそのまま使うことはできません。なぜなら球体の上を歩いているので、一歩でも進めば自分の持っている基準軸(ローカル座標?)はすべて動いてしまうからです。
そんな状態で一フレーム前の前方を今の前方と一致させようとすれば、おかしなことになります。(というかなりました)
要するに、毎フレーム自分の基準座標に置き換えて計算する必要があるようです。
そこで役に立つのがVecto3.ProjectOnPlane(投影したいベクトル,基準のベクトル)です。
ここでいう基準のベクトルというのは、投影したいベクトルを投影する平面の法線方向のベクトルです。
基準のベクトルに垂直な平面に対して投影したいベクトルを投影してくれる機能です。
この基準のベクトルを重力方向(自分から見て星に向かう方向)の逆方向を指定すれば、現在のフレームにおける球体との接線ならぬ接面に投影されるという寸法です。
これで、前のフレームの前方を現在の前方と一致させられるはずです。
ノーマライズ(ベクトルの正規化)しないと大きさ変わりそうですね。
これで星に立つことはできそうです・・・が、
これで動くように設定すると思い通りに操れないです・・・。
とりあえず立つことはできると思いますが、移動はまだ考えないといけません。
というわけで、今回は概念的な部分だけ書きました。
実際に上手く動かせたらもう少しちゃんとした記事が書けそうです。
・・・というか、星を歩き回る方法を知っている人がいたら教えてほしいです・・・。