|
|
| (159 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| == About Coordinate Systems and Rotations ==
| | This was moved elsewhere... |
| | |
| === The four coordinate systems ===
| |
| | |
| There are four coordinate systems that are related to LSL programming:
| |
| # World coordinates
| |
| # Region coordinates
| |
| # Object coordinates (root prim coordinates)
| |
| # Prim coordinates
| |
| | |
| The World coordinates refer to the map, and allow to include the sim
| |
| in the coordinates, or refer to void water.
| |
| | |
| Region coordinates are relative to a given sim.
| |
| The origin is in the South/West corner at height 0.
| |
| The North/East corner then is 256, 256 and a Z coordinate
| |
| for the height up to 4096 meter (on opensim you can go even
| |
| higher).
| |
| | |
| Object coordinates are relative to the root prim. Hence, if the object
| |
| is moved or rotated then the orientation of a child prim, when given
| |
| in object coordinates, doesn't change. In LSL "local position" and
| |
| "local rotation" refer to this coordinate system. "local" means
| |
| relative to the root prim.
| |
| | |
| Prim Coordinates are relative to a given prim. If this prim is the root
| |
| prim then the Prim Coordinates are the same as the Object Coordinates.
| |
| For example, if a child prim is a cube with a size of 1,1,1 and one
| |
| red surface where the center of that surface is at 1,0,0 then it will
| |
| still be at 1,0,0 no matter how you move or rotate that child prim
| |
| (relative to the other linked prims).
| |
| | |
| === Positions ===
| |
| | |
| A different position of the origin of a coordinate system is easy to understand:
| |
| You can think of positions as vectors that start in the origin of the
| |
| coordinate system that they are given in and end in the point that they
| |
| refer to. While the length of the vector is independent of the rotation of
| |
| the coordinate system, the three coordinates are not; but a mental picture
| |
| of an arrow doesn't have little numbers for three coordinates, so that
| |
| picture works independent of the rotation too.
| |
| | |
| Since the rotation of the World Coordinate system and the Region Coordinate
| |
| system is the same (X, Y and Z axis are parallel of both), and since
| |
| World Coordinates aren't used in many LSL functions to begin with, we
| |
| will ignore World Coordinates for now and only refer to Region Coordinates,
| |
| or say "global" when we mean Region Coordinates.
| |
| | |
| === Rotations ===
| |
| | |
| An LSL rotation internally stores a vector that is the axis around which
| |
| to rotate and the angle of the rotation around that axis.
| |
| Let V = <u, v, w> be the normalized vector (that is, with length 1) around
| |
| which we rotate and let a be the angle around which we have to rotate.
| |
| Then the LSL rotation is a quaternion stored as r = <x, y, z, s> = < V * sin(a/2), cos(a/2) >.
| |
| Thus, r.x = x * sin(a/2), and r.s = cos(a/2) etc. Note that the quaternion
| |
| is also normalized.
| |
| Also note that there is a duality here because inverting v (making it point the
| |
| opposite way) and inverting the angle gives the same rotation; r and -r have
| |
| different values but are the same rotation.
| |
| Also note that if you don't rotate at all (a == 0) then it doesn't matter
| |
| what axis V you pick, which is apparent because V drops out since sin(0) = 0.
| |
| The quaternion <0, 0, 0, 1> is the ZERO_ROTATION quaternion.
| |
| | |
| The point of this technical story is to show that for an LSL rotation to
| |
| make sense in terms of orientation, you need to be able to express a vector
| |
| in three coordinates (u, v, w above): the axis around which we rotate is
| |
| expressed relative to the X-, Y- and Z-axes of the coordinate system. Hence,
| |
| it is the orientation of the X-, Y- and Z-axes that defines the meaning
| |
| of a rotation in LSL.
| |
| | |
| In terms of a mental picture the origin with the (orientation of the) three axis,
| |
| the red X-axis, the green Y-axis and the blue Z-axis is all the reference
| |
| we need, combined with a vector for position and a quaternion for rotation.
| |
| When you edit an object, the viewer shows either 'World' or 'Local' axes, but
| |
| really the 'World' axes show the wrong origin (shifted to an averaged center
| |
| of the object) because if the origin was drawn at (0, 0, 0) you'd most likely
| |
| not see it). The 'Local' ruler shows the correct coordinate system for the
| |
| selected prim as its Prim Coordinate System. Selecting the root prim with
| |
| 'Local' ruler on then shows the Object Coordinate System.
| |
This was moved elsewhere...