Mantis#1768. Thank you kindly, Junta_Kohime for a patch that:

llRot2Fwd function modified, using fast algebric calculations 
instead of vectors and quaternions products. The accuracy is 
the same. Normalization is now implemented.
0.6.0-stable
Charles Krinke 2008-07-18 01:20:06 +00:00
parent 49adb6e09f
commit bc24c0e5d7
2 changed files with 30 additions and 2 deletions

View File

@ -430,7 +430,21 @@ namespace OpenSim.Region.ScriptEngine.Common
public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r)
{
m_host.AddScriptLPS(1);
return (new LSL_Types.Vector3(1,0,0) * r);
double x,y,z,m;
m = Math.Sqrt(r.x*r.x+r.y*r.y+r.z*r.z+r.s*r.s);
// m is always greater than zero
if (m!=1) // if m is not equal to 1 then Rotation needs to be normalized
{
r.x/=m;
r.y/=m;
r.z/=m;
r.s/=m;
}
// Fast Algebric Calculations instead of Vectors & Quaternions Product
x = r.x*r.x-r.y*r.y-r.z*r.z+r.s*r.s;
y = 2*(r.x*r.y+r.z*r.s);
z = 2*(r.x*r.z-r.y*r.s);
return (new LSL_Types.Vector3(x,y,z));
}
public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r)

View File

@ -417,7 +417,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r)
{
m_host.AddScriptLPS(1);
return (new LSL_Types.Vector3(1,0,0) * r);
double x,y,z,m;
m = Math.Sqrt(r.x*r.x+r.y*r.y+r.z*r.z+r.s*r.s);
// m is always greater than zero
if (m!=1) // if m is not equal to 1 then Rotation needs to be normalized
{
r.x/=m;
r.y/=m;
r.z/=m;
r.s/=m;
}
// Fast Algebric Calculations instead of Vectors & Quaternions Product
x = r.x*r.x-r.y*r.y-r.z*r.z+r.s*r.s;
y = 2*(r.x*r.y+r.z*r.s);
z = 2*(r.x*r.z-r.y*r.s);
return (new LSL_Types.Vector3(x,y,z));
}
public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r)