diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ac22638..7af5d2d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -3040,34 +3040,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3040 | public void llLookAt(LSL_Vector target, double strength, double damping) | 3040 | public void llLookAt(LSL_Vector target, double strength, double damping) |
3041 | { | 3041 | { |
3042 | m_host.AddScriptLPS(1); | 3042 | m_host.AddScriptLPS(1); |
3043 | // Determine where we are looking from | ||
3044 | LSL_Vector from = llGetPos(); | ||
3045 | 3043 | ||
3046 | // Work out the normalised vector from the source to the target | 3044 | // Get the normalized vector to the target |
3047 | LSL_Vector delta = llVecNorm(target - from); | 3045 | LSL_Vector d1 = llVecNorm(target - llGetPos()); |
3048 | LSL_Vector angle = new LSL_Vector(0,0,0); | ||
3049 | 3046 | ||
3050 | // Calculate the yaw | 3047 | // Get the bearing (yaw) |
3051 | // subtracting PI_BY_TWO is required to compensate for the odd SL co-ordinate system | 3048 | LSL_Vector a1 = new LSL_Vector(0,0,0); |
3052 | angle.x = llAtan2(delta.z, delta.y) - ScriptBaseClass.PI_BY_TWO; | 3049 | a1.z = llAtan2(d1.y, d1.x); |
3053 | 3050 | ||
3054 | // Calculate pitch | 3051 | // Get the elevation (pitch) |
3055 | angle.y = llAtan2(delta.x, llSqrt((delta.y * delta.y) + (delta.z * delta.z))); | 3052 | LSL_Vector a2 = new LSL_Vector(0,0,0); |
3053 | a2.y= -llAtan2(d1.z, llSqrt((d1.x * d1.x) + (d1.y * d1.y))); | ||
3056 | 3054 | ||
3057 | // we need to convert from a vector describing | 3055 | LSL_Rotation r1 = llEuler2Rot(a1); |
3058 | // the angles of rotation in radians into rotation value | 3056 | LSL_Rotation r2 = llEuler2Rot(a2); |
3057 | LSL_Rotation r3 = new LSL_Rotation(0.000000, 0.707107, 0.000000, 0.707107); | ||
3059 | 3058 | ||
3060 | LSL_Rotation rot = llEuler2Rot(angle); | 3059 | if (m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) |
3061 | |||
3062 | // Per discussion with Melanie, for non-physical objects llLookAt appears to simply | ||
3063 | // set the rotation of the object, copy that behavior | ||
3064 | if (strength == 0 || m_host.PhysActor == null || !m_host.PhysActor.IsPhysical) | ||
3065 | { | 3060 | { |
3066 | llSetRot(rot); | 3061 | // Do nothing if either value is 0 (this has been checked in SL) |
3062 | if (strength <= 0.0 || damping <= 0.0) | ||
3063 | return; | ||
3064 | |||
3065 | llSetRot(r3 * r2 * r1); | ||
3067 | } | 3066 | } |
3068 | else | 3067 | else |
3069 | { | 3068 | { |
3070 | m_host.StartLookAt(Rot2Quaternion(rot), (float)strength, (float)damping); | 3069 | if (strength == 0) |
3070 | { | ||
3071 | llSetRot(r3 * r2 * r1); | ||
3072 | return; | ||
3073 | } | ||
3074 | |||
3075 | m_host.StartLookAt(Rot2Quaternion(r3 * r2 * r1), (float)strength, (float)damping); | ||
3071 | } | 3076 | } |
3072 | } | 3077 | } |
3073 | 3078 | ||