いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

Unityで、バーチャルカメラをスクリプトでオブジェクトに追従させる

バーチャルカメラを3Dの空間内を動き回るキャラクタ(クエリちゃん)に追従させます。つまり、カメラがクエリちゃんの後をついて回ります。これ、実はスクリプトなしで、バーチャルカメラの機能を使えばすぐできます。前に近い実験も紹介しました。

www.omoshiro-suugaku.com

www.omoshiro-suugaku.com

しかし、今回はバーチャルカメラだけを用意し、位置と撮影の向きを完全にスクリプトでコントロールしてみます。バーチャルカメラの機能だけを使うより、細かな操作ができるかも知れません! 実際にどんな感じになるのか、動画をどうぞ。

drive.google.com

スクリプトは以下です。これをUpdate()ルーチン内でコールします。動き回るクエリちゃんを真後ろ、少し高いところから撮影します。go1はクエリちゃんのゲームオブジェクト、goBackCameraは問題のバーチャルカメラのゲームオブジェクトです。
    //-----------------------------------------
    void setCameraPara() {
        float ratio = 0.4f;//①
        Vector3 p = go1.transform.position; //②クエリちゃんの位置
        Vector3 f = go1.transform.forward;  //③クエリちゃんの前方
        Vector3 u = go1.transform.up;       //④クエリちゃんの上方
        Vector3 c = p + 20 * u - 23 * f;    //⑤新しいカメラ位置
        goBackCamera.transform.position = c;//⑥
        Vector3 dir = p - c;//⑦カメラからの視線はこの向き
        Quaternion rot1 = goBackCamera.transform.rotation;//⑧カメラの古い向き
        Quaternion rot2 = Quaternion.LookRotation(dir);//⑨カメラの新しい向き
        goBackCamera.transform.rotation
                    = Quaternion.Slerp(rot1, rot2, ratio);//⑩カメラの向きを補間
    }
    //-----------------------------------------
⑤、⑥でクエリちゃんの後方、少し高い位置にカメラをセットします。⑦はカメラからクエリちゃんまでのベクトル。⑧はコール時のカメラの向きです(クオータニオンで表される)。⑨はカメラを向かせたい向き。⑩で現在のカメラの向きを新しい向きに向けますが、ratioという引数があります。これは0~1の値を取らせることができ、実際にいろいろな値で試してみると何となく、意味がつかめます。1に近いとキビキビした動きになります。これだとゲームでは疲れる感じかも知れません。自分では、0.3か0.4くらいでちょうどいいかな、という気がします。この⑩は
        goBackCamera.transform.rotation = rot2;
と書き換えても一応動きます。もとの⑩で、ratio = 1 としたときの動作になるようです。⑩はrot1とrot2の「間」の向きをカメラにセットするのです。間と言ってもいろいろで、どちらに近いか、ratioで指定するわけです。

 

バーチャルカメラの機能を使っていろいろやっていると、動作が思った感じと違うことがありました。自分で(スクリプトで)やったらどうなるかな……と、実験してみました。もう少し調べます。新たに何か分かったらまた記事にします。