Thanks to M. Igarashi and nlin for a patch that implements llGetCameraRot().

This commit is contained in:
Dahlia Trimble
2008-10-15 04:42:28 +00:00
parent b70a285373
commit 901acddbdd
3 changed files with 74 additions and 1 deletions

View File

@@ -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; }