Exemple #1
0
    public static void LockAt(this Matrix4x4 me, Vector3 Position)
    {
        Vector3 VecX, VecY, VecZ;

        VecY = me.GetUp();
        VecZ = Position - me.GetPosition();

        //Z軸ベクトルの正規化
        VecZ.Normalize();

        //X軸の方向ベクトルを求める
        VecX = Vector3.Cross(VecY, VecZ);
        //X軸ベクトルの正規化
        VecX.Normalize();

        //Y軸の方向ベクトルを求める
        VecY = Vector3.Cross(VecZ, VecX);
        //Y軸ベクトルの正規化
        VecY.Normalize();

        //軸を格納する
        me.SetRight(VecX);
        me.SetUp(VecY);
        me.SetForward(VecZ);
    }
Exemple #2
0
    /// <summary>
    /// 玉を回転させる
    /// </summary>
    void BallRoll()
    {
        //前回座標と現在座標が違うなら回転を加える
        if (OldPosiiton != transform.position)
        {
            //軸を作る
            Vector3 VecX, VecY, VecZ;
            Vector3 PositionDifference;                 //座標差で回転する量を決定

            VecY = Vector3.up;
            VecZ = PositionDifference = OldPosiiton - transform.position;                   //移動量

            //Z軸の正規化
            VecZ.Normalize();

            //X軸を求める
            VecX = Vector3.Cross(VecY, VecZ);
            VecX.Normalize();

            //移動量から角度を出す
            float fDegree = PositionDifference.magnitude / (2 * Mathf.PI * Sphere.radius) * 360;

            //前回座標が現在座標の方向に向いた状態のX軸で回転を加える
            PositionDifference.y = 0.0f;                //Y座標は考慮しない
            transform.RotateAround(transform.position, VecX, -fDegree);
        }

        //過去座標として座標を保存
        OldPosiiton = transform.position;
    }