From 901acddbdd38c441426f43cbfa78c422a19cec17 Mon Sep 17 00:00:00 2001 From: Dahlia Trimble Date: Wed, 15 Oct 2008 04:42:28 +0000 Subject: Thanks to M. Igarashi and nlin for a patch that implements llGetCameraRot(). --- OpenSim/Framework/Util.cs | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'OpenSim/Framework/Util.cs') diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 57c1601..28c818a 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -116,6 +116,60 @@ namespace OpenSim.Framework # endregion + public static Quaternion Axes2Rot(Vector3 fwd, Vector3 left, Vector3 up) + { + float s; + float tr = (float) (fwd.X + left.Y + up.Z + 1.0); + + if (tr >= 1.0) + { + s = (float) (0.5 / Math.Sqrt(tr)); + return new Quaternion( + (left.Z - up.Y) * s, + (up.X - fwd.Z) * s, + (fwd.Y - left.X) * s, + (float) 0.25 / s); + } + else + { + float max = (left.Y > up.Z) ? left.Y : up.Z; + + if (max < fwd.X) + { + s = (float) (Math.Sqrt(fwd.X - (left.Y + up.Z) + 1.0)); + float x = (float) (s * 0.5); + s = (float) (0.5 / s); + return new Quaternion( + x, + (fwd.Y + left.X) * s, + (up.X + fwd.Z) * s, + (left.Z - up.Y) * s); + } + else if (max == left.Y) + { + s = (float) (Math.Sqrt(left.Y - (up.Z + fwd.X) + 1.0)); + float y = (float) (s * 0.5); + s = (float) (0.5 / s); + return new Quaternion( + (fwd.Y + left.X) * s, + y, + (left.Z + up.Y) * s, + (up.X - fwd.Z) * s); + } + else + { + s = (float) (Math.Sqrt(up.Z - (fwd.X + left.Y) + 1.0)); + float z = (float) (s * 0.5); + s = (float) (0.5 / s); + return new Quaternion( + (up.X + fwd.Z) * s, + (left.Z + up.Y) * s, + z, + (fwd.Y - left.X) * s); + } + } + } + public static Random RandomClass { get { return randomClass; } -- cgit v1.1