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); }
/// <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; }