■キャラクターに追従させる
座標間の距離はVector3.Distanceで取得することができる。このとき距離が開きすぎていたらカメラをキャラクターに近づける。transform.Translateを使えば、指定した方向に動かすことができる。このとき安易にtransform.forwardとすると、カメラがキャラクターの方向を向いていない場合、全く関係ない方向に進み出してしまう。
カメラから見たキャラクターへの方向ベクトルは、単純に座標の引き算で求めることができる(参考)。ただし、前述の通り仰角俯角には影響を与えたくないので、y成分は除外する必要がある。これにより、この引き算によって求めた方向ベクトルとtransform.Translateを使えばカメラを対象に近づけることができる。
ただし、カメラを対象の方向に向けることはできていない。そこで次に、カメラを対象に向かせる必要がある。
現在のX軸周りの回転を別な変数に保存しておき、キャラクターの中心に子オブジェクトを作って、LookAtでその座標を向かせ、transform.eulerAnglesとQuaterion.Eulerを用いてX軸周りの回転だけ元に戻すという手もある。
ただ、ここでは素直にtransform.Rotateを用いてY軸周りに必要なだけ回転させることを目指す。この角度を求めるにはカメラのローカル空間で計算した方が都合が良い。
カメラのローカル空間とは、下図のカメラに表示されている座標系のことである。対して右上に示されている座標系がワールド空間である。青い軸はZ軸を表しており、特にローカル空間ではオブジェクトが向いている向き(forward)を意味している。またローカル空間における原点=そのオブジェクトの座標である。
Transform.InverseTransformPoint(Vector3)を使えば、キャラクターのワールド座標(transform.possition)をカメラのローカル座標に変換することができる。
これにより、カメラのローカル空間でのX軸とキャラクター座標の成す角度を三角関数の逆関数から求めることができる。Z軸は90°なので求めた角度から90°を引けば、カメラのforwardを原点周りに何度回転させればキャラの方を向くかが分かる。
カメラから見たキャラクターへの方向ベクトルは、単純に座標の引き算で求めることができる(参考)。ただし、前述の通り仰角俯角には影響を与えたくないので、y成分は除外する必要がある。これにより、この引き算によって求めた方向ベクトルとtransform.Translateを使えばカメラを対象に近づけることができる。
ただし、カメラを対象の方向に向けることはできていない。そこで次に、カメラを対象に向かせる必要がある。
■キャラクターの方を向く
特定の座標を向かせるのにはTransform.LookAtという便利な関数がある。ただし、Transform.LookAtを使うとtransform.rotationの全成分を上書きすることになるため、マウスの上下操作でカメラを回転させられるようにした意味がなくなる。また、例えばLookAt(target.tarnsform.possition)とした場合、この座標とはキャラクターの足元の座標のことである。現在のX軸周りの回転を別な変数に保存しておき、キャラクターの中心に子オブジェクトを作って、LookAtでその座標を向かせ、transform.eulerAnglesとQuaterion.Eulerを用いてX軸周りの回転だけ元に戻すという手もある。
ただ、ここでは素直にtransform.Rotateを用いてY軸周りに必要なだけ回転させることを目指す。この角度を求めるにはカメラのローカル空間で計算した方が都合が良い。
カメラのローカル空間とは、下図のカメラに表示されている座標系のことである。対して右上に示されている座標系がワールド空間である。青い軸はZ軸を表しており、特にローカル空間ではオブジェクトが向いている向き(forward)を意味している。またローカル空間における原点=そのオブジェクトの座標である。
Transform.InverseTransformPoint(Vector3)を使えば、キャラクターのワールド座標(transform.possition)をカメラのローカル座標に変換することができる。
これにより、カメラのローカル空間でのX軸とキャラクター座標の成す角度を三角関数の逆関数から求めることができる。Z軸は90°なので求めた角度から90°を引けば、カメラのforwardを原点周りに何度回転させればキャラの方を向くかが分かる。
■プログラム全体(Main Cameraにアタッチ)
- 90°から求めた角度を引いて、初めから時計回りを正にしたほうが良い。
0 件のコメント:
コメントを投稿