/// <summary> /// Z軸(001)を引数のベクトルvに回転させる行列を生成する /// </summary> /// <param name="v"></param> /// <returns></returns> public static M3d CreateRotationFromZ(V3d v) { v.Normalize(); if (Math.Abs(v.Z - 1) < Th) { return(M3d.Identity); } else if (Math.Abs(v.Z + 1) < Th) { return(M3d.CreateRotationX(Math.PI)); } else { return(M3d.CreateFromAxisAngle(V3d.Cross(v, Z), V3d.CalculateAngle(Z, v))); } }
void LookAt(double eyeX,double eyeY,double eyeZ,double centerX,double centerY,double centerZ,double upX,double upY,double upZ) { OpenTK.Vector3d F = new OpenTK.Vector3d(centerX - eyeX, centerX - eyeY, centerZ - eyeZ); OpenTK.Vector3d UP = new OpenTK.Vector3d(upX, upY, upZ); F.Normalize(); UP.Normalize(); OpenTK.Vector3d s = new OpenTK.Vector3d(F.Y * UP.Z - F.Z * UP.Y, F.Z * UP.X - F.X * UP.Z, F.X * UP.Y - F.Y * UP.X); OpenTK.Vector3d u = new OpenTK.Vector3d(s.Y * F.Z - s.Z * F.Y, s.Z * F.X - s.X * F.Z, s.X * F.Y - s.Y * F.X); OpenTK.Matrix4d m = new OpenTK.Matrix4d(s.X, s.Y, s.Z, 0, u.X, u.Y, u.Z, 0, -F.X, -F.Y, -F.Z, 0, 0, 0, 0, 1); GL.MultMatrix(ref m); GL.Translate(-eyeX, -eyeY, -eyeZ); }
/// <summary> /// Z軸(001)を引数のベクトルvに回転させる行列を生成する /// </summary> /// <param name="v"></param> /// <returns></returns> public static M3d CreateRotationToZ(V3d v) { M3d rot; v.Normalize(); if (Math.Abs(v.Z - 1) < Th) { rot = M3d.Identity; } else if (Math.Abs(v.Z + 1) < Th) { rot = M3d.CreateRotationX(Math.PI); } else { rot = M3d.CreateFromAxisAngle(V3d.Cross(Z, v), V3d.CalculateAngle(Z, v)); } return(rot); }