<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fashion+Atlas</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fashion+Atlas"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Fashion_Atlas"/>
	<updated>2026-06-04T03:15:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Avatar_Appearance&amp;diff=1192237</id>
		<title>Avatar Appearance</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Avatar_Appearance&amp;diff=1192237"/>
		<updated>2014-07-18T08:26:08Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: /* Base mesh */  standart &amp;#039;&amp;#039;&amp;#039;morphName&amp;#039;&amp;#039;&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{KBcaution|&#039;&#039;&#039;[http://bit.ly/aczoWU See this if you&#039;re looking for general Appearance Editor help for Viewer 2.1.]&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
{{ProtocolNav}}&lt;br /&gt;
[[Category:Viewer Architecture]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
For a good introduction to the elements of 3D character graphics, including meshes, morphs, bones, rendering, quaternions, and more see [http://www.gup.uni-linz.ac.at/~gk/Diplom/CART-Martin.pdf Martin Garstenauer&#039;s thesis].&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Appearance Components ==&lt;br /&gt;
SL Avatar has &amp;quot;wearables&amp;quot; plus &amp;quot;attachments&amp;quot; for static appearance, and &amp;quot;animations&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Wearables === &lt;br /&gt;
Wearables encompass both clothing and body parts – represent customizations of the basic avatar mesh via parameterized changes and textures.&lt;br /&gt;
&lt;br /&gt;
Clothing can be taken off, but body parts cannot. Otherwise, they are similar.&lt;br /&gt;
&lt;br /&gt;
Wearables are created by the viewer when appearance is edited and the results are saved; changed parts of appearance (clothing, bodyparts) are saved as new wearables which are uploaded as assets. There is no support for directly importing or exporting wearables.&lt;br /&gt;
&lt;br /&gt;
=== Attachments ===&lt;br /&gt;
An &amp;quot;attachment&amp;quot; is an object (&amp;quot;linked set of primitives&amp;quot;) which is rooted in the scene graph on an attachment point on an avatar.  They are otherwise the same as other objects in SL, and can contain and execute scripts, inventory, maintain state, etc.&lt;br /&gt;
&lt;br /&gt;
Attachments are heavily used for hair, some parts of clothing (dresses, cuffs) and accessories (jewelery, weapons). Non-humanoid avatars may use attachments to completely obscure the underlying humanoid avatar mesh.&lt;br /&gt;
&lt;br /&gt;
Attachments are never serialized as files on the viewer, and there is no import/export support. Attachments are only transmitted to/from the viewer as ObjectUpdate messages which describe the constantly updating scene graph of the simulation.  Attachments are created/modified using the &amp;quot;build&amp;quot; tools in the viewer; modifications are transmitted from the viewer to the simulator as editing messages. The simulator then broadcasts the changes to other users as ObjectUpdates. When an attachment is saved to inventory, the linked set of prims structure is serialized to a structure that includes script state.&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
Animations are BVH files (&#039;&#039;&#039;B&#039;&#039;&#039;io&#039;&#039;&#039;V&#039;&#039;&#039;ision &#039;&#039;&#039;H&#039;&#039;&#039;eirarchical data), a format developed by Biovision, a motion capture services company. Animations can be added to a scripted object to be played (e.g. a &amp;quot;poseball&amp;quot;), or incorporated into a gesture (a sequence of actions including text, sounds and animations invoked manually or triggered by a keyword). However, animations are often thought of as parts of avatars when they are controlled by an attachment to alter the avatar&#039;s default animations. &lt;br /&gt;
&lt;br /&gt;
One common case is as an &amp;quot;Animation Override&amp;quot; script. These are used along with creative animations to deform the skeleton. Sometimes these override only some of the default animations (e.g. directed attention), sometimes everything is overridden. For example, &amp;quot;tinies&amp;quot; are created by folding the skeleton&#039;s limbs back on themselves. Non-humanoid avatars often use &amp;quot;meatballs&amp;quot; animations that compress the avatar to such an extent that it can be hidden inside an attachment.  See [[Avatar deformation]] for more information.&lt;br /&gt;
&lt;br /&gt;
Animations can be created in third party tools (e.g. Poser, QAvimator) and uploaded via File &amp;gt; Upload Animation (L$10). The animation is added to the inventory, and can then be incorporated into a script or gesture.&lt;br /&gt;
&lt;br /&gt;
==Packets==&lt;br /&gt;
&lt;br /&gt;
* [[AgentWearablesRequest]]&lt;br /&gt;
** This is where it starts. The viewer asks the simulator what it is wearing, and an AgentWearablesUpdate packet is returned.&lt;br /&gt;
* [[AgentWearablesUpdate]]&lt;br /&gt;
** A mapping of wearable types to asset IDs and item IDs is returned to the client. There are currently 13 different wearable types and all 13 will always be returned in this packet. If your avatar is not wearing a wearable type the asset ID and item ID for that type will be null IDs (all zeros). The next step is to request an asset transfer for all of the non-null asset IDs and download the wearable assets.&lt;br /&gt;
* [[AgentIsNowWearing]]&lt;br /&gt;
** Like the AgentWearablesUpdate packet but in the other direction. The viewer sends a list of the 13 wearable types and their associated item IDs, or null if nothing is being worn in that wearable slot. This is typically sent right before AgentSetAppearance.&lt;br /&gt;
* [[AgentSetAppearance]]&lt;br /&gt;
** Serves two purposes, to tell the server how our avatar mesh is deformed (with visual parameters) and what textures we are wearing. There are currently 218 VisualParam blocks sent with each AgentSetAppearance describing everything from the color of the avatar eyes to the gender slider. A TextureEntry is also sent that uses the same TextureEntry format objects use, but each &amp;quot;face&amp;quot; is hard-coded to describe a particular texture. This may or may not include baked textures for the five different baked layers (head, upper, lower, eyes, and skirt).&lt;br /&gt;
**The ParamValue fields do not have parameter IDs associated with them in the packet, as it&#039;s assumed all viewers have the same parameter map in the same sequence. The parameters are stored internally as a floating point integer, and are converted to a single byte by inputting the value along with minimum and maximum weights for that parameter to a conversion function.&lt;br /&gt;
&lt;br /&gt;
* [[AvatarAppearance]]&lt;br /&gt;
* [[AgentCachedTexture]]&lt;br /&gt;
* [[AgentCachedTextureResponse]]&lt;br /&gt;
&lt;br /&gt;
==Linden avatar definition file==&lt;br /&gt;
&lt;br /&gt;
The parameters affecting avatar appearance are defined in an XML file&lt;br /&gt;
located in the executable at&lt;br /&gt;
: SecondLife\character\avatar_lad.xml&lt;br /&gt;
and in the source code at&lt;br /&gt;
: linden\indra\newview\character\avatar_lad.xml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With a few exceptions&lt;br /&gt;
: genepool.xml&lt;br /&gt;
: rouge_alpha.tga&lt;br /&gt;
: underpants_trial_female.tga&lt;br /&gt;
: underpants_trial_male.tga&lt;br /&gt;
: undershirt_trial_female.tga&lt;br /&gt;
: upperbodyfreckles_alpha.tga&lt;br /&gt;
all of the other files in the same directory are referenced by avatar_lad.xml.  These include the mesh files (.llm), the texture files (.tga) and the avatar_skeleton.xml file (see below).&lt;br /&gt;
&lt;br /&gt;
genepool.xml contains parameter sets for wearable types WT_SHAPE, WT_SKIN, WT_HAIR, and WT_EYES for several archetypal avatar definitions.  This file supported the Randomize feature in the appearance editor. The functionality was removed in viewer 1.23, but a vestigial copy of genepool.xml may still be present. You can see the current parameter set for your own avatar by invoking the debug menus (Ctrl-Alt-D) and selecting&lt;br /&gt;
Client-&amp;gt;Character-&amp;gt;Character Tests-&amp;gt;Appearance To XML.  This will create a file&lt;br /&gt;
: SecondLife\character\new archetype.xml&lt;br /&gt;
in the same format as genepool.xml.&lt;br /&gt;
&lt;br /&gt;
The avatar definition file affects the appearances on your viewer only.  Any change to the file will not affect how others see the avatars.  You can set value_default=&amp;quot;1&amp;quot; for &amp;quot;Express_Tongue_Out&amp;quot; to make the avatars on your viewer give you the raspberries, but no one else will notice.&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that this file defines parameters that can be used in animations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File structure===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;linden_avatar version=&amp;quot;1.0&amp;quot; wearable_definition_version=&amp;quot;22&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;skeleton file_name=&amp;quot;avatar_skeleton.xml&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;attachment_point&#039;&#039; id=&amp;quot;1&amp;quot; group=&amp;quot;6&amp;quot; name=&amp;quot;Chest&amp;quot; joint=&amp;quot;mChest&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
::       position=&amp;quot;0.15 0 -0.1&amp;quot; rotation=&amp;quot;0 90 90&amp;quot; visible_in_first_person=&amp;quot;true&amp;quot;&lt;br /&gt;
::       pie_slice=&amp;quot;2&amp;quot; hud=&amp;quot;true&amp;quot; max_attachment_offset=&amp;quot;1.5&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&#039;&#039;&amp;lt;bone&#039;&#039; name=&amp;quot;mNeck&amp;quot; scale=&amp;quot;0 0 .2&amp;quot;&#039;&#039;&#039; offset=&amp;quot;0 0 .004&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;/skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Sets of&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;mesh type=&amp;quot;hairMesh&amp;quot; lod=&amp;quot;0&amp;quot; file_name=&amp;quot;avatar_hair.llm&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:      min_pixel_width=&amp;quot;320&amp;quot; min_pixel_area=&amp;quot;0.1&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_morph /&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::or&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_morph&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::             &#039;&#039;&#039;&#039;&#039;&amp;lt;volume_morph&#039;&#039;&#039;&#039;&#039; name=&amp;quot;HEAD&amp;quot; scale=&amp;quot;-0.008 -0.006 0.015&amp;quot;&lt;br /&gt;
::::             pos=&amp;quot;0.07 0 -0.07&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_morph&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;/mesh&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&amp;lt;mesh&#039;&#039; &#039;&#039;&#039;type=&amp;quot;hairMesh&amp;quot; lod=&amp;quot;1&amp;quot; file_name=&amp;quot;avatar_hair_1.llm&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:    min_pixel_width=&amp;quot;160&amp;quot; min_pixel_area=&amp;quot;0.1&amp;quot; &#039;&#039;&#039;reference=&amp;quot;avatar_hair.llm&amp;quot;&#039;&#039;&#039;&#039;&#039;&amp;gt;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&amp;lt;/mesh&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:    &#039;&#039;&#039;&#039;&#039;&amp;lt;global_color&#039;&#039; name=&amp;quot;skin_color&amp;quot;&#039;&#039;&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
::      &#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_color&#039;&#039;&#039; operation=&amp;quot;blend&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::             &#039;&#039;&#039;&#039;&#039;&amp;lt;value&#039;&#039; color=&amp;quot;252, 215, 200, 255&amp;quot; &#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_color&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::      &#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:    &#039;&#039;&#039;&#039;&#039;&amp;lt;/global_color&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:    &#039;&#039;&#039;&#039;&#039;&amp;lt;layer_set&#039;&#039; body_region=&amp;quot;head&amp;quot; width=&amp;quot;512&amp;quot; height=&amp;quot;512&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:    clear_alpha=&amp;quot;false&amp;quot; alpha_tga_file=&amp;quot;head_alpha.tga&amp;quot; &#039;&#039;&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;layer&#039;&#039; name=&amp;quot;head bump definition&amp;quot;&#039;&#039;&#039; render_pass=&amp;quot;bump&amp;quot;&lt;br /&gt;
::       global_color=&amp;quot;hair_color&amp;quot; fixed_color=&amp;quot;128,128,128,255&amp;quot;&lt;br /&gt;
::       write_all_channels=&amp;quot;true&amp;quot; &#039;&#039;&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:::        &amp;lt;texture &#039;&#039;&#039;local_texture=&amp;quot;lower_jacket&amp;quot;&#039;&#039;&#039; local_texture_alpha_only=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
:::and if not fixed_color&lt;br /&gt;
:::        &amp;lt;texture &#039;&#039;&#039;tga_file=&amp;quot;bump_head_base.tga&amp;quot;&#039;&#039;&#039; file_is_mask=&amp;quot;FALSE&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::        &#039;&#039;&amp;lt;morph_mask&#039;&#039; morph_name=&amp;quot;Displace_Loose_Upperbody&amp;quot; invert=&amp;quot;FALSE&amp;quot; &#039;&#039;/&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:::        &#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&amp;lt;param_alpha&#039;&#039;&#039; tga_file=&amp;quot;bump_face_wrinkles.tga&amp;quot; skip_if_zero=&amp;quot;true&amp;quot;&lt;br /&gt;
::::             multiply_blend=&amp;quot;false&amp;quot; domain=&amp;quot;0&amp;quot; &#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::or&lt;br /&gt;
::::            &#039;&#039;&#039;&amp;lt;param_color&#039;&#039;&#039; operation=&amp;quot;multiply&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::::               &#039;&#039;&#039;&#039;&#039;&amp;lt;value&#039;&#039; color=&amp;quot;0, 0, 0, 0&amp;quot; &#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&amp;lt;/param_color&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&lt;br /&gt;
::      &#039;&#039;&#039;&#039;&#039;&amp;lt;/layer&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&#039;&#039;&amp;lt;/layer_set&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;driver_parameters&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_driver&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&#039;&#039;&amp;lt;driven&#039;&#039; id=&amp;quot;628&amp;quot;&#039;&#039;&#039; min1=&amp;quot;0.1&amp;quot; max1=&amp;quot;0.5&amp;quot; max2=&amp;quot;1&amp;quot; min2=&amp;quot;1&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_driver&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;/driver_parameters&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/linden_avatar&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;&#039;bold&#039;&#039;&#039; text indicates required tags or parameters, standard text&lt;br /&gt;
indicates a tag that can occur zero or one time, &#039;&#039;italics&#039;&#039;&lt;br /&gt;
indicates that the tag can be repeated zero or more times, and &#039;&#039;&#039;&#039;&#039;bold italics&#039;&#039;&#039;&#039;&#039; indicates&lt;br /&gt;
that at least one is required but more are possible.&lt;br /&gt;
&lt;br /&gt;
Note that the values shown for parameters here may not be consistent.  They are shown only&lt;br /&gt;
to indicate the value type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Parameter detail===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;param ... &amp;gt; is&lt;br /&gt;
&lt;br /&gt;
:      &#039;&#039;&#039;&amp;lt;param id=&amp;quot;32&amp;quot;&#039;&#039;&#039; group=&amp;quot;1&amp;quot; name=&amp;quot;Male_Skeleton&amp;quot;&lt;br /&gt;
:       value_min=&amp;quot;0&amp;quot; value_max=&amp;quot;1&amp;quot; value_default=&amp;quot;0&amp;quot;&lt;br /&gt;
:       edit_group=&amp;quot;shape_body&amp;quot; edit_group_order=&amp;quot;1&amp;quot;&lt;br /&gt;
:       label=&amp;quot;Skeleton&amp;quot; label_min=&amp;quot;Female&amp;quot; label_max=&amp;quot;Male&amp;quot;&lt;br /&gt;
:       wearable=&amp;quot;shape&amp;quot; clothing_morph=&amp;quot;true&amp;quot; sex=&amp;quot;male&amp;quot; shared=&amp;quot;1&amp;quot;&lt;br /&gt;
:       show_simple=&amp;quot;true&amp;quot; simple_percent_min=&amp;quot;40&amp;quot; simple_percent_max=&amp;quot;100&amp;quot;&lt;br /&gt;
:       camera_distance=&amp;quot;2.2&amp;quot; camera_elevation=&amp;quot;.1&amp;quot; camera_angle=&amp;quot;0&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parameters are parsed in LLViewerVisualParamInfo::parseXml and LLVisualParamInfo::parseXml and are used by LLViewerVisualParam and LLVisualParam respectively when LLVOAvatar::loadAvatar is called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fields parsed in LLVisualParamInfo are used to describe the meaning of the parameters.&lt;br /&gt;
&lt;br /&gt;
;id -- mID&lt;br /&gt;
;name -- mName&lt;br /&gt;
:default &amp;quot;&amp;quot;&lt;br /&gt;
;group -- mGroup&lt;br /&gt;
:&amp;quot;0&amp;quot; is VISUAL_PARAM_GROUP_TWEAKABLE&lt;br /&gt;
:&amp;quot;1&amp;quot; is VISUAL_PARAM_GROUP_ANIMATABLE&lt;br /&gt;
:default &amp;quot;0&amp;quot;&lt;br /&gt;
;value_min -- mMinWeight&lt;br /&gt;
:default 0.&lt;br /&gt;
;value_max -- mMaxWeight&lt;br /&gt;
:default 1.&lt;br /&gt;
;value_default -- mDefaultWeight&lt;br /&gt;
:default 0.&lt;br /&gt;
;sex -- mSex&lt;br /&gt;
{|&lt;br /&gt;
| || || &amp;quot;both&amp;quot; || SEX_BOTH&lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;male&amp;quot; || SEX_MALE&lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;female&amp;quot; || SEX_FEMALE&lt;br /&gt;
|-&lt;br /&gt;
| || || default || SEX_BOTH&lt;br /&gt;
|}&lt;br /&gt;
;label -- mDisplayName&lt;br /&gt;
:default is name&lt;br /&gt;
;label_min -- mMinName&lt;br /&gt;
:default is &amp;quot;Less&amp;quot;&lt;br /&gt;
;label_max -- mMaxName&lt;br /&gt;
:default is &amp;quot;More&amp;quot;&lt;br /&gt;
;shared&lt;br /&gt;
:Used only by mesh params.  Indicates that the param affects more than one mesh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fields parsed in LLViewerVisualParamInfo describe the appearance of the entries on the Edit-&amp;gt;Appearance editing panel.&lt;br /&gt;
&lt;br /&gt;
;wearable -- mWearableType&lt;br /&gt;
{|&lt;br /&gt;
| || || &amp;quot;shape&amp;quot; ||       WT_SHAPE      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;skin&amp;quot;  ||       WT_SKIN       &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;hair&amp;quot;  ||       WT_HAIR       &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;eyes&amp;quot;  ||       WT_EYES       &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;shirt&amp;quot; ||       WT_SHIRT      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;pants&amp;quot; ||       WT_PANTS      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;shoes&amp;quot; ||       WT_SHOES      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;socks&amp;quot; ||       WT_SOCKS      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;jacket&amp;quot;     ||  WT_JACKET     &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;gloves&amp;quot;     ||  WT_GLOVES     &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;undershirt&amp;quot; ||  WT_UNDERSHIRT &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;underpants&amp;quot; ||  WT_UNDERPANTS &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;skirt&amp;quot;      ||  WT_SKIRT      &lt;br /&gt;
|-&lt;br /&gt;
| || || default      ||  WT_INVALID&lt;br /&gt;
|}&lt;br /&gt;
;edit_group -- mEditGroup&lt;br /&gt;
:default &amp;quot;&amp;quot;&lt;br /&gt;
;edit_group_order  -- mEditGroupDisplayOrder &lt;br /&gt;
:By default, value 0, parameters are displayed in the order in which they appear in the xml file.  &amp;quot;edit_group_order&amp;quot; overriddes this.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Optional camera offsets from the current joint center.  Used for generating &amp;quot;hints&amp;quot; (thumbnails).&lt;br /&gt;
;camera_distance -- mCamDist&lt;br /&gt;
:default 0.5&lt;br /&gt;
;camera_angle -- mCamAngle&lt;br /&gt;
:default 0.&lt;br /&gt;
;camera_elevation -- mCamElevation&lt;br /&gt;
:default 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;show_simple -- mShowSimple : value is ignored&lt;br /&gt;
:default FALSE&lt;br /&gt;
;simple_percent_min -- mSimpleMin : value is ignored&lt;br /&gt;
:default 0.&lt;br /&gt;
;simple_percent_max -- mSimpleMax : value is ignored&lt;br /&gt;
:default 100.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Loading the file===&lt;br /&gt;
&lt;br /&gt;
The file is parsed in LLVOAvatar::initClass() primarily by calls to LLVOAvatarInfo.  Both classes are defined in indra\newview\llvoavatar.h(.cpp).&lt;br /&gt;
There is one method for each of the major XML nodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlSkeletonNode&lt;br /&gt;
:LLVOAvatarInfo::parseXmlMeshNodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlColorNodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlLayerNodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlDriverNodes&lt;br /&gt;
&lt;br /&gt;
This data is then used to create instances of LLVOAvatar in LLVOAvatar::loadAvatar()&lt;br /&gt;
which invokes LLVOAvatar::loadSkeletonNode() and LLVOAvatar::loadMeshNodes().&lt;br /&gt;
&lt;br /&gt;
==LLVisualParam==&lt;br /&gt;
&lt;br /&gt;
The avatar visual parameters are divided into those that define the avatar&#039;s appearance and those that are used in animations.  Theoretically, they all could be used for animations, but the animations would have to start and end at the settings defined for the avatar rather than at the default values.&lt;br /&gt;
&lt;br /&gt;
The group field of the &amp;lt;param&amp;gt; tag identifies those that are directly set in Edit-&amp;gt;Appearance and sent in [[AgentSetAppearance]] messages as VISUAL_PARAM_GROUP_TWEAKABLE.  The rest are identified as VISUAL_PARAM_GROUP_ANIMATABLE, but this is a bit misleading because it includes all of the driven parameters defined in the &amp;lt;driver_parameters&amp;gt; stanza.  These are set by the driver parameters which are themselves directly tweakable.&lt;br /&gt;
&lt;br /&gt;
Those that are not directly or indirectly tweakable include the emotes&lt;br /&gt;
:* 300  Express_Closed_Mouth&lt;br /&gt;
:* 301  Express_Tongue_Out&lt;br /&gt;
:* 302  Express_Surprise_Emote&lt;br /&gt;
:* 303  Express_Wink_Emote&lt;br /&gt;
:* 304  Express_Embarrassed_Emote&lt;br /&gt;
:* 305  Express_Shrug_Emote&lt;br /&gt;
:* 306  Express_Kiss&lt;br /&gt;
:* 307  Express_Bored_Emote&lt;br /&gt;
:* 308  Express_Repulsed_Emote&lt;br /&gt;
:* 309  Express_Disdain&lt;br /&gt;
:* 310  Express_Afraid_Emote&lt;br /&gt;
:* 311  Express_Worry_Emote&lt;br /&gt;
:* 312  Express_Cry_Emote&lt;br /&gt;
:* 313  Express_Sad_Emote&lt;br /&gt;
:* 314  Express_Anger_Emote&lt;br /&gt;
:* 315  Express_Frown&lt;br /&gt;
:* 316  Express_Laugh_Emote&lt;br /&gt;
:* 317  Express_Toothsmile&lt;br /&gt;
:* 318  Express_Smile&lt;br /&gt;
:* 632  Express_Open_Mouth&lt;br /&gt;
the hand morphs&lt;br /&gt;
:* 101   Hands_Relaxed&lt;br /&gt;
:* 102   Hands_Point&lt;br /&gt;
:* 103   Hands_Fist&lt;br /&gt;
:* 666   Hands_Relaxed_L&lt;br /&gt;
:* 667   Hands_Point_L&lt;br /&gt;
:* 668   Hands_Fist_L&lt;br /&gt;
:* 669   Hands_Relaxed_R&lt;br /&gt;
:* 670   Hands_Point_R&lt;br /&gt;
:* 671   Hands_Fist_R&lt;br /&gt;
:* 672   Hands_Typing&lt;br /&gt;
:* 766   Hands_Salute_R&lt;br /&gt;
:* 791   Hands_Peace_R&lt;br /&gt;
:* 792   Hands_Spread_R&lt;br /&gt;
and blinking eyes&lt;br /&gt;
:* 58   Blink_Left&lt;br /&gt;
:* 59   Blink_Right&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The remaining visual params include a few useful for animations&lt;br /&gt;
:* 51   Furrowed_Eyebrows&lt;br /&gt;
:* 53   Surprised_Eyebrows&lt;br /&gt;
:* 54   Worried_Eyebrows&lt;br /&gt;
:* 55   Frown_Mouth&lt;br /&gt;
:* 57   Smile_Mouth&lt;br /&gt;
and a couple that seem to have been abandoned&lt;br /&gt;
:* 41   Old&lt;br /&gt;
:* 128   Wrinkles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Linden skeleton definition file==&lt;br /&gt;
&lt;br /&gt;
The skeletal structure is defined in an XML file located in the executable at&lt;br /&gt;
: SecondLife\character\avatar_skeleton.xml&lt;br /&gt;
and in the source code at&lt;br /&gt;
: linden\indra\newview\character\avatar_skeleton.xml&lt;br /&gt;
&lt;br /&gt;
It is referenced through the avatar definition file (see above) and can be&lt;br /&gt;
considered to be part of the avatar definition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File structure===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;linden_skeleton version=&amp;quot;1.0&amp;quot; num_bones=&amp;quot;46&amp;quot; num_collision_volumes=&amp;quot;19&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;bone name=&amp;quot;mPelvis&amp;quot; pos=&amp;quot;0.000 0.000 1.067&amp;quot; rot=&amp;quot;0.000000 0.000000 0.000000&amp;quot;&lt;br /&gt;
:   &#039;&#039;&#039;scale=&amp;quot;1.000 1.000 1.000&amp;quot; pivot=&amp;quot;0.000000 0.000000 1.067015&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &amp;lt;collision_volume &#039;&#039;&#039;name=&amp;quot;PELVIS&amp;quot; pos = &amp;quot;-0.01 0 -0.02&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;rot=&amp;quot;0.000000 8.00000 0.000000&amp;quot; scale=&amp;quot;0.12 0.16 0.17&amp;quot;&#039;&#039;&#039;/&amp;gt;&lt;br /&gt;
::       &#039;&#039;&amp;lt;bone ...&amp;gt;&#039;&#039;&lt;br /&gt;
::	 &#039;&#039;&amp;lt;/bone&amp;gt;&#039;&#039;&lt;br /&gt;
:    &#039;&#039;&#039;&amp;lt;/bone&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/linden_skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;&#039;bold&#039;&#039;&#039; text indicates required tags or parameters, standard text&lt;br /&gt;
indicates a tag that can occur zero or one time, and &#039;&#039;italics&#039;&#039;&lt;br /&gt;
indicates that the tag can be repeated zero or more times.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;bone ...&amp;gt; tag above is to indicate that the structure is recursive.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;46&amp;quot; for num_bones is actually a typo in the file.  There are only 26 bones defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Loading the file===&lt;br /&gt;
&lt;br /&gt;
The file is parsed in LLVOAvatar::initClass() using LLVOAvatarSkeletonInfo::parseXml. Both classes are defined in indra\newview\llvoavatar.h(.cpp).&lt;br /&gt;
&lt;br /&gt;
This data is then used to create instances of LLVOAvatar in LLVOAvatar::loadAvatar()&lt;br /&gt;
which invokes LLVOAvatar::buildSkeleton().  A special-purpose &amp;quot;screen&amp;quot; joint named &amp;quot;mScreen&amp;quot; is also created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Linden binary mesh file==&lt;br /&gt;
&lt;br /&gt;
Meshes are defined in binary files located in the executable at&lt;br /&gt;
: SecondLife\character\*.llm&lt;br /&gt;
and in the source code at&lt;br /&gt;
: linden\indra\newview\character\*.llm&lt;br /&gt;
&lt;br /&gt;
They are referenced through the avatar definition file (see above) and can be&lt;br /&gt;
considered to be part of the avatar definition.&lt;br /&gt;
&lt;br /&gt;
The morphName in the binary mesh file matches the name field of the visual params with &amp;lt;param_morph&amp;gt; tags in the &amp;lt;mesh&amp;gt; stanzas.  There are a few morphs defined in the mesh files that are not used by the avatar definition file&lt;br /&gt;
:* Blink_Both&lt;br /&gt;
:* Fingernails_Long&lt;br /&gt;
:* Wide_Lips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two types of mesh files:  the base mesh definition and the level of detail (LOD) mesh definition, which always references a base mesh definition file.  LOD meshes are used to simplify the rendering when the avatar is distant from the camera.  There are several LOD meshes with progressively decreasing resolution.&lt;br /&gt;
&lt;br /&gt;
The vertex information referenced by the LOD meshes is stored at the beginning of the base mesh vertex information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File structure===&lt;br /&gt;
====Base mesh====&lt;br /&gt;
&lt;br /&gt;
:char[24] &amp;quot;Linden Binary Mesh 1.0&amp;quot;&lt;br /&gt;
:U8 hasWeights&lt;br /&gt;
:U8 hasDetailTexCoords&lt;br /&gt;
:LLVector3 position&lt;br /&gt;
:LLVector3 rotationAngles&lt;br /&gt;
:U8 rotationOrder (ignored, set to 0)&lt;br /&gt;
:LLVector3 scale&lt;br /&gt;
:U16 numVertices&lt;br /&gt;
:LLVector3[ numVertices ] baseCoords&lt;br /&gt;
:LLVector3[ numVertices ] baseNormals&lt;br /&gt;
:LLVector3[ numVertices ] baseBinormals&lt;br /&gt;
:LLVector2[ numVertices ] texCoords&lt;br /&gt;
:if (hasDetailTexCoords)&lt;br /&gt;
::LLVector2[ numVertices ] detailTexCoords&lt;br /&gt;
:if (hasWeights)&lt;br /&gt;
::F32[ numVertices ] weights&lt;br /&gt;
:U16 numFaces&lt;br /&gt;
:struct faces[ numFaces ]&lt;br /&gt;
:{&lt;br /&gt;
::S16[3] face&lt;br /&gt;
:}&lt;br /&gt;
:if ( hasWeights )&lt;br /&gt;
:{&lt;br /&gt;
::U16 numSkinJoints&lt;br /&gt;
::struct skinJoints[ numSkinJoints ]&lt;br /&gt;
::{&lt;br /&gt;
:::char[64] jointName&lt;br /&gt;
::}&lt;br /&gt;
:}&lt;br /&gt;
:struct morph []&lt;br /&gt;
:{&lt;br /&gt;
::char[64] morphName&lt;br /&gt;
::S32 numVertices&lt;br /&gt;
::struct vertices[ numVertices ]&lt;br /&gt;
::{&lt;br /&gt;
:::U32 vertexIndex&lt;br /&gt;
:::LLVector3 coord&lt;br /&gt;
:::LLVector3 normal&lt;br /&gt;
:::LLVector3 binormal&lt;br /&gt;
:::LLVector2 texCoord&lt;br /&gt;
::}&lt;br /&gt;
:}&lt;br /&gt;
:char[64] &amp;quot;End Morphs&amp;quot;&lt;br /&gt;
:S32 numRemaps (or EOF)&lt;br /&gt;
:struct vertexRemap[ numRemaps ]&lt;br /&gt;
:{&lt;br /&gt;
::S32 remapSource&lt;br /&gt;
::S32 remapDestination&lt;br /&gt;
:}&lt;br /&gt;
where standart &#039;&#039;&#039;morphName&#039;&#039;&#039; for &#039;&#039;&#039;avatar_upper_body.llm&#039;&#039;&#039; is:&lt;br /&gt;
&lt;br /&gt;
Big_Belly_Torso, Big_Chest, Breast_Female_Cleavage, Breast_Gravity, Chest_Male_No_Pecs, Displace_Loose_Upperbody, Fat_Torso, Fingernails_Long, Hands_Fist, Hands_Fist_L, Hands_Fist_R, Hands_Peace_R, Hands_Point, Hands_Point_L, Hands_Point_R, Hands_Relaxed, Hands_Relaxed_L, Hands_Relaxed_R, Hands_Salute_R, Hands_Spread_R, Hands_Typing, Love_Handles, Male_Torso, Muscular_Torso, No_Chest, Scrawny_Torso, Scrawny_Torso_Male, Shirtsleeve_flair, Small_Chest, default_upperbodyParallel&lt;br /&gt;
&lt;br /&gt;
and standart &#039;&#039;&#039;morphName&#039;&#039;&#039; for &#039;&#039;&#039;avatar_lower_body.llm&#039;&#039;&#039; is:&lt;br /&gt;
&lt;br /&gt;
Big_Belly_Legs, Big_Butt_Legs, Bowed_Legs, Displace_Loose_Lowerbody, Fat_Legs, Foot_Size, Leg_Longcuffs, Leg_Pantflair, Low_Crotch, Male_Legs, Male_Package, Muscular_Legs, Saddlebags, Scrawny_Legs, Shoe_Heel_Height, Shoe_Heel_Point, Shoe_Heel_Thick, Shoe_Platform_Height, Shoe_Platform_Width, Shoe_Toe_Point, Shoe_Toe_Square, Shoe_Toe_Thick, Small_Butt, default_lowerbodyParallel&lt;br /&gt;
&lt;br /&gt;
====Level Of Detail (LOD) mesh====&lt;br /&gt;
&lt;br /&gt;
:char[24] &amp;quot;Linden Binary Mesh 1.0&amp;quot;&lt;br /&gt;
:U8 hasWeights&lt;br /&gt;
:U8 hasDetailTexCoords&lt;br /&gt;
:LLVector3 position&lt;br /&gt;
:LLVector3 rotationAngles&lt;br /&gt;
:U8 rotationOrder (ignored, set to 0)&lt;br /&gt;
:LLVector3 scale&lt;br /&gt;
:U16 numFaces&lt;br /&gt;
:struct faces[ numFaces ]&lt;br /&gt;
:{&lt;br /&gt;
::S16[3] face&lt;br /&gt;
:}&lt;br /&gt;
&lt;br /&gt;
where LLVector2 and LLVector3 are 2 and 3 floats respectively, and all numbers are little endian.  Integers are 8, 16, or 32 bits signed (S) or unsigned (U).&lt;br /&gt;
&lt;br /&gt;
The LOD .llm files actually contain fields for (if hasWeights) numSkinJoints set to zero, char[64] &amp;quot;End Morphs&amp;quot;, and numRemaps set to zero, but these are not read by the viewer.&lt;br /&gt;
&lt;br /&gt;
Each weight actually contains two pieces of information.  The number to the left of the decimal point is the index of the joint and also implicitly indexes to the following joint.  The actual weight is to the right of the decimal point and interpolates between these two joints.  The index is into an &amp;quot;expanded&amp;quot; list of joints, not just a linear array of the joints as defined in the skeleton file.  In particular, any joint that has more than one child will be repeated in the list for each of its children.&lt;br /&gt;
&lt;br /&gt;
===Loading the file===&lt;br /&gt;
&lt;br /&gt;
This data is used to create instances of LLVOAvatar in LLVOAvatar::loadAvatar()&lt;br /&gt;
through LLVOAvatar::loadMeshNodes, LLPolyMesh::getMesh, LLPolyMeshSharedData::loadMesh, and LLPolyMorphData::loadBinary.  These are found in indra\newview\llvoavatar.h(.cpp), indra\newview\llpolymesh.h(.cpp), and indra\newview\llpolymorph.h(.cpp), and indra\llappearance\llpolymorph.h(cpp).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Linden wearable definition file ==&lt;br /&gt;
&lt;br /&gt;
The format is used for client/server communication - wearable assets are downloaded to cache/uploaded on creation. No import/export ability currently exists, although wearables are manipulated as files both on the viewer and server.&lt;br /&gt;
&lt;br /&gt;
=== Source References ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;newview/llwearable.h&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;enum EWearableType&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;newview/llwearable.cpp&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;LLWearable::importFile&amp;lt;/code&amp;gt; – parses assets when &amp;quot;worn&amp;quot; from inventory, after download to cache&lt;br /&gt;
** &amp;lt;code&amp;gt;LLWearable::exportFile&amp;lt;/code&amp;gt; – called by &amp;lt;code&amp;gt;LLWearable::saveNewAsset&amp;lt;/code&amp;gt; when created, does upload to asset system&lt;br /&gt;
* &amp;lt;code&amp;gt;newview/llvoavatardefines.h&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;enum ETextureIndex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
* The file is line-oriented. UNIX line endings (LF 0x0A) are expected.&lt;br /&gt;
* File encoding for strings is implicitly UTF-8. No byte-order mark is allowed.&lt;br /&gt;
* Whitespace is used as delimiters. Spaces (0x20) and tabs (0x09) are considered whitespace, and any number may be used.&lt;br /&gt;
&lt;br /&gt;
The file consists of the following blocks, which must occur in the specified order:&lt;br /&gt;
&lt;br /&gt;
* Format/Version&lt;br /&gt;
* Name&lt;br /&gt;
* Description&lt;br /&gt;
* Permissions&lt;br /&gt;
* Sale Info&lt;br /&gt;
* Wearable type&lt;br /&gt;
* Parameters&lt;br /&gt;
* Textures&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format/Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The string &amp;lt;code&amp;gt;LLWearable version&amp;lt;/code&amp;gt; followed by the version number (currently &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 LLWearable version 22&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A single line string, terminated with a UNIX newline (LF 0x0A). Maximum length is 2047 bytes, not counting the newline. Encoding is UTF-8. A blank line is used to indicate the absence of a name.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 Space Cadet Shirt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A single line string, terminated with a UNIX newline (LF 0x0A). Maximum length is 2047 bytes, not counting the newline. Encoding is UTF-8. A blank line is used to indicate the absence of a description.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 This is my awesome shirt!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Permissions block&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* First line: The token &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; followed by the permission block version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Second line: open brace &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
* A sequence of permission name/value pairs, each on its own line&lt;br /&gt;
* Final line: close brace &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The permission name/value pairs are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;base_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;owner_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;group_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;everyone_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;next_owner_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;creator_id&amp;lt;/code&amp;gt;, with agent UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;owner_id&amp;lt;/code&amp;gt;, with agent UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;last_owner_id&amp;lt;/code&amp;gt;, with agent UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;group_id&amp;lt;/code&amp;gt;, with group UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;group_owned&amp;lt;/code&amp;gt;, with &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (false) or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (true) flag&lt;br /&gt;
&lt;br /&gt;
If a name/value is missing, a default value is assumed. For maximum compatibility, everything should be explicitly specified except &amp;lt;code&amp;gt;group_owned&amp;lt;/code&amp;gt; when false.&lt;br /&gt;
&lt;br /&gt;
Flags are defined in &amp;lt;code&amp;gt;llinventory/llpermissionsflags.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_TRANSFER&amp;lt;/code&amp;gt; = 0x00002000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_MODIFY&amp;lt;/code&amp;gt; = 0x00004000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_COPY&amp;lt;/code&amp;gt; = 0x00008000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_MOVE&amp;lt;/code&amp;gt; = 0x00080000&lt;br /&gt;
&lt;br /&gt;
Common masks are:&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_NONE&amp;lt;/code&amp;gt; 0x00000000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_ALL&amp;lt;/code&amp;gt; 0x7FFFFFFF&lt;br /&gt;
&lt;br /&gt;
And common values are:&lt;br /&gt;
* no modify: &amp;lt;code&amp;gt;PERM_ALL &amp;amp; ~PERM_MODIFY&amp;lt;/code&amp;gt;                  = 0x7fffbfff&lt;br /&gt;
* no copy:    &amp;lt;code&amp;gt;PERM_ALL &amp;amp; ~PERM_COPY&amp;lt;/code&amp;gt;                    = 0x7fff7fff&lt;br /&gt;
* no modify or copy:                                  = 0x7fff3fff&lt;br /&gt;
* no transfer:  &amp;lt;code&amp;gt;PERM_ALL &amp;amp; ~PERM_TRANSFER&amp;lt;/code&amp;gt;              = 0x7fffdfff&lt;br /&gt;
* no modify, no transfer                              = 0x7fff9fff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
        permissions 0&lt;br /&gt;
        {&lt;br /&gt;
                base_mask       7fffffff&lt;br /&gt;
                owner_mask      7fffffff&lt;br /&gt;
                group_mask      00000000&lt;br /&gt;
                everyone_mask   7fffbfff&lt;br /&gt;
                next_owner_mask 7fffffff&lt;br /&gt;
                creator_id      d929385f-41e3-4a34-a04e-f1fc39f24f12&lt;br /&gt;
                owner_id        ff9a71eb-7414-4bf8-866e-a70ddeb7c3cf&lt;br /&gt;
                last_owner_id   ff9a71eb-7414-4bf8-866e-a70ddeb7c3cf&lt;br /&gt;
                group_id        00000000-0000-0000-0000-000000000000&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sale Info block&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* First line: The token &amp;lt;code&amp;gt;sale_info&amp;lt;/code&amp;gt; followed by the sale_info block version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Second line: open brace &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
* A sequence of sale info name/value pairs, each on its own line&lt;br /&gt;
* Final line: close brace &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The sale info name/value pairs are:&lt;br /&gt;
* &amp;lt;code&amp;gt;sale_type&amp;lt;/code&amp;gt;: one of:&lt;br /&gt;
** &amp;lt;code&amp;gt;not&amp;lt;/code&amp;gt; - not for sale&lt;br /&gt;
** &amp;lt;code&amp;gt;orig&amp;lt;/code&amp;gt; - the original is purchased&lt;br /&gt;
** &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; - a copy is purchased&lt;br /&gt;
** &amp;lt;code&amp;gt;cntn&amp;lt;/code&amp;gt; - the content is purchased&lt;br /&gt;
* &amp;lt;code&amp;gt;sale_price&amp;lt;/code&amp;gt; - price in L$&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
        sale_info       0&lt;br /&gt;
        {&lt;br /&gt;
                sale_type       not&lt;br /&gt;
                sale_price      10&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wearable Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* A single line with the token &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; followed by the wearable type as a decimal integer&lt;br /&gt;
&lt;br /&gt;
The type is defined in the &amp;lt;code&amp;gt;EWearableType&amp;lt;/code&amp;gt; enumeration in &amp;lt;code&amp;gt;newview/llwearable.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Bodyparts&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SHAPE&amp;lt;/code&amp;gt; = 0&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SKIN&amp;lt;/code&amp;gt; = 1&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_HAIR&amp;lt;/code&amp;gt; = 2&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_EYES&amp;lt;/code&amp;gt; = 3&lt;br /&gt;
* Clothing&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SHIRT&amp;lt;/code&amp;gt; = 4&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_PANTS&amp;lt;/code&amp;gt; = 5&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SHOES&amp;lt;/code&amp;gt; = 6&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SOCKS&amp;lt;/code&amp;gt; = 7&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_JACKET&amp;lt;/code&amp;gt;   = 8&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_GLOVES&amp;lt;/code&amp;gt;   = 9&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_UNDERSHIRT&amp;lt;/code&amp;gt; = 10&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_UNDERPANTS&amp;lt;/code&amp;gt; = 11&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SKIRT&amp;lt;/code&amp;gt; = 12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 type 4&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parameters&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* A line with the token &amp;lt;code&amp;gt;parameters&amp;lt;/code&amp;gt; followed by the number of parameter ID/value pairs as a decimal integer&lt;br /&gt;
* A sequence of parameter/ID value pairs, each on its own line&lt;br /&gt;
** Parameter ID from the [[#Linden avatar definition file]], a decimal integer&lt;br /&gt;
** Parameter value (or weight) is a decimal floating point value&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 parameters 10&lt;br /&gt;
 781 1&lt;br /&gt;
 800 .92&lt;br /&gt;
 801 1&lt;br /&gt;
 802 1&lt;br /&gt;
 803 1&lt;br /&gt;
 804 1&lt;br /&gt;
 805 1&lt;br /&gt;
 828 .18&lt;br /&gt;
 840 0&lt;br /&gt;
 868 .27&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Texture&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* A line with the token &amp;lt;code&amp;gt;textures&amp;lt;/code&amp;gt; followed by the number of texture index/ID pairs as a decimal integer&lt;br /&gt;
* A sequence of texture index/ID pairs, each on its own line&lt;br /&gt;
** Texture index is defined in the &amp;lt;code&amp;gt;ETextureIndex&amp;lt;/code&amp;gt; enumeration in &amp;lt;code&amp;gt;newview/llvoavatardefines.h&amp;lt;/code&amp;gt;&lt;br /&gt;
** Texture ID is the texture&#039;s UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
&lt;br /&gt;
Texture indexes:&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HEAD_BODYPAINT&amp;lt;/code&amp;gt;   =  0&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_SHIRT&amp;lt;/code&amp;gt;      =  1&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_PANTS&amp;lt;/code&amp;gt;      =  2&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_EYES_IRIS&amp;lt;/code&amp;gt;        =  3&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HAIR&amp;lt;/code&amp;gt;             =  4&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_BODYPAINT&amp;lt;/code&amp;gt;  =  5&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_BODYPAINT&amp;lt;/code&amp;gt;  =  6&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_SHOES&amp;lt;/code&amp;gt;      =  7&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HEAD_BAKED&amp;lt;/code&amp;gt;       =  8  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_BAKED&amp;lt;/code&amp;gt;      =  9  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_BAKED&amp;lt;/code&amp;gt;      = 10  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_EYES_BAKED&amp;lt;/code&amp;gt;       = 11  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_SOCKS&amp;lt;/code&amp;gt;      = 12&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_JACKET&amp;lt;/code&amp;gt;     = 13&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_JACKET&amp;lt;/code&amp;gt;     = 14&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_GLOVES&amp;lt;/code&amp;gt;     = 15&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_UNDERSHIRT&amp;lt;/code&amp;gt; = 16&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_UNDERPANTS&amp;lt;/code&amp;gt; = 17&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_SKIRT&amp;lt;/code&amp;gt;            = 18&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_SKIRT_BAKED&amp;lt;/code&amp;gt;      = 19  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HAIR_BAKED&amp;lt;/code&amp;gt;       = 20  (* See below)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* When the avatar changes a wearable, the simulator requests that the viewer rebake the *_BAKED textures; these are then uploaded as new temporary assets to the system so that the individual assets do not need to be downloaded. The *_BAKED textures are not referenced by wearables.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 textures 1&lt;br /&gt;
 1 08115557-ad4d-09ed-6b39-2ffc1f2b58b2&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Avatar_Appearance&amp;diff=1192236</id>
		<title>Avatar Appearance</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Avatar_Appearance&amp;diff=1192236"/>
		<updated>2014-07-18T07:23:55Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: indra\llappearance\llpolymorph.cpp  ==Linden binary mesh file==&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{KBcaution|&#039;&#039;&#039;[http://bit.ly/aczoWU See this if you&#039;re looking for general Appearance Editor help for Viewer 2.1.]&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
{{ProtocolNav}}&lt;br /&gt;
[[Category:Viewer Architecture]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
For a good introduction to the elements of 3D character graphics, including meshes, morphs, bones, rendering, quaternions, and more see [http://www.gup.uni-linz.ac.at/~gk/Diplom/CART-Martin.pdf Martin Garstenauer&#039;s thesis].&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Appearance Components ==&lt;br /&gt;
SL Avatar has &amp;quot;wearables&amp;quot; plus &amp;quot;attachments&amp;quot; for static appearance, and &amp;quot;animations&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Wearables === &lt;br /&gt;
Wearables encompass both clothing and body parts – represent customizations of the basic avatar mesh via parameterized changes and textures.&lt;br /&gt;
&lt;br /&gt;
Clothing can be taken off, but body parts cannot. Otherwise, they are similar.&lt;br /&gt;
&lt;br /&gt;
Wearables are created by the viewer when appearance is edited and the results are saved; changed parts of appearance (clothing, bodyparts) are saved as new wearables which are uploaded as assets. There is no support for directly importing or exporting wearables.&lt;br /&gt;
&lt;br /&gt;
=== Attachments ===&lt;br /&gt;
An &amp;quot;attachment&amp;quot; is an object (&amp;quot;linked set of primitives&amp;quot;) which is rooted in the scene graph on an attachment point on an avatar.  They are otherwise the same as other objects in SL, and can contain and execute scripts, inventory, maintain state, etc.&lt;br /&gt;
&lt;br /&gt;
Attachments are heavily used for hair, some parts of clothing (dresses, cuffs) and accessories (jewelery, weapons). Non-humanoid avatars may use attachments to completely obscure the underlying humanoid avatar mesh.&lt;br /&gt;
&lt;br /&gt;
Attachments are never serialized as files on the viewer, and there is no import/export support. Attachments are only transmitted to/from the viewer as ObjectUpdate messages which describe the constantly updating scene graph of the simulation.  Attachments are created/modified using the &amp;quot;build&amp;quot; tools in the viewer; modifications are transmitted from the viewer to the simulator as editing messages. The simulator then broadcasts the changes to other users as ObjectUpdates. When an attachment is saved to inventory, the linked set of prims structure is serialized to a structure that includes script state.&lt;br /&gt;
&lt;br /&gt;
=== Animations ===&lt;br /&gt;
Animations are BVH files (&#039;&#039;&#039;B&#039;&#039;&#039;io&#039;&#039;&#039;V&#039;&#039;&#039;ision &#039;&#039;&#039;H&#039;&#039;&#039;eirarchical data), a format developed by Biovision, a motion capture services company. Animations can be added to a scripted object to be played (e.g. a &amp;quot;poseball&amp;quot;), or incorporated into a gesture (a sequence of actions including text, sounds and animations invoked manually or triggered by a keyword). However, animations are often thought of as parts of avatars when they are controlled by an attachment to alter the avatar&#039;s default animations. &lt;br /&gt;
&lt;br /&gt;
One common case is as an &amp;quot;Animation Override&amp;quot; script. These are used along with creative animations to deform the skeleton. Sometimes these override only some of the default animations (e.g. directed attention), sometimes everything is overridden. For example, &amp;quot;tinies&amp;quot; are created by folding the skeleton&#039;s limbs back on themselves. Non-humanoid avatars often use &amp;quot;meatballs&amp;quot; animations that compress the avatar to such an extent that it can be hidden inside an attachment.  See [[Avatar deformation]] for more information.&lt;br /&gt;
&lt;br /&gt;
Animations can be created in third party tools (e.g. Poser, QAvimator) and uploaded via File &amp;gt; Upload Animation (L$10). The animation is added to the inventory, and can then be incorporated into a script or gesture.&lt;br /&gt;
&lt;br /&gt;
==Packets==&lt;br /&gt;
&lt;br /&gt;
* [[AgentWearablesRequest]]&lt;br /&gt;
** This is where it starts. The viewer asks the simulator what it is wearing, and an AgentWearablesUpdate packet is returned.&lt;br /&gt;
* [[AgentWearablesUpdate]]&lt;br /&gt;
** A mapping of wearable types to asset IDs and item IDs is returned to the client. There are currently 13 different wearable types and all 13 will always be returned in this packet. If your avatar is not wearing a wearable type the asset ID and item ID for that type will be null IDs (all zeros). The next step is to request an asset transfer for all of the non-null asset IDs and download the wearable assets.&lt;br /&gt;
* [[AgentIsNowWearing]]&lt;br /&gt;
** Like the AgentWearablesUpdate packet but in the other direction. The viewer sends a list of the 13 wearable types and their associated item IDs, or null if nothing is being worn in that wearable slot. This is typically sent right before AgentSetAppearance.&lt;br /&gt;
* [[AgentSetAppearance]]&lt;br /&gt;
** Serves two purposes, to tell the server how our avatar mesh is deformed (with visual parameters) and what textures we are wearing. There are currently 218 VisualParam blocks sent with each AgentSetAppearance describing everything from the color of the avatar eyes to the gender slider. A TextureEntry is also sent that uses the same TextureEntry format objects use, but each &amp;quot;face&amp;quot; is hard-coded to describe a particular texture. This may or may not include baked textures for the five different baked layers (head, upper, lower, eyes, and skirt).&lt;br /&gt;
**The ParamValue fields do not have parameter IDs associated with them in the packet, as it&#039;s assumed all viewers have the same parameter map in the same sequence. The parameters are stored internally as a floating point integer, and are converted to a single byte by inputting the value along with minimum and maximum weights for that parameter to a conversion function.&lt;br /&gt;
&lt;br /&gt;
* [[AvatarAppearance]]&lt;br /&gt;
* [[AgentCachedTexture]]&lt;br /&gt;
* [[AgentCachedTextureResponse]]&lt;br /&gt;
&lt;br /&gt;
==Linden avatar definition file==&lt;br /&gt;
&lt;br /&gt;
The parameters affecting avatar appearance are defined in an XML file&lt;br /&gt;
located in the executable at&lt;br /&gt;
: SecondLife\character\avatar_lad.xml&lt;br /&gt;
and in the source code at&lt;br /&gt;
: linden\indra\newview\character\avatar_lad.xml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With a few exceptions&lt;br /&gt;
: genepool.xml&lt;br /&gt;
: rouge_alpha.tga&lt;br /&gt;
: underpants_trial_female.tga&lt;br /&gt;
: underpants_trial_male.tga&lt;br /&gt;
: undershirt_trial_female.tga&lt;br /&gt;
: upperbodyfreckles_alpha.tga&lt;br /&gt;
all of the other files in the same directory are referenced by avatar_lad.xml.  These include the mesh files (.llm), the texture files (.tga) and the avatar_skeleton.xml file (see below).&lt;br /&gt;
&lt;br /&gt;
genepool.xml contains parameter sets for wearable types WT_SHAPE, WT_SKIN, WT_HAIR, and WT_EYES for several archetypal avatar definitions.  This file supported the Randomize feature in the appearance editor. The functionality was removed in viewer 1.23, but a vestigial copy of genepool.xml may still be present. You can see the current parameter set for your own avatar by invoking the debug menus (Ctrl-Alt-D) and selecting&lt;br /&gt;
Client-&amp;gt;Character-&amp;gt;Character Tests-&amp;gt;Appearance To XML.  This will create a file&lt;br /&gt;
: SecondLife\character\new archetype.xml&lt;br /&gt;
in the same format as genepool.xml.&lt;br /&gt;
&lt;br /&gt;
The avatar definition file affects the appearances on your viewer only.  Any change to the file will not affect how others see the avatars.  You can set value_default=&amp;quot;1&amp;quot; for &amp;quot;Express_Tongue_Out&amp;quot; to make the avatars on your viewer give you the raspberries, but no one else will notice.&lt;br /&gt;
&lt;br /&gt;
The interesting thing is that this file defines parameters that can be used in animations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File structure===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;linden_avatar version=&amp;quot;1.0&amp;quot; wearable_definition_version=&amp;quot;22&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;skeleton file_name=&amp;quot;avatar_skeleton.xml&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;attachment_point&#039;&#039; id=&amp;quot;1&amp;quot; group=&amp;quot;6&amp;quot; name=&amp;quot;Chest&amp;quot; joint=&amp;quot;mChest&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
::       position=&amp;quot;0.15 0 -0.1&amp;quot; rotation=&amp;quot;0 90 90&amp;quot; visible_in_first_person=&amp;quot;true&amp;quot;&lt;br /&gt;
::       pie_slice=&amp;quot;2&amp;quot; hud=&amp;quot;true&amp;quot; max_attachment_offset=&amp;quot;1.5&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&#039;&#039;&amp;lt;bone&#039;&#039; name=&amp;quot;mNeck&amp;quot; scale=&amp;quot;0 0 .2&amp;quot;&#039;&#039;&#039; offset=&amp;quot;0 0 .004&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;/skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Sets of&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;mesh type=&amp;quot;hairMesh&amp;quot; lod=&amp;quot;0&amp;quot; file_name=&amp;quot;avatar_hair.llm&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:      min_pixel_width=&amp;quot;320&amp;quot; min_pixel_area=&amp;quot;0.1&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_morph /&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::or&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_morph&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::             &#039;&#039;&#039;&#039;&#039;&amp;lt;volume_morph&#039;&#039;&#039;&#039;&#039; name=&amp;quot;HEAD&amp;quot; scale=&amp;quot;-0.008 -0.006 0.015&amp;quot;&lt;br /&gt;
::::             pos=&amp;quot;0.07 0 -0.07&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_morph&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;/mesh&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&amp;lt;mesh&#039;&#039; &#039;&#039;&#039;type=&amp;quot;hairMesh&amp;quot; lod=&amp;quot;1&amp;quot; file_name=&amp;quot;avatar_hair_1.llm&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:    min_pixel_width=&amp;quot;160&amp;quot; min_pixel_area=&amp;quot;0.1&amp;quot; &#039;&#039;&#039;reference=&amp;quot;avatar_hair.llm&amp;quot;&#039;&#039;&#039;&#039;&#039;&amp;gt;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&amp;lt;/mesh&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:    &#039;&#039;&#039;&#039;&#039;&amp;lt;global_color&#039;&#039; name=&amp;quot;skin_color&amp;quot;&#039;&#039;&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
::      &#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_color&#039;&#039;&#039; operation=&amp;quot;blend&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::             &#039;&#039;&#039;&#039;&#039;&amp;lt;value&#039;&#039; color=&amp;quot;252, 215, 200, 255&amp;quot; &#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_color&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::      &#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:    &#039;&#039;&#039;&#039;&#039;&amp;lt;/global_color&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:    &#039;&#039;&#039;&#039;&#039;&amp;lt;layer_set&#039;&#039; body_region=&amp;quot;head&amp;quot; width=&amp;quot;512&amp;quot; height=&amp;quot;512&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
:    clear_alpha=&amp;quot;false&amp;quot; alpha_tga_file=&amp;quot;head_alpha.tga&amp;quot; &#039;&#039;&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;layer&#039;&#039; name=&amp;quot;head bump definition&amp;quot;&#039;&#039;&#039; render_pass=&amp;quot;bump&amp;quot;&lt;br /&gt;
::       global_color=&amp;quot;hair_color&amp;quot; fixed_color=&amp;quot;128,128,128,255&amp;quot;&lt;br /&gt;
::       write_all_channels=&amp;quot;true&amp;quot; &#039;&#039;&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:::        &amp;lt;texture &#039;&#039;&#039;local_texture=&amp;quot;lower_jacket&amp;quot;&#039;&#039;&#039; local_texture_alpha_only=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
:::and if not fixed_color&lt;br /&gt;
:::        &amp;lt;texture &#039;&#039;&#039;tga_file=&amp;quot;bump_head_base.tga&amp;quot;&#039;&#039;&#039; file_is_mask=&amp;quot;FALSE&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::        &#039;&#039;&amp;lt;morph_mask&#039;&#039; morph_name=&amp;quot;Displace_Loose_Upperbody&amp;quot; invert=&amp;quot;FALSE&amp;quot; &#039;&#039;/&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:::        &#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&amp;lt;param_alpha&#039;&#039;&#039; tga_file=&amp;quot;bump_face_wrinkles.tga&amp;quot; skip_if_zero=&amp;quot;true&amp;quot;&lt;br /&gt;
::::             multiply_blend=&amp;quot;false&amp;quot; domain=&amp;quot;0&amp;quot; &#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::or&lt;br /&gt;
::::            &#039;&#039;&#039;&amp;lt;param_color&#039;&#039;&#039; operation=&amp;quot;multiply&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::::               &#039;&#039;&#039;&#039;&#039;&amp;lt;value&#039;&#039; color=&amp;quot;0, 0, 0, 0&amp;quot; &#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&amp;lt;/param_color&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&lt;br /&gt;
::      &#039;&#039;&#039;&#039;&#039;&amp;lt;/layer&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&#039;&#039;&amp;lt;/layer_set&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;driver_parameters&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;param ... &amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;param_driver&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::::            &#039;&#039;&#039;&#039;&#039;&amp;lt;driven&#039;&#039; id=&amp;quot;628&amp;quot;&#039;&#039;&#039; min1=&amp;quot;0.1&amp;quot; max1=&amp;quot;0.5&amp;quot; max2=&amp;quot;1&amp;quot; min2=&amp;quot;1&amp;quot; &#039;&#039;&#039;&#039;&#039;/&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:::         &#039;&#039;&#039;&amp;lt;/param_driver&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;&#039;&#039;&amp;lt;/param&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;/driver_parameters&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/linden_avatar&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;&#039;bold&#039;&#039;&#039; text indicates required tags or parameters, standard text&lt;br /&gt;
indicates a tag that can occur zero or one time, &#039;&#039;italics&#039;&#039;&lt;br /&gt;
indicates that the tag can be repeated zero or more times, and &#039;&#039;&#039;&#039;&#039;bold italics&#039;&#039;&#039;&#039;&#039; indicates&lt;br /&gt;
that at least one is required but more are possible.&lt;br /&gt;
&lt;br /&gt;
Note that the values shown for parameters here may not be consistent.  They are shown only&lt;br /&gt;
to indicate the value type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Parameter detail===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;param ... &amp;gt; is&lt;br /&gt;
&lt;br /&gt;
:      &#039;&#039;&#039;&amp;lt;param id=&amp;quot;32&amp;quot;&#039;&#039;&#039; group=&amp;quot;1&amp;quot; name=&amp;quot;Male_Skeleton&amp;quot;&lt;br /&gt;
:       value_min=&amp;quot;0&amp;quot; value_max=&amp;quot;1&amp;quot; value_default=&amp;quot;0&amp;quot;&lt;br /&gt;
:       edit_group=&amp;quot;shape_body&amp;quot; edit_group_order=&amp;quot;1&amp;quot;&lt;br /&gt;
:       label=&amp;quot;Skeleton&amp;quot; label_min=&amp;quot;Female&amp;quot; label_max=&amp;quot;Male&amp;quot;&lt;br /&gt;
:       wearable=&amp;quot;shape&amp;quot; clothing_morph=&amp;quot;true&amp;quot; sex=&amp;quot;male&amp;quot; shared=&amp;quot;1&amp;quot;&lt;br /&gt;
:       show_simple=&amp;quot;true&amp;quot; simple_percent_min=&amp;quot;40&amp;quot; simple_percent_max=&amp;quot;100&amp;quot;&lt;br /&gt;
:       camera_distance=&amp;quot;2.2&amp;quot; camera_elevation=&amp;quot;.1&amp;quot; camera_angle=&amp;quot;0&amp;quot; &#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parameters are parsed in LLViewerVisualParamInfo::parseXml and LLVisualParamInfo::parseXml and are used by LLViewerVisualParam and LLVisualParam respectively when LLVOAvatar::loadAvatar is called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fields parsed in LLVisualParamInfo are used to describe the meaning of the parameters.&lt;br /&gt;
&lt;br /&gt;
;id -- mID&lt;br /&gt;
;name -- mName&lt;br /&gt;
:default &amp;quot;&amp;quot;&lt;br /&gt;
;group -- mGroup&lt;br /&gt;
:&amp;quot;0&amp;quot; is VISUAL_PARAM_GROUP_TWEAKABLE&lt;br /&gt;
:&amp;quot;1&amp;quot; is VISUAL_PARAM_GROUP_ANIMATABLE&lt;br /&gt;
:default &amp;quot;0&amp;quot;&lt;br /&gt;
;value_min -- mMinWeight&lt;br /&gt;
:default 0.&lt;br /&gt;
;value_max -- mMaxWeight&lt;br /&gt;
:default 1.&lt;br /&gt;
;value_default -- mDefaultWeight&lt;br /&gt;
:default 0.&lt;br /&gt;
;sex -- mSex&lt;br /&gt;
{|&lt;br /&gt;
| || || &amp;quot;both&amp;quot; || SEX_BOTH&lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;male&amp;quot; || SEX_MALE&lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;female&amp;quot; || SEX_FEMALE&lt;br /&gt;
|-&lt;br /&gt;
| || || default || SEX_BOTH&lt;br /&gt;
|}&lt;br /&gt;
;label -- mDisplayName&lt;br /&gt;
:default is name&lt;br /&gt;
;label_min -- mMinName&lt;br /&gt;
:default is &amp;quot;Less&amp;quot;&lt;br /&gt;
;label_max -- mMaxName&lt;br /&gt;
:default is &amp;quot;More&amp;quot;&lt;br /&gt;
;shared&lt;br /&gt;
:Used only by mesh params.  Indicates that the param affects more than one mesh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fields parsed in LLViewerVisualParamInfo describe the appearance of the entries on the Edit-&amp;gt;Appearance editing panel.&lt;br /&gt;
&lt;br /&gt;
;wearable -- mWearableType&lt;br /&gt;
{|&lt;br /&gt;
| || || &amp;quot;shape&amp;quot; ||       WT_SHAPE      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;skin&amp;quot;  ||       WT_SKIN       &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;hair&amp;quot;  ||       WT_HAIR       &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;eyes&amp;quot;  ||       WT_EYES       &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;shirt&amp;quot; ||       WT_SHIRT      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;pants&amp;quot; ||       WT_PANTS      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;shoes&amp;quot; ||       WT_SHOES      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;socks&amp;quot; ||       WT_SOCKS      &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;jacket&amp;quot;     ||  WT_JACKET     &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;gloves&amp;quot;     ||  WT_GLOVES     &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;undershirt&amp;quot; ||  WT_UNDERSHIRT &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;underpants&amp;quot; ||  WT_UNDERPANTS &lt;br /&gt;
|-&lt;br /&gt;
| || || &amp;quot;skirt&amp;quot;      ||  WT_SKIRT      &lt;br /&gt;
|-&lt;br /&gt;
| || || default      ||  WT_INVALID&lt;br /&gt;
|}&lt;br /&gt;
;edit_group -- mEditGroup&lt;br /&gt;
:default &amp;quot;&amp;quot;&lt;br /&gt;
;edit_group_order  -- mEditGroupDisplayOrder &lt;br /&gt;
:By default, value 0, parameters are displayed in the order in which they appear in the xml file.  &amp;quot;edit_group_order&amp;quot; overriddes this.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Optional camera offsets from the current joint center.  Used for generating &amp;quot;hints&amp;quot; (thumbnails).&lt;br /&gt;
;camera_distance -- mCamDist&lt;br /&gt;
:default 0.5&lt;br /&gt;
;camera_angle -- mCamAngle&lt;br /&gt;
:default 0.&lt;br /&gt;
;camera_elevation -- mCamElevation&lt;br /&gt;
:default 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;show_simple -- mShowSimple : value is ignored&lt;br /&gt;
:default FALSE&lt;br /&gt;
;simple_percent_min -- mSimpleMin : value is ignored&lt;br /&gt;
:default 0.&lt;br /&gt;
;simple_percent_max -- mSimpleMax : value is ignored&lt;br /&gt;
:default 100.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Loading the file===&lt;br /&gt;
&lt;br /&gt;
The file is parsed in LLVOAvatar::initClass() primarily by calls to LLVOAvatarInfo.  Both classes are defined in indra\newview\llvoavatar.h(.cpp).&lt;br /&gt;
There is one method for each of the major XML nodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlSkeletonNode&lt;br /&gt;
:LLVOAvatarInfo::parseXmlMeshNodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlColorNodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlLayerNodes&lt;br /&gt;
:LLVOAvatarInfo::parseXmlDriverNodes&lt;br /&gt;
&lt;br /&gt;
This data is then used to create instances of LLVOAvatar in LLVOAvatar::loadAvatar()&lt;br /&gt;
which invokes LLVOAvatar::loadSkeletonNode() and LLVOAvatar::loadMeshNodes().&lt;br /&gt;
&lt;br /&gt;
==LLVisualParam==&lt;br /&gt;
&lt;br /&gt;
The avatar visual parameters are divided into those that define the avatar&#039;s appearance and those that are used in animations.  Theoretically, they all could be used for animations, but the animations would have to start and end at the settings defined for the avatar rather than at the default values.&lt;br /&gt;
&lt;br /&gt;
The group field of the &amp;lt;param&amp;gt; tag identifies those that are directly set in Edit-&amp;gt;Appearance and sent in [[AgentSetAppearance]] messages as VISUAL_PARAM_GROUP_TWEAKABLE.  The rest are identified as VISUAL_PARAM_GROUP_ANIMATABLE, but this is a bit misleading because it includes all of the driven parameters defined in the &amp;lt;driver_parameters&amp;gt; stanza.  These are set by the driver parameters which are themselves directly tweakable.&lt;br /&gt;
&lt;br /&gt;
Those that are not directly or indirectly tweakable include the emotes&lt;br /&gt;
:* 300  Express_Closed_Mouth&lt;br /&gt;
:* 301  Express_Tongue_Out&lt;br /&gt;
:* 302  Express_Surprise_Emote&lt;br /&gt;
:* 303  Express_Wink_Emote&lt;br /&gt;
:* 304  Express_Embarrassed_Emote&lt;br /&gt;
:* 305  Express_Shrug_Emote&lt;br /&gt;
:* 306  Express_Kiss&lt;br /&gt;
:* 307  Express_Bored_Emote&lt;br /&gt;
:* 308  Express_Repulsed_Emote&lt;br /&gt;
:* 309  Express_Disdain&lt;br /&gt;
:* 310  Express_Afraid_Emote&lt;br /&gt;
:* 311  Express_Worry_Emote&lt;br /&gt;
:* 312  Express_Cry_Emote&lt;br /&gt;
:* 313  Express_Sad_Emote&lt;br /&gt;
:* 314  Express_Anger_Emote&lt;br /&gt;
:* 315  Express_Frown&lt;br /&gt;
:* 316  Express_Laugh_Emote&lt;br /&gt;
:* 317  Express_Toothsmile&lt;br /&gt;
:* 318  Express_Smile&lt;br /&gt;
:* 632  Express_Open_Mouth&lt;br /&gt;
the hand morphs&lt;br /&gt;
:* 101   Hands_Relaxed&lt;br /&gt;
:* 102   Hands_Point&lt;br /&gt;
:* 103   Hands_Fist&lt;br /&gt;
:* 666   Hands_Relaxed_L&lt;br /&gt;
:* 667   Hands_Point_L&lt;br /&gt;
:* 668   Hands_Fist_L&lt;br /&gt;
:* 669   Hands_Relaxed_R&lt;br /&gt;
:* 670   Hands_Point_R&lt;br /&gt;
:* 671   Hands_Fist_R&lt;br /&gt;
:* 672   Hands_Typing&lt;br /&gt;
:* 766   Hands_Salute_R&lt;br /&gt;
:* 791   Hands_Peace_R&lt;br /&gt;
:* 792   Hands_Spread_R&lt;br /&gt;
and blinking eyes&lt;br /&gt;
:* 58   Blink_Left&lt;br /&gt;
:* 59   Blink_Right&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The remaining visual params include a few useful for animations&lt;br /&gt;
:* 51   Furrowed_Eyebrows&lt;br /&gt;
:* 53   Surprised_Eyebrows&lt;br /&gt;
:* 54   Worried_Eyebrows&lt;br /&gt;
:* 55   Frown_Mouth&lt;br /&gt;
:* 57   Smile_Mouth&lt;br /&gt;
and a couple that seem to have been abandoned&lt;br /&gt;
:* 41   Old&lt;br /&gt;
:* 128   Wrinkles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Linden skeleton definition file==&lt;br /&gt;
&lt;br /&gt;
The skeletal structure is defined in an XML file located in the executable at&lt;br /&gt;
: SecondLife\character\avatar_skeleton.xml&lt;br /&gt;
and in the source code at&lt;br /&gt;
: linden\indra\newview\character\avatar_skeleton.xml&lt;br /&gt;
&lt;br /&gt;
It is referenced through the avatar definition file (see above) and can be&lt;br /&gt;
considered to be part of the avatar definition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File structure===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;linden_skeleton version=&amp;quot;1.0&amp;quot; num_bones=&amp;quot;46&amp;quot; num_collision_volumes=&amp;quot;19&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:   &#039;&#039;&#039;&amp;lt;bone name=&amp;quot;mPelvis&amp;quot; pos=&amp;quot;0.000 0.000 1.067&amp;quot; rot=&amp;quot;0.000000 0.000000 0.000000&amp;quot;&lt;br /&gt;
:   &#039;&#039;&#039;scale=&amp;quot;1.000 1.000 1.000&amp;quot; pivot=&amp;quot;0.000000 0.000000 1.067015&amp;quot;&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
::       &amp;lt;collision_volume &#039;&#039;&#039;name=&amp;quot;PELVIS&amp;quot; pos = &amp;quot;-0.01 0 -0.02&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
::       &#039;&#039;&#039;rot=&amp;quot;0.000000 8.00000 0.000000&amp;quot; scale=&amp;quot;0.12 0.16 0.17&amp;quot;&#039;&#039;&#039;/&amp;gt;&lt;br /&gt;
::       &#039;&#039;&amp;lt;bone ...&amp;gt;&#039;&#039;&lt;br /&gt;
::	 &#039;&#039;&amp;lt;/bone&amp;gt;&#039;&#039;&lt;br /&gt;
:    &#039;&#039;&#039;&amp;lt;/bone&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;/linden_skeleton&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
where &#039;&#039;&#039;bold&#039;&#039;&#039; text indicates required tags or parameters, standard text&lt;br /&gt;
indicates a tag that can occur zero or one time, and &#039;&#039;italics&#039;&#039;&lt;br /&gt;
indicates that the tag can be repeated zero or more times.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;bone ...&amp;gt; tag above is to indicate that the structure is recursive.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;46&amp;quot; for num_bones is actually a typo in the file.  There are only 26 bones defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Loading the file===&lt;br /&gt;
&lt;br /&gt;
The file is parsed in LLVOAvatar::initClass() using LLVOAvatarSkeletonInfo::parseXml. Both classes are defined in indra\newview\llvoavatar.h(.cpp).&lt;br /&gt;
&lt;br /&gt;
This data is then used to create instances of LLVOAvatar in LLVOAvatar::loadAvatar()&lt;br /&gt;
which invokes LLVOAvatar::buildSkeleton().  A special-purpose &amp;quot;screen&amp;quot; joint named &amp;quot;mScreen&amp;quot; is also created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Linden binary mesh file==&lt;br /&gt;
&lt;br /&gt;
Meshes are defined in binary files located in the executable at&lt;br /&gt;
: SecondLife\character\*.llm&lt;br /&gt;
and in the source code at&lt;br /&gt;
: linden\indra\newview\character\*.llm&lt;br /&gt;
&lt;br /&gt;
They are referenced through the avatar definition file (see above) and can be&lt;br /&gt;
considered to be part of the avatar definition.&lt;br /&gt;
&lt;br /&gt;
The morphName in the binary mesh file matches the name field of the visual params with &amp;lt;param_morph&amp;gt; tags in the &amp;lt;mesh&amp;gt; stanzas.  There are a few morphs defined in the mesh files that are not used by the avatar definition file&lt;br /&gt;
:* Blink_Both&lt;br /&gt;
:* Fingernails_Long&lt;br /&gt;
:* Wide_Lips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are two types of mesh files:  the base mesh definition and the level of detail (LOD) mesh definition, which always references a base mesh definition file.  LOD meshes are used to simplify the rendering when the avatar is distant from the camera.  There are several LOD meshes with progressively decreasing resolution.&lt;br /&gt;
&lt;br /&gt;
The vertex information referenced by the LOD meshes is stored at the beginning of the base mesh vertex information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===File structure===&lt;br /&gt;
====Base mesh====&lt;br /&gt;
&lt;br /&gt;
:char[24] &amp;quot;Linden Binary Mesh 1.0&amp;quot;&lt;br /&gt;
:U8 hasWeights&lt;br /&gt;
:U8 hasDetailTexCoords&lt;br /&gt;
:LLVector3 position&lt;br /&gt;
:LLVector3 rotationAngles&lt;br /&gt;
:U8 rotationOrder (ignored, set to 0)&lt;br /&gt;
:LLVector3 scale&lt;br /&gt;
:U16 numVertices&lt;br /&gt;
:LLVector3[ numVertices ] baseCoords&lt;br /&gt;
:LLVector3[ numVertices ] baseNormals&lt;br /&gt;
:LLVector3[ numVertices ] baseBinormals&lt;br /&gt;
:LLVector2[ numVertices ] texCoords&lt;br /&gt;
:if (hasDetailTexCoords)&lt;br /&gt;
::LLVector2[ numVertices ] detailTexCoords&lt;br /&gt;
:if (hasWeights)&lt;br /&gt;
::F32[ numVertices ] weights&lt;br /&gt;
:U16 numFaces&lt;br /&gt;
:struct faces[ numFaces ]&lt;br /&gt;
:{&lt;br /&gt;
::S16[3] face&lt;br /&gt;
:}&lt;br /&gt;
:if ( hasWeights )&lt;br /&gt;
:{&lt;br /&gt;
::U16 numSkinJoints&lt;br /&gt;
::struct skinJoints[ numSkinJoints ]&lt;br /&gt;
::{&lt;br /&gt;
:::char[64] jointName&lt;br /&gt;
::}&lt;br /&gt;
:}&lt;br /&gt;
:struct morph []&lt;br /&gt;
:{&lt;br /&gt;
::char[64] morphName&lt;br /&gt;
::S32 numVertices&lt;br /&gt;
::struct vertices[ numVertices ]&lt;br /&gt;
::{&lt;br /&gt;
:::U32 vertexIndex&lt;br /&gt;
:::LLVector3 coord&lt;br /&gt;
:::LLVector3 normal&lt;br /&gt;
:::LLVector3 binormal&lt;br /&gt;
:::LLVector2 texCoord&lt;br /&gt;
::}&lt;br /&gt;
:}&lt;br /&gt;
:char[64] &amp;quot;End Morphs&amp;quot;&lt;br /&gt;
:S32 numRemaps (or EOF)&lt;br /&gt;
:struct vertexRemap[ numRemaps ]&lt;br /&gt;
:{&lt;br /&gt;
::S32 remapSource&lt;br /&gt;
::S32 remapDestination&lt;br /&gt;
:}&lt;br /&gt;
&lt;br /&gt;
====Level Of Detail (LOD) mesh====&lt;br /&gt;
&lt;br /&gt;
:char[24] &amp;quot;Linden Binary Mesh 1.0&amp;quot;&lt;br /&gt;
:U8 hasWeights&lt;br /&gt;
:U8 hasDetailTexCoords&lt;br /&gt;
:LLVector3 position&lt;br /&gt;
:LLVector3 rotationAngles&lt;br /&gt;
:U8 rotationOrder (ignored, set to 0)&lt;br /&gt;
:LLVector3 scale&lt;br /&gt;
:U16 numFaces&lt;br /&gt;
:struct faces[ numFaces ]&lt;br /&gt;
:{&lt;br /&gt;
::S16[3] face&lt;br /&gt;
:}&lt;br /&gt;
&lt;br /&gt;
where LLVector2 and LLVector3 are 2 and 3 floats respectively, and all numbers are little endian.  Integers are 8, 16, or 32 bits signed (S) or unsigned (U).&lt;br /&gt;
&lt;br /&gt;
The LOD .llm files actually contain fields for (if hasWeights) numSkinJoints set to zero, char[64] &amp;quot;End Morphs&amp;quot;, and numRemaps set to zero, but these are not read by the viewer.&lt;br /&gt;
&lt;br /&gt;
Each weight actually contains two pieces of information.  The number to the left of the decimal point is the index of the joint and also implicitly indexes to the following joint.  The actual weight is to the right of the decimal point and interpolates between these two joints.  The index is into an &amp;quot;expanded&amp;quot; list of joints, not just a linear array of the joints as defined in the skeleton file.  In particular, any joint that has more than one child will be repeated in the list for each of its children.&lt;br /&gt;
&lt;br /&gt;
===Loading the file===&lt;br /&gt;
&lt;br /&gt;
This data is used to create instances of LLVOAvatar in LLVOAvatar::loadAvatar()&lt;br /&gt;
through LLVOAvatar::loadMeshNodes, LLPolyMesh::getMesh, LLPolyMeshSharedData::loadMesh, and LLPolyMorphData::loadBinary.  These are found in indra\newview\llvoavatar.h(.cpp), indra\newview\llpolymesh.h(.cpp), and indra\newview\llpolymorph.h(.cpp), and indra\llappearance\llpolymorph.h(cpp).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Linden wearable definition file ==&lt;br /&gt;
&lt;br /&gt;
The format is used for client/server communication - wearable assets are downloaded to cache/uploaded on creation. No import/export ability currently exists, although wearables are manipulated as files both on the viewer and server.&lt;br /&gt;
&lt;br /&gt;
=== Source References ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;newview/llwearable.h&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;enum EWearableType&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;newview/llwearable.cpp&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;LLWearable::importFile&amp;lt;/code&amp;gt; – parses assets when &amp;quot;worn&amp;quot; from inventory, after download to cache&lt;br /&gt;
** &amp;lt;code&amp;gt;LLWearable::exportFile&amp;lt;/code&amp;gt; – called by &amp;lt;code&amp;gt;LLWearable::saveNewAsset&amp;lt;/code&amp;gt; when created, does upload to asset system&lt;br /&gt;
* &amp;lt;code&amp;gt;newview/llvoavatardefines.h&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;enum ETextureIndex&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== File Structure ===&lt;br /&gt;
&lt;br /&gt;
Details:&lt;br /&gt;
* The file is line-oriented. UNIX line endings (LF 0x0A) are expected.&lt;br /&gt;
* File encoding for strings is implicitly UTF-8. No byte-order mark is allowed.&lt;br /&gt;
* Whitespace is used as delimiters. Spaces (0x20) and tabs (0x09) are considered whitespace, and any number may be used.&lt;br /&gt;
&lt;br /&gt;
The file consists of the following blocks, which must occur in the specified order:&lt;br /&gt;
&lt;br /&gt;
* Format/Version&lt;br /&gt;
* Name&lt;br /&gt;
* Description&lt;br /&gt;
* Permissions&lt;br /&gt;
* Sale Info&lt;br /&gt;
* Wearable type&lt;br /&gt;
* Parameters&lt;br /&gt;
* Textures&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Format/Version&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The string &amp;lt;code&amp;gt;LLWearable version&amp;lt;/code&amp;gt; followed by the version number (currently &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 LLWearable version 22&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A single line string, terminated with a UNIX newline (LF 0x0A). Maximum length is 2047 bytes, not counting the newline. Encoding is UTF-8. A blank line is used to indicate the absence of a name.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 Space Cadet Shirt&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A single line string, terminated with a UNIX newline (LF 0x0A). Maximum length is 2047 bytes, not counting the newline. Encoding is UTF-8. A blank line is used to indicate the absence of a description.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 This is my awesome shirt!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Permissions block&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* First line: The token &amp;lt;code&amp;gt;permissions&amp;lt;/code&amp;gt; followed by the permission block version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Second line: open brace &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
* A sequence of permission name/value pairs, each on its own line&lt;br /&gt;
* Final line: close brace &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The permission name/value pairs are:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;base_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;owner_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;group_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;everyone_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;next_owner_mask&amp;lt;/code&amp;gt;, with 8-digit hexadecimal value&lt;br /&gt;
* &amp;lt;code&amp;gt;creator_id&amp;lt;/code&amp;gt;, with agent UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;owner_id&amp;lt;/code&amp;gt;, with agent UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;last_owner_id&amp;lt;/code&amp;gt;, with agent UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;group_id&amp;lt;/code&amp;gt;, with group UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
* &amp;lt;code&amp;gt;group_owned&amp;lt;/code&amp;gt;, with &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (false) or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (true) flag&lt;br /&gt;
&lt;br /&gt;
If a name/value is missing, a default value is assumed. For maximum compatibility, everything should be explicitly specified except &amp;lt;code&amp;gt;group_owned&amp;lt;/code&amp;gt; when false.&lt;br /&gt;
&lt;br /&gt;
Flags are defined in &amp;lt;code&amp;gt;llinventory/llpermissionsflags.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_TRANSFER&amp;lt;/code&amp;gt; = 0x00002000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_MODIFY&amp;lt;/code&amp;gt; = 0x00004000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_COPY&amp;lt;/code&amp;gt; = 0x00008000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_MOVE&amp;lt;/code&amp;gt; = 0x00080000&lt;br /&gt;
&lt;br /&gt;
Common masks are:&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_NONE&amp;lt;/code&amp;gt; 0x00000000&lt;br /&gt;
* &amp;lt;code&amp;gt;PERM_ALL&amp;lt;/code&amp;gt; 0x7FFFFFFF&lt;br /&gt;
&lt;br /&gt;
And common values are:&lt;br /&gt;
* no modify: &amp;lt;code&amp;gt;PERM_ALL &amp;amp; ~PERM_MODIFY&amp;lt;/code&amp;gt;                  = 0x7fffbfff&lt;br /&gt;
* no copy:    &amp;lt;code&amp;gt;PERM_ALL &amp;amp; ~PERM_COPY&amp;lt;/code&amp;gt;                    = 0x7fff7fff&lt;br /&gt;
* no modify or copy:                                  = 0x7fff3fff&lt;br /&gt;
* no transfer:  &amp;lt;code&amp;gt;PERM_ALL &amp;amp; ~PERM_TRANSFER&amp;lt;/code&amp;gt;              = 0x7fffdfff&lt;br /&gt;
* no modify, no transfer                              = 0x7fff9fff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
        permissions 0&lt;br /&gt;
        {&lt;br /&gt;
                base_mask       7fffffff&lt;br /&gt;
                owner_mask      7fffffff&lt;br /&gt;
                group_mask      00000000&lt;br /&gt;
                everyone_mask   7fffbfff&lt;br /&gt;
                next_owner_mask 7fffffff&lt;br /&gt;
                creator_id      d929385f-41e3-4a34-a04e-f1fc39f24f12&lt;br /&gt;
                owner_id        ff9a71eb-7414-4bf8-866e-a70ddeb7c3cf&lt;br /&gt;
                last_owner_id   ff9a71eb-7414-4bf8-866e-a70ddeb7c3cf&lt;br /&gt;
                group_id        00000000-0000-0000-0000-000000000000&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sale Info block&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* First line: The token &amp;lt;code&amp;gt;sale_info&amp;lt;/code&amp;gt; followed by the sale_info block version &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Second line: open brace &amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;&lt;br /&gt;
* A sequence of sale info name/value pairs, each on its own line&lt;br /&gt;
* Final line: close brace &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The sale info name/value pairs are:&lt;br /&gt;
* &amp;lt;code&amp;gt;sale_type&amp;lt;/code&amp;gt;: one of:&lt;br /&gt;
** &amp;lt;code&amp;gt;not&amp;lt;/code&amp;gt; - not for sale&lt;br /&gt;
** &amp;lt;code&amp;gt;orig&amp;lt;/code&amp;gt; - the original is purchased&lt;br /&gt;
** &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; - a copy is purchased&lt;br /&gt;
** &amp;lt;code&amp;gt;cntn&amp;lt;/code&amp;gt; - the content is purchased&lt;br /&gt;
* &amp;lt;code&amp;gt;sale_price&amp;lt;/code&amp;gt; - price in L$&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
        sale_info       0&lt;br /&gt;
        {&lt;br /&gt;
                sale_type       not&lt;br /&gt;
                sale_price      10&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Wearable Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* A single line with the token &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; followed by the wearable type as a decimal integer&lt;br /&gt;
&lt;br /&gt;
The type is defined in the &amp;lt;code&amp;gt;EWearableType&amp;lt;/code&amp;gt; enumeration in &amp;lt;code&amp;gt;newview/llwearable.h&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Bodyparts&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SHAPE&amp;lt;/code&amp;gt; = 0&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SKIN&amp;lt;/code&amp;gt; = 1&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_HAIR&amp;lt;/code&amp;gt; = 2&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_EYES&amp;lt;/code&amp;gt; = 3&lt;br /&gt;
* Clothing&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SHIRT&amp;lt;/code&amp;gt; = 4&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_PANTS&amp;lt;/code&amp;gt; = 5&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SHOES&amp;lt;/code&amp;gt; = 6&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SOCKS&amp;lt;/code&amp;gt; = 7&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_JACKET&amp;lt;/code&amp;gt;   = 8&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_GLOVES&amp;lt;/code&amp;gt;   = 9&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_UNDERSHIRT&amp;lt;/code&amp;gt; = 10&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_UNDERPANTS&amp;lt;/code&amp;gt; = 11&lt;br /&gt;
** &amp;lt;code&amp;gt;WT_SKIRT&amp;lt;/code&amp;gt; = 12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 type 4&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parameters&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* A line with the token &amp;lt;code&amp;gt;parameters&amp;lt;/code&amp;gt; followed by the number of parameter ID/value pairs as a decimal integer&lt;br /&gt;
* A sequence of parameter/ID value pairs, each on its own line&lt;br /&gt;
** Parameter ID from the [[#Linden avatar definition file]], a decimal integer&lt;br /&gt;
** Parameter value (or weight) is a decimal floating point value&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 parameters 10&lt;br /&gt;
 781 1&lt;br /&gt;
 800 .92&lt;br /&gt;
 801 1&lt;br /&gt;
 802 1&lt;br /&gt;
 803 1&lt;br /&gt;
 804 1&lt;br /&gt;
 805 1&lt;br /&gt;
 828 .18&lt;br /&gt;
 840 0&lt;br /&gt;
 868 .27&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Texture&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* A line with the token &amp;lt;code&amp;gt;textures&amp;lt;/code&amp;gt; followed by the number of texture index/ID pairs as a decimal integer&lt;br /&gt;
* A sequence of texture index/ID pairs, each on its own line&lt;br /&gt;
** Texture index is defined in the &amp;lt;code&amp;gt;ETextureIndex&amp;lt;/code&amp;gt; enumeration in &amp;lt;code&amp;gt;newview/llvoavatardefines.h&amp;lt;/code&amp;gt;&lt;br /&gt;
** Texture ID is the texture&#039;s UUID in hexadecimal 8-4-4-4-12 format&lt;br /&gt;
&lt;br /&gt;
Texture indexes:&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HEAD_BODYPAINT&amp;lt;/code&amp;gt;   =  0&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_SHIRT&amp;lt;/code&amp;gt;      =  1&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_PANTS&amp;lt;/code&amp;gt;      =  2&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_EYES_IRIS&amp;lt;/code&amp;gt;        =  3&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HAIR&amp;lt;/code&amp;gt;             =  4&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_BODYPAINT&amp;lt;/code&amp;gt;  =  5&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_BODYPAINT&amp;lt;/code&amp;gt;  =  6&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_SHOES&amp;lt;/code&amp;gt;      =  7&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HEAD_BAKED&amp;lt;/code&amp;gt;       =  8  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_BAKED&amp;lt;/code&amp;gt;      =  9  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_BAKED&amp;lt;/code&amp;gt;      = 10  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_EYES_BAKED&amp;lt;/code&amp;gt;       = 11  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_SOCKS&amp;lt;/code&amp;gt;      = 12&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_JACKET&amp;lt;/code&amp;gt;     = 13&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_JACKET&amp;lt;/code&amp;gt;     = 14&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_GLOVES&amp;lt;/code&amp;gt;     = 15&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_UPPER_UNDERSHIRT&amp;lt;/code&amp;gt; = 16&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_LOWER_UNDERPANTS&amp;lt;/code&amp;gt; = 17&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_SKIRT&amp;lt;/code&amp;gt;            = 18&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_SKIRT_BAKED&amp;lt;/code&amp;gt;      = 19  (* See below)&lt;br /&gt;
* &amp;lt;code&amp;gt;TEX_HAIR_BAKED&amp;lt;/code&amp;gt;       = 20  (* See below)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;* When the avatar changes a wearable, the simulator requests that the viewer rebake the *_BAKED textures; these are then uploaded as new temporary assets to the system so that the individual assets do not need to be downloaded. The *_BAKED textures are not referenced by wearables.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 textures 1&lt;br /&gt;
 1 08115557-ad4d-09ed-6b39-2ffc1f2b58b2&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183458</id>
		<title>Jump/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183458"/>
		<updated>2013-11-10T09:34:46Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: некоторые слова &amp;quot;ошибка&amp;quot; (word &amp;quot;bug&amp;quot;) изменим на &amp;quot;косяк&amp;quot; и&amp;quot;глюк&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|Types||{{#var:lang}}}}&lt;br /&gt;
{{LSLC|Keywords||{{#var:lang}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:name|Jump/ru}}&lt;br /&gt;
{{#vardefine:p_jump_target_desc| Название метки внутри функции или события области видимости.}}&lt;br /&gt;
{{#vardefine:header_title|{{label}} {{LSL Param|target}};&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:header_text|{{{!}}{{LSL DefineRow|{{BlueText|label}}|{{target}}|{{#var:p_jump_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:constants_nb|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;@{{LSL Param|label_target|target}};&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Метка, в которую можно прыгнуть, если скачок в той же области видимости или в младшей (производной) области видимости. Это не возможно для перехода между областями видимости (например, между функциями, событиями или состояниями).&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow|label|target|{{#var:p_label_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:examples|&#039;&#039;&#039;Примеры&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer a = 5;&lt;br /&gt;
jump over;&lt;br /&gt;
@in;&lt;br /&gt;
a = 6;&lt;br /&gt;
@over;&lt;br /&gt;
llOwnerSay((string)a);&lt;br /&gt;
if(a &amp;lt; 6)&lt;br /&gt;
    jump in;&lt;br /&gt;
//скрипт будет, скажем, 5, а затем 6&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;   // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            jump break; // Нашел! Ранний выход из цикла с результатом&lt;br /&gt;
    }&lt;br /&gt;
    i = -1; // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
    @break;&lt;br /&gt;
    return i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Чаще всего   довольно уродливый &amp;quot;прыжок&amp;quot; можно избежать, особенно в пользовательские функции, как это демонстрирует версия вышеприведенного скрипта&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;      // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            return i;                    // Нашел его, вернуть его индекс       &lt;br /&gt;
    }&lt;br /&gt;
    return -1;     // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:notes|&#039;&#039;&#039;Заметки&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Как правило, считается нецелесообразным использовать скачки (часто называемая &#039;&#039;&#039;GOTO&#039;&#039;&#039;) там, где могут быть использованы другие управляющие структуры.&lt;br /&gt;
* {{Wikipedia|Goto}}&lt;br /&gt;
* [http://xkcd.com/292/ XKCD:Goto]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:lso|&#039;&#039;&#039;Детальные заметки&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5&amp;gt;Глюк многократного скачка&amp;lt;/h5&amp;gt;&lt;br /&gt;
Следующая функция &amp;lt;code&amp;gt;jumpy&amp;lt;/code&amp;gt; демонстрирует косяк &amp;quot;несколько прыжков-источников к одной цели&amp;quot;. Похоже, здесь функция должна привести к бесконечному циклу, что происходит при компиляции сценария для Mono VM. Однако при компиляции для LSO VM из-за даного глюка второй прыжок никогда не происходит и функция возвращается. LL сообщили, что не желают исправить косяк, чтобы сделать его критическим изменением. Косяк был исправлен ​​в более новой Mono VM.&lt;br /&gt;
&amp;lt;lsl&amp;gt;jumpy(){&lt;br /&gt;
    jump next;//first jump&lt;br /&gt;
    @next;&lt;br /&gt;
    jump next;//второй прыжок - глюк (косяк), оператор никогда не запускается на выполнение&lt;br /&gt;
    return;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:caveats|&#039;&#039;&#039;Предостережения&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Только в [[LSO]]-режиме скрипта:&#039;&#039;&#039;  Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут.&lt;br /&gt;
*Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- {{JIRA|SVC-6712}}&lt;br /&gt;
**Попытка такого использования   приведет к бесполезной CIL-сигнла_сборки (assembly) об косяке подключения. -- {{Jira|SCR-256}}&lt;br /&gt;
*Если код существует после возвращения, не инкапсулированного в структуру управления потоком, компилятор выдаст сообщение ошибки о падении кода, даже если код доступен с прыжка. -- {{Jira|SVC-1929}}&lt;br /&gt;
}}{{Issues/SVC-6712}}{{Issues/SCR-256}}{{Issues/SVC-1929}}&lt;br /&gt;
{{#vardefine:helpers|&lt;br /&gt;
}}{{#vardefine:also_header|&#039;&#039;См.также&#039;&#039; &lt;br /&gt;
&amp;lt;h3&amp;gt;Ключевые слова&amp;lt;/h3&amp;gt;&lt;br /&gt;
{{{!}}{{LSL DefineRow||[[return/ru|return]]|}}&lt;br /&gt;
{{LSL DefineRow||[[state/ru|state]]|}}&lt;br /&gt;
{{LSL DefineRow||[[label/ru|label]]|}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:also_footer|}}&lt;br /&gt;
{{#vardefine:also_functions|}}&lt;br /&gt;
{{#vardefine:also_events|}}&lt;br /&gt;
{{#vardefine:also_articles|}}&lt;br /&gt;
{{#vardefine:also_tests|}}&lt;br /&gt;
{{#vardefine:location|&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Flow Control||{{#var:lang}}}}&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183457</id>
		<title>Jump/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183457"/>
		<updated>2013-11-10T08:51:15Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|Types||{{#var:lang}}}}&lt;br /&gt;
{{LSLC|Keywords||{{#var:lang}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:name|Jump/ru}}&lt;br /&gt;
{{#vardefine:p_jump_target_desc| Название метки внутри функции или события области видимости.}}&lt;br /&gt;
{{#vardefine:header_title|{{label}} {{LSL Param|target}};&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:header_text|{{{!}}{{LSL DefineRow|{{BlueText|label}}|{{target}}|{{#var:p_jump_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:constants_nb|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;@{{LSL Param|label_target|target}};&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Метка, в которую можно прыгнуть, если скачок в той же области видимости или в младшей (производной) области видимости. Это не возможно для перехода между областями видимости (например, между функциями, событиями или состояниями).&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow|label|target|{{#var:p_label_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:examples|&#039;&#039;&#039;Примеры&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer a = 5;&lt;br /&gt;
jump over;&lt;br /&gt;
@in;&lt;br /&gt;
a = 6;&lt;br /&gt;
@over;&lt;br /&gt;
llOwnerSay((string)a);&lt;br /&gt;
if(a &amp;lt; 6)&lt;br /&gt;
    jump in;&lt;br /&gt;
//скрипт будет, скажем, 5, а затем 6&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;   // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            jump break; // Нашел! Ранний выход из цикла с результатом&lt;br /&gt;
    }&lt;br /&gt;
    i = -1; // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
    @break;&lt;br /&gt;
    return i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Чаще всего   довольно уродливый &amp;quot;прыжок&amp;quot; можно избежать, особенно в пользовательские функции, как это демонстрирует версия вышеприведенного скрипта&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;      // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            return i;                    // Нашел его, вернуть его индекс       &lt;br /&gt;
    }&lt;br /&gt;
    return -1;     // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:notes|&#039;&#039;&#039;Заметки&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Как правило, считается нецелесообразным использовать скачки (часто называемая &#039;&#039;&#039;GOTO&#039;&#039;&#039;) там, где могут быть использованы другие управляющие структуры.&lt;br /&gt;
* {{Wikipedia|Goto}}&lt;br /&gt;
* [http://xkcd.com/292/ XKCD:Goto]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:lso|&#039;&#039;&#039;Детальные заметки&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5&amp;gt;Ошибка многократного скачка&amp;lt;/h5&amp;gt;&lt;br /&gt;
Следующая функция &amp;lt;code&amp;gt;jumpy&amp;lt;/code&amp;gt; демонстрирует ошибку &amp;quot;несколько прыжков-источников к одной цели&amp;quot;. Похоже, здесь функция должна привести к бесконечному циклу, что происходит при компиляции сценария для Mono VM. Однако при компиляции для LSO VM из-за даной ошибки второй прыжок никогда не происходит и функция возвращается. LL сообщили, что не желают исправить эту ошибку, чтобы сделать её критическим изменением. Эта ошибка была исправлена ​​в более новой Mono VM.&lt;br /&gt;
&amp;lt;lsl&amp;gt;jumpy(){&lt;br /&gt;
    jump next;//first jump&lt;br /&gt;
    @next;&lt;br /&gt;
    jump next;//второй прыжок - ошибка, никогда не запускается на выполнение&lt;br /&gt;
    return;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:caveats|&#039;&#039;&#039;Предостережения&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Только в [[LSO]]-режиме скрипта:&#039;&#039;&#039;  Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут.&lt;br /&gt;
*Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- {{JIRA|SVC-6712}}&lt;br /&gt;
**Попытка такого использования   приведет к бесполезной CIL-сигнла_сборки (assembly) об ошибке подключения. -- {{Jira|SCR-256}}&lt;br /&gt;
*Если код существует после возвращения, не инкапсулированные в структуре управления потоком, компилятор выдаст ошибку о коде быть мертвым, даже если код доступным с прыжка.&lt;br /&gt;
If code exists after a return that is not encapsulated in a flow control structure, the compiler will return an error about the code being dead even if the code is accessible with a jump. -- {{Jira|SVC-1929}}&lt;br /&gt;
}}{{Issues/SVC-6712}}{{Issues/SCR-256}}{{Issues/SVC-1929}}&lt;br /&gt;
{{#vardefine:helpers|&lt;br /&gt;
}}{{#vardefine:also_header|&#039;&#039;См.также&#039;&#039; &lt;br /&gt;
&amp;lt;h3&amp;gt;Ключевые слова&amp;lt;/h3&amp;gt;&lt;br /&gt;
{{{!}}{{LSL DefineRow||[[return/ru|return]]|}}&lt;br /&gt;
{{LSL DefineRow||[[state/ru|state]]|}}&lt;br /&gt;
{{LSL DefineRow||[[label/ru|label]]|}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:also_footer|}}&lt;br /&gt;
{{#vardefine:also_functions|}}&lt;br /&gt;
{{#vardefine:also_events|}}&lt;br /&gt;
{{#vardefine:also_articles|}}&lt;br /&gt;
{{#vardefine:also_tests|}}&lt;br /&gt;
{{#vardefine:location|&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Flow Control||{{#var:lang}}}}&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183456</id>
		<title>Jump/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183456"/>
		<updated>2013-11-10T08:49:13Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Заметки (notes)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|Types||{{#var:lang}}}}&lt;br /&gt;
{{LSLC|Keywords||{{#var:lang}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:name|Jump/ru}}&lt;br /&gt;
{{#vardefine:p_jump_target_desc| Название метки внутри функции или события области видимости.}}&lt;br /&gt;
{{#vardefine:header_title|{{label}} {{LSL Param|target}};&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:header_text|{{{!}}{{LSL DefineRow|{{BlueText|label}}|{{target}}|{{#var:p_jump_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:constants_nb|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;@{{LSL Param|label_target|target}};&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Метка, в которую можно прыгнуть, если скачок в той же области видимости или в младшей (производной) области видимости. Это не возможно для перехода между областями видимости (например, между функциями, событиями или состояниями).&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow|label|target|{{#var:p_label_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:examples|&#039;&#039;&#039;Примеры&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer a = 5;&lt;br /&gt;
jump over;&lt;br /&gt;
@in;&lt;br /&gt;
a = 6;&lt;br /&gt;
@over;&lt;br /&gt;
llOwnerSay((string)a);&lt;br /&gt;
if(a &amp;lt; 6)&lt;br /&gt;
    jump in;&lt;br /&gt;
//скрипт будет, скажем, 5, а затем 6&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;   // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            jump break; // Нашел! Ранний выход из цикла с результатом&lt;br /&gt;
    }&lt;br /&gt;
    i = -1; // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
    @break;&lt;br /&gt;
    return i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Чаще всего   довольно уродливый &amp;quot;прыжок&amp;quot; можно избежать, особенно в пользовательские функции, как это демонстрирует версия вышеприведенного скрипта&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;      // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            return i;                    // Нашел его, вернуть его индекс       &lt;br /&gt;
    }&lt;br /&gt;
    return -1;     // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:notes|&#039;&#039;&#039;Заметки&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Как правило, считается нецелесообразным использовать скачки (часто называемая &#039;&#039;&#039;GOTO&#039;&#039;&#039;) там, где могут быть использованы другие управляющие структуры.&lt;br /&gt;
* {{Wikipedia|Goto}}&lt;br /&gt;
* [http://xkcd.com/292/ XKCD:Goto]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:lso|&#039;&#039;&#039;Детальные заметки&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5&amp;gt;Ошибка многократного скачка&amp;lt;/h5&amp;gt;&lt;br /&gt;
Следующая функция &amp;lt;code&amp;gt;jumpy&amp;lt;/code&amp;gt; демонстрирует ошибку &amp;quot;несколько прыжков-источников к одной цели&amp;quot;. Похоже, здесь функция должна привести к бесконечному циклу, что происходит при компиляции сценария для Mono VM. Однако при компиляции для LSO VM из-за даной ошибки второй прыжок никогда не происходит и функция возвращается. LL сообщили, что не желают исправить эту ошибку, чтобы сделать её критическим изменением. Эта ошибка была исправлена ​​в более новой Mono VM.&lt;br /&gt;
&amp;lt;lsl&amp;gt;jumpy(){&lt;br /&gt;
    jump next;//first jump&lt;br /&gt;
    @next;&lt;br /&gt;
    jump next;//второй прыжок - ошибка, никогда не запускается на выполнение&lt;br /&gt;
    return;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:caveats|&#039;&#039;&#039;Предостережения&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Только в [[LSO]]-режиме скрипта:&#039;&#039;&#039;  Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут.&lt;br /&gt;
*Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- {{JIRA|SVC-6712}}&lt;br /&gt;
**Попытка такого использования   приведет к бесполезной CIL-сигнла_сборки (assembly) об ошибке подключения. -- {{Jira|SCR-256}}&lt;br /&gt;
*Если код существует после возвращения, не инкапсулированные в структуре управления потоком, компилятор выдаст ошибку о коде быть мертвым, даже если код доступным с прыжка.&lt;br /&gt;
If code exists after a return that is not encapsulated in a flow control structure, the compiler will return an error about the code being dead even if the code is accessible with a jump. -- {{Jira|SVC-1929}}&lt;br /&gt;
}}{{Jira/SVC-6712}}{{Jira/SCR-256}}{{Jira/SVC-1929}}&lt;br /&gt;
{{#vardefine:helpers|&lt;br /&gt;
}}{{#vardefine:also_header|&#039;&#039;См.также&#039;&#039; &lt;br /&gt;
&amp;lt;h3&amp;gt;Ключевые слова&amp;lt;/h3&amp;gt;&lt;br /&gt;
{{{!}}{{LSL DefineRow||[[return/ru|return]]|}}&lt;br /&gt;
{{LSL DefineRow||[[state/ru|state]]|}}&lt;br /&gt;
{{LSL DefineRow||[[label/ru|label]]|}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:also_footer|}}&lt;br /&gt;
{{#vardefine:also_functions|}}&lt;br /&gt;
{{#vardefine:also_events|}}&lt;br /&gt;
{{#vardefine:also_articles|}}&lt;br /&gt;
{{#vardefine:also_tests|}}&lt;br /&gt;
{{#vardefine:location|&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Flow Control||{{#var:lang}}}}&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183455</id>
		<title>Jump/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Jump/ru&amp;diff=1183455"/>
		<updated>2013-11-10T08:17:48Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Первопроходец&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|Types||{{#var:lang}}}}&lt;br /&gt;
{{LSLC|Keywords||{{#var:lang}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:name|Jump/ru}}&lt;br /&gt;
{{#vardefine:p_jump_target_desc| Название метки внутри функции или события области видимости.}}&lt;br /&gt;
{{#vardefine:header_title|{{label}} {{LSL Param|target}};&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:header_text|{{{!}}{{LSL DefineRow|{{BlueText|label}}|{{target}}|{{#var:p_jump_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:constants_nb|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;@{{LSL Param|label_target|target}};&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Метка, в которую можно прыгнуть, если скачок в той же области видимости или в младшей (производной) области видимости. Это не возможно для перехода между областями видимости (например, между функциями, событиями или состояниями).&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow|label|target|{{#var:p_label_target_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:examples|&#039;&#039;&#039;Примеры&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer a = 5;&lt;br /&gt;
jump over;&lt;br /&gt;
@in;&lt;br /&gt;
a = 6;&lt;br /&gt;
@over;&lt;br /&gt;
llOwnerSay((string)a);&lt;br /&gt;
if(a &amp;lt; 6)&lt;br /&gt;
    jump in;&lt;br /&gt;
//скрипт будет, скажем, 5, а затем 6&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;   // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            jump break; // Нашел! Ранний выход из цикла с результатом&lt;br /&gt;
    }&lt;br /&gt;
    i = -1; // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
    @break;&lt;br /&gt;
    return i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Чаще всего   довольно уродливый &amp;quot;прыжок&amp;quot; можно избежать, особенно в пользовательские функции, как это демонстрирует версия вышеприведенного скрипта&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer getLinkWithName(string name)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llGetLinkNumber() != 0;      // Начинается с нуля (единственный прим) или 1 (два или более примов)&lt;br /&gt;
    integer x = llGetNumberOfPrims() + i; // [0, 1) or [1, llGetNumberOfPrims()]&lt;br /&gt;
    for (; i &amp;lt; x; ++i) &lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLinkName(i) == name) &lt;br /&gt;
            return i;                    // Нашел его, вернуть его индекс       &lt;br /&gt;
    }&lt;br /&gt;
    return -1;     // Нет примитива (prim) с таким именем, возврат   return -1.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:notes|&lt;br /&gt;
}}{{#vardefine:caveats|&#039;&#039;&#039;Предостережения&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;Только в [[LSO]]-режиме скрипта:&#039;&#039;&#039;  Если несколько источников скачка высказались за ту же метку цели в пределах видимости, то только первая (сверху вниз, слева направо) будет функционировать как и ожидалось, все остальные по-умолчанию откажут.&lt;br /&gt;
*Метки находятся в области видимости при событийном и функциональном уровне, что значит невозможность объявить одинаковые метки в том же событии или функции, даже если метки заключены в другие условные-операторы, циклы и подобное. -- {{JIRA|SVC-6712}}&lt;br /&gt;
**Попытка такого использования   приведет к бесполезной CIL-сигнла_сборки (assembly) об ошибке подключения. -- {{Jira|SCR-256}}&lt;br /&gt;
*Если код существует после возвращения, не инкапсулированные в структуре управления потоком, компилятор выдаст ошибку о коде быть мертвым, даже если код доступным с прыжка.&lt;br /&gt;
If code exists after a return that is not encapsulated in a flow control structure, the compiler will return an error about the code being dead even if the code is accessible with a jump. -- {{Jira|SVC-1929}}&lt;br /&gt;
}}&lt;br /&gt;
{{Issues/SVC-6712}}&lt;br /&gt;
{{Issues/SCR-256}}&lt;br /&gt;
{{Issues/SVC-1929}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:helpers|}}&lt;br /&gt;
{{#vardefine:also_header|&#039;&#039;См.также&#039;&#039; &lt;br /&gt;
&amp;lt;h3&amp;gt;Ключевые слова&amp;lt;/h3&amp;gt;&lt;br /&gt;
{{{!}}{{LSL DefineRow||[[return/ru|return]]|}}&lt;br /&gt;
{{LSL DefineRow||[[state/ru|state]]|}}&lt;br /&gt;
{{LSL DefineRow||[[label/ru|label]]|}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
{{#vardefine:also_footer|}}&lt;br /&gt;
{{#vardefine:also_functions|}}&lt;br /&gt;
{{#vardefine:also_events|}}&lt;br /&gt;
{{#vardefine:also_articles|}}&lt;br /&gt;
{{#vardefine:also_tests|}}&lt;br /&gt;
{{#vardefine:location|&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Flow Control||{{#var:lang}}}}&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Hex2Int&amp;diff=1180849</id>
		<title>Hex2Int</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Hex2Int&amp;diff=1180849"/>
		<updated>2013-08-20T14:26:06Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: (string hexadecimal)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|[[:Category:LSL_User-Defined_Functions|User-Defined Functions]]|[[User:Void_Singer|Void&#039;s User Page]]}} &amp;lt;!-- please do not remove added links --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=&amp;lt;div style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Summary&amp;lt;/h2&amp;gt;&amp;lt;/div&amp;gt;[[:Category:LSL_User-Defined_Functions|User-Defined Function]]: [[integer]] Hex2Int( [[string]] &#039;&#039;hexadecimal&#039;&#039; );&lt;br /&gt;
|content=&lt;br /&gt;
Returns a [[integer]] that is &#039;&#039;hexadecimal&#039;&#039;[[string]] converted to [[integer]]&lt;br /&gt;
* &#039;&#039;hexadecimal&#039;&#039;: source string to convert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Terse&amp;lt;/h3&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;(Leading zeros removed)&#039;&#039;&#039;&lt;br /&gt;
* LSO: xxx bytes&lt;br /&gt;
* MONO: xxx bytes&lt;br /&gt;
&amp;lt;!-- Please replace with similarly licensed code only --&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// &amp;quot;012afc67&amp;quot; hex ~ 32 bit&lt;br /&gt;
integer simpleHex2Int(string hexadecimal)    &lt;br /&gt;
                                        return (integer)( &amp;quot;0x&amp;quot; + llGetSubString(hexadecimal, 0, 7)  );&lt;br /&gt;
&lt;br /&gt;
/*//--                       Anti-License Text                         --//*/&lt;br /&gt;
/*//     Contributed Freely to the Public Domain without limitation.     //*/&lt;br /&gt;
/*//   2013 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ]   //*/&lt;br /&gt;
/*//  Fashion Atlas [ https://wiki.secondlife.com/wiki/User:Fashion_Atlas ]  //*/&lt;br /&gt;
/*//--                                                                 --//*/&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Labeled Terse&amp;lt;/h3&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;(&amp;quot;0x&amp;quot; prefix, Leading zeros removed)&#039;&#039;&#039;&lt;br /&gt;
* LSO: xxx bytes&lt;br /&gt;
* MONO: xxx bytes&lt;br /&gt;
&amp;lt;!-- Please replace with similarly licensed code only --&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// &amp;quot;0x012afc67&amp;quot; ~ 32 bit&lt;br /&gt;
integer Hex2Int(string hexadecimal) &lt;br /&gt;
                                  return (integer)hexadecimal;&lt;br /&gt;
&lt;br /&gt;
/*//--                       Anti-License Text                         --//*/&lt;br /&gt;
/*//     Contributed Freely to the Public Domain without limitation.     //*/&lt;br /&gt;
/*//   2013 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ]   //*/&lt;br /&gt;
/*//  Fashion Atlas [ https://wiki.secondlife.com/wiki/User:Fashion_Atlas ]  //*/&lt;br /&gt;
/*//--                                                                 --//*/&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Notes&lt;br /&gt;
|content=&lt;br /&gt;
* All Labeled formats can be cast directly to integer within LSL&lt;br /&gt;
* Full formats are optimal for fixed width viewing, or packing into raw strings.&lt;br /&gt;
* Portable formats are designed for compatibility with outside systems that may use different bit lengths&lt;br /&gt;
* Suggest using the smallest compiled version that fits your needs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=See Also&lt;br /&gt;
|content=&lt;br /&gt;
* [[User:Strife_Onizuka/int2hex]] - Another Integer-&amp;amp;gt;Hex function but without using a loop.&lt;br /&gt;
&amp;lt;!-- what, no reciprocal linking Zai? =P --&amp;gt;&lt;br /&gt;
{{Issues/SVC-6660}}&lt;br /&gt;
{{IssueTable}}&lt;br /&gt;
}}&lt;br /&gt;
[[Category:LSL_User-Defined_Functions]]&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Hex2Int&amp;diff=1180848</id>
		<title>Hex2Int</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Hex2Int&amp;diff=1180848"/>
		<updated>2013-08-20T14:21:59Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;{{LSL Header|User-Defined Functions|Void&amp;#039;s User Page}} &amp;lt;!-- please do not remove added links --&amp;gt; &amp;lt;div style=&amp;quot;float:r…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|[[:Category:LSL_User-Defined_Functions|User-Defined Functions]]|[[User:Void_Singer|Void&#039;s User Page]]}} &amp;lt;!-- please do not remove added links --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=&amp;lt;div style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Summary&amp;lt;/h2&amp;gt;&amp;lt;/div&amp;gt;[[:Category:LSL_User-Defined_Functions|User-Defined Function]]: [[integer]] Hex2Int(string hexadecimal)( [[string]] &#039;&#039;hexadecimal&#039;&#039; );&lt;br /&gt;
|content=&lt;br /&gt;
Returns a [[integer]] that is &#039;&#039;hexadecimal&#039;&#039;[[string]] converted to [[integer]]&lt;br /&gt;
* &#039;&#039;hexadecimal&#039;&#039;: source string to convert&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Terse&amp;lt;/h3&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;(Leading zeros removed)&#039;&#039;&#039;&lt;br /&gt;
* LSO: xxx bytes&lt;br /&gt;
* MONO: xxx bytes&lt;br /&gt;
&amp;lt;!-- Please replace with similarly licensed code only --&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// 01234567_hex ~ 32 bit&lt;br /&gt;
integer simpleHex2Int(string hexadecimal)    &lt;br /&gt;
                                        return (integer)( &amp;quot;0x&amp;quot; + llGetSubString(hexadecimal, 0, 7)  );&lt;br /&gt;
&lt;br /&gt;
/*//--                       Anti-License Text                         --//*/&lt;br /&gt;
/*//     Contributed Freely to the Public Domain without limitation.     //*/&lt;br /&gt;
/*//   2013 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ]   //*/&lt;br /&gt;
/*//  Fashion Atlas [ https://wiki.secondlife.com/wiki/User:Fashion_Atlas ]  //*/&lt;br /&gt;
/*//--                                                                 --//*/&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Labeled Terse&amp;lt;/h3&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;(&amp;quot;0x&amp;quot; prefix, Leading zeros removed)&#039;&#039;&#039;&lt;br /&gt;
* LSO: xxx bytes&lt;br /&gt;
* MONO: xxx bytes&lt;br /&gt;
&amp;lt;!-- Please replace with similarly licensed code only --&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// 0x01234567 ~ 32 bit&lt;br /&gt;
integer Hex2Int(string hexadecimal) &lt;br /&gt;
                                  return (integer)hexadecimal;&lt;br /&gt;
&lt;br /&gt;
/*//--                       Anti-License Text                         --//*/&lt;br /&gt;
/*//     Contributed Freely to the Public Domain without limitation.     //*/&lt;br /&gt;
/*//   2013 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ]   //*/&lt;br /&gt;
/*//  Fashion Atlas [ https://wiki.secondlife.com/wiki/User:Fashion_Atlas ]  //*/&lt;br /&gt;
/*//--                                                                 --//*/&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Notes&lt;br /&gt;
|content=&lt;br /&gt;
* All Labeled formats can be cast directly to integer within LSL&lt;br /&gt;
* Full formats are optimal for fixed width viewing, or packing into raw strings.&lt;br /&gt;
* Portable formats are designed for compatibility with outside systems that may use different bit lengths&lt;br /&gt;
* Suggest using the smallest compiled version that fits your needs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=See Also&lt;br /&gt;
|content=&lt;br /&gt;
* [[User:Strife_Onizuka/int2hex]] - Another Integer-&amp;amp;gt;Hex function but without using a loop.&lt;br /&gt;
&amp;lt;!-- what, no reciprocal linking Zai? =P --&amp;gt;&lt;br /&gt;
{{Issues/SVC-6660}}&lt;br /&gt;
{{IssueTable}}&lt;br /&gt;
}}&lt;br /&gt;
[[Category:LSL_User-Defined_Functions]]&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Animation/ru&amp;diff=1180279</id>
		<title>Category:LSL Animation/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Animation/ru&amp;diff=1180279"/>
		<updated>2013-07-22T13:27:15Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: /* Краткое изложение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSLC|}}{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|}}{{LSLC|Types||{{#var:lang}}}}{{LSLC|Types}}&lt;br /&gt;
{{LSLC|Keywords}}&lt;br /&gt;
=Анимация аватара=&lt;br /&gt;
== Краткое изложение ==&lt;br /&gt;
Second Life [[animations/ru|анимации]] часто [[llStartAnimation/ru|запускаются]] с помощью скриптов для достижения различных эффектов, таких как ходьба, сидение и летающие анимации, а также танцы, рукопожатия, объятия, или другие вещи. Здесь есть обозначения скриптеру для понимания основных концепций, как работа анимаций, которая подробно описана в других статьях, но она будет кратко описана здесь:&lt;br /&gt;
* Анимация перемещает только определенные части тела. Хотя много анимаций могут анимировать все тело, но некоторые будут манипулировать только руками или головой, что позволяет создать &amp;quot;слоистые&amp;quot; эффекты, такие как одновременные шатание и кивок с использованием двух различных анимаций. Объедините это с анимацией ходьбы и вы можете идти, шататься и кивать одновременно!&lt;br /&gt;
* Если несколько анимаций манипулируют той же частью тела, то каждая из них берётся переместить часть тела предопределенным [[Animation Priority/ru|анимационным приоритетом]], который применяется при запуске анимации в Вашем скрипте!&lt;br /&gt;
* Циклическое повторение анимаций должно быть явно остановлено использованием &amp;lt;code&amp;gt; [[llStopAnimation/ru | llStopAnimation ()]] &amp;lt;/code&amp;gt;, или они будут продолжаться бесконечно, поэтому убедитесь, что ваш скрипт останавливает любую запускаемую им анимацию, и если вы хотите избежать конфликта вы можете использовать &amp;lt;code&amp;gt; [[llGetAnimationList/ru | llGetAnimationList ()]] &amp;lt;/code&amp;gt; для определения работаещей анимации.&lt;br /&gt;
&lt;br /&gt;
== Предварительная загрузка анимации ==&lt;br /&gt;
Если вы хотите построить последовательность анимации, которые плавно переходят от одной к другой, то можно сделать так воспользовавшись [[Animation Priority/ru|анимационный приоритетом]]. Проще говоря, если вы запустили полный рабочий орган  анимацию всего тела с приоритетом 4, то анимации с приоритетом 3 и ниже  не будут видны (они перекрываются), помня это становится возможным построить последовательность анимаций, так что они будут загружать последующие шаги &amp;quot;в фоновом режиме&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Мы делаем это, запуская анимацию с приоритетом 4, переходя на приоритет 3, затем приоритет 2 и так далее. На каждом этапе следующая анимация начинается ранее, что позволяет загрузить в фоновом режиме, если пользователь еще не получил той анимации. Если ваша анимационная последовательность имеет больше действий, чем количество уровнией приоритета, то вы можете просто группировать совместные шаги и предварительную загрузку всей группой одновременно.&lt;br /&gt;
&lt;br /&gt;
Например, если ваш второй и третий этап представляет собой приоритетную задачу 3, то для начала вы начнете первом анимационном этапе (приоритет 4), а также со второй и третьей (так что они могут предварительно загрузиться). При переходе на второй этап, вы остановите первый и третий этапы. Остановка первая позволяет второму стать видимым, и мы останавливаем третий для избежания конфликта (так как имеем такой же приоритет).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039; &#039;Примечание&#039;&#039;&#039;: технически возможно все анимации в предварительной последовательности использовать с одинаковым приоритетом, и воспользоваться тем, что вызов анимации имеет одинаковый приоритет со старыми анимациями. Однако, это очень громоздкий метод, поэтому часто лучше  групповые анимационные приоритеты, также убедитесь, что у вас есть начальные &amp;quot;маскировки&amp;quot; анимации с приоритетом 4, что будет скрывать предварительно загружаемые анимации. Важно также помнить, что нельзя предварительно загружать большое количество анимаций, так как существует ограничение на количество активных одновременно анимаций, возможни лаги отставания в СЛ-клиенте, что также может мешать предварительной загрузке конкретной анимации.&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
[[Animation_Streamlined|Animation streamlined]]&lt;br /&gt;
&lt;br /&gt;
[[Animation_Streamlined/ru|Профилированная анимация]]&lt;br /&gt;
&lt;br /&gt;
== Известные проблемы ==&lt;br /&gt;
{{Issues/SVC-4569}}&lt;br /&gt;
{{Issues/SVC-6300}}&lt;br /&gt;
{{Issues/SVC-6866}}&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{#var:issues}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
=Анимация объекта=&lt;br /&gt;
(текст не определен)&lt;br /&gt;
===Анимация примов объекта===&lt;br /&gt;
(текст не определен)&lt;br /&gt;
===Анимация текстур прима===&lt;br /&gt;
(текст не определен)&lt;br /&gt;
{{LSLC|}}{{LSLC|Inventory}}&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:State&amp;diff=1180228</id>
		<title>Template:State</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:State&amp;diff=1180228"/>
		<updated>2013-07-20T12:21:34Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;state&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;state&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Jump&amp;diff=1180227</id>
		<title>Template:Jump</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Jump&amp;diff=1180227"/>
		<updated>2013-07-20T12:21:14Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;jump&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;jump&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180226</id>
		<title>Template:While</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180226"/>
		<updated>2013-07-20T12:20:45Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180225</id>
		<title>Template:While</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180225"/>
		<updated>2013-07-20T12:19:52Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;jump&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180224</id>
		<title>Template:While</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180224"/>
		<updated>2013-07-20T12:19:35Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;do-while&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180223</id>
		<title>Template:While</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:While&amp;diff=1180223"/>
		<updated>2013-07-20T12:19:16Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;while&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:If&amp;diff=1180222</id>
		<title>Template:If</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:If&amp;diff=1180222"/>
		<updated>2013-07-20T12:18:48Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;if&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;if&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:For&amp;diff=1180221</id>
		<title>Template:For</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:For&amp;diff=1180221"/>
		<updated>2013-07-20T12:17:44Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;for&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;for&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Quaternion&amp;diff=1180220</id>
		<title>Quaternion</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Quaternion&amp;diff=1180220"/>
		<updated>2013-07-20T12:15:03Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#vardefine:ml-cat|/LSL}}{{Help |Glossary=*}}&lt;br /&gt;
{{LSL Header}}{{LSLC|Types}}{{LSLC|Keywords|quaternion}}&lt;br /&gt;
=={{GreenText|Quaternion}}==&lt;br /&gt;
&lt;br /&gt;
{{quaternion}} is a keyword supported by the LSL compiler that means the same thing as, and is interchangeable with, &amp;lt;code&amp;gt;{{LSLG|rotation}}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Definition and Properties: ==&lt;br /&gt;
&lt;br /&gt;
Quaternions are a generalization of complex numbers, invented by William Rowan Hamilton in the mid-19th century.   Recall that a complex number is the sum of an ordinary real number a and an imaginary number bi, where i is defined by:&lt;br /&gt;
&lt;br /&gt;
i&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = -1&lt;br /&gt;
&lt;br /&gt;
To construct a quaternion we introduce additional generalized imaginary units j and k with the assumptions:&lt;br /&gt;
&lt;br /&gt;
j&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = -1;    k&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = -1;    ijk = -1&lt;br /&gt;
&lt;br /&gt;
From these basic definitions it is easy to derive the multiplication relations for these generalized imaginary quantities:&lt;br /&gt;
&lt;br /&gt;
ij = k;     jk = i;    ki = j&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
ji = -k;     kj = -i;    ik = -j&lt;br /&gt;
&lt;br /&gt;
That is, the multiplication of quaternions is not commutative.  While non-commutative operations are now a familiar feature of matrix algebra and vector and tensor analysis, at the time of their invention the idea was radical.  &lt;br /&gt;
&lt;br /&gt;
A quaternion is then a number of the form&lt;br /&gt;
&lt;br /&gt;
Q = a + bi + cj + dk&lt;br /&gt;
&lt;br /&gt;
where a,b, and c are ordinary real numbers.  Adding quaternions is easy enough; one just adds the corresponding multipliers:&lt;br /&gt;
&lt;br /&gt;
(a + bi + cj + dk) + (e + fi + gj + hk) = ( a+e) + (b+f)i + (c+g)j + (d+h)k&lt;br /&gt;
&lt;br /&gt;
The result of multiplying two quaternions can be worked out using the product relations above, remembering to preserve the order of terms in i,j,k since the imaginary units do not commute.  &lt;br /&gt;
&lt;br /&gt;
QR = (a + bi + cj + dk)(e + fi + gj + hk) =&lt;br /&gt;
&lt;br /&gt;
ae + afi + agj + ahk +&lt;br /&gt;
bei - bf + bgij + bhik +&lt;br /&gt;
cej + cfji - cg + chjk  +&lt;br /&gt;
dek + dfki + dgkj - dh&lt;br /&gt;
&lt;br /&gt;
=&lt;br /&gt;
ae + afi + agj + ahk +&lt;br /&gt;
bei - bf + bgk - bhj +&lt;br /&gt;
cej - cfk - cg + chi  +&lt;br /&gt;
dek + dfj - dgi - dh&lt;br /&gt;
&lt;br /&gt;
= (ae - bf - cg - dh) + (af + be + ch - dg)i + (ag -bh + ce + df)j + (ah + bg - cf + de)k&lt;br /&gt;
&lt;br /&gt;
(And you thought multiplying complex numbers was a mess!)&lt;br /&gt;
&lt;br /&gt;
Now, we can define the analog of a complex conjugate (we&#039;ll use the * notation but other notations are also common):&lt;br /&gt;
&lt;br /&gt;
Q*= a - bi - cj - dk&lt;br /&gt;
&lt;br /&gt;
The product of a quaternion and its conjugate is:&lt;br /&gt;
                                         &lt;br /&gt;
QQ* = (a + bi + cj + dk)(a - bi - cj - dk) =&lt;br /&gt;
&lt;br /&gt;
= (a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + b&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + d&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) + (-ab + ba - cd + dc)i + (-ac + bd + ca - db)j + (-ad - bc + cb + da)k&lt;br /&gt;
&lt;br /&gt;
= (a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + b&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + d&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
which looks rather like the square of a Euclidean length.  If we regard the triplet (b,c,d) as a vector V, we can rewrite this squared length as:&lt;br /&gt;
&lt;br /&gt;
QQ* = a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + ||V||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first term, a, is thus often referred to as the scalar or sometimes the real part of the quaternion, and the triplet (b,c,d) as the vector part.&lt;br /&gt;
&lt;br /&gt;
== Quaternions and Rotations: ==&lt;br /&gt;
&lt;br /&gt;
The reason we care about quaternions is that Second Life uses them to represent rotations.  How is this done?  Consider the quaternion representation of a vector V = (b,c,d),  which is just a quaternion with a zero real part:&lt;br /&gt;
&lt;br /&gt;
Q(V) = 0 + bi + cj + dk  &lt;br /&gt;
&lt;br /&gt;
If we multiply Q by some other quaternion, in general we will get a non-zero real part; that is, we&#039;ve transformed the vector into a non-vector quaternion, which doesn&#039;t look at all like a rotation.  However, if we multiply on one side by a quaternion z, and on the other side by the multiplicative inverse of z, z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;, we will get a result with a 0-value real part:&lt;br /&gt;
&lt;br /&gt;
Re[zQ(V)z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;]  = 0&lt;br /&gt;
&lt;br /&gt;
-- that is, we&#039;ll map a vector into a vector.  To see that this is so, note that from the formula for multiplication, the real part of the product of two quaternions is invariant to the order of multiplication, that is:&lt;br /&gt;
&lt;br /&gt;
Re[QR] = Re[RQ].&lt;br /&gt;
&lt;br /&gt;
So we can invert the order of the first and (second*third) quaternions in the mapping without changing the real part:&lt;br /&gt;
&lt;br /&gt;
Re[z(Q(V)z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;)]  = Re[(Q(V)z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;)z]  = Re[Q(V)(z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;z)]  = 0&lt;br /&gt;
&lt;br /&gt;
since quaternion multiplication is associative and we assumed that Q has a zero-value real part.  This operation of left-multiplying by a quaternion and right-multiplying by its inverse is known as conjugation by z.  Readers familiar with matrix algebra will recognize it as similar to the decomposition of a matrix into a rotation and a pure scaling (a diagonal matrix).  &lt;br /&gt;
&lt;br /&gt;
Under what conditions does conjugation of a quaternion give back the original quaternion?&lt;br /&gt;
&lt;br /&gt;
zQz&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;  = Q  implies   zQ = Qz&lt;br /&gt;
&lt;br /&gt;
(which can be easily shown by right-multiplying the first expression by z).  When do quaternions commute?  From the expression for the product of two quaternions, recalling that the real parts commute in general, we have for example for the part multiplying i:&lt;br /&gt;
&lt;br /&gt;
(af + be + ch - dg)i + ... =  (eb+ fa + gd - hc)i + ...&lt;br /&gt;
&lt;br /&gt;
in the case where multiplication is commutative.  This can only be true if ch - dg = 0 or c/d = g/h: that is, the slope of the vector part in the (j,k) plane is the same for both quaternions.  Since there&#039;s nothing special about i, this must also be true of the (i,j) and (i,k) planes: that is, the two quaternions must have vector parts that point in the same direction, or in other words, that are collinear.&lt;br /&gt;
&lt;br /&gt;
It&#039;s not too hard to show that conjugation is also linear (that is, the conjugate of the sum is the sum of the conjugates), and it&#039;s easy to see that the length of the vector part of Q is preserved under conjugation.  What sort of length-conserving linear transformation preserves a vector only when its axis coincides with the vector?  Why -- a rotation, of course.  So conjugation of Q by z is equivalent to rotating the vector part of Q around the axis defined by the vector part of z.  &lt;br /&gt;
&lt;br /&gt;
Let&#039;s try a simple case.  Consider the vector V = (1,0,0) and corresponding quaternion Q = 0 + i.  To rotate around the z-axis we need a quaternion z of the form a + ck.  The conjugation is then:&lt;br /&gt;
&lt;br /&gt;
Q&#039; = (a+c k)(i)(a + ck)&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the inverse of z? It&#039;s easy to see that if we choose a and c so that the length of the quaternion is 1, then the inverse is equal to the conjugate:&lt;br /&gt;
&lt;br /&gt;
len(z) = 1 = zz*  implies  z* = z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
so we can write:&lt;br /&gt;
&lt;br /&gt;
Q&#039; = (a+c k)(i)(a - ck) = (a+c k)(ai  + cj) = a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;i + acj + caj - c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;i  = ( a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;- c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)i + 2acj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with the constraint:&lt;br /&gt;
&lt;br /&gt;
a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+ c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;  = 1  &lt;br /&gt;
&lt;br /&gt;
implying that we can write  a = cos(θ/2), b = sin(θ/2)  for some angle θ   (the reason for the factor of 1/2 will become clear in a moment).&lt;br /&gt;
&lt;br /&gt;
Now, the terms in i and j become respectively:&lt;br /&gt;
&lt;br /&gt;
cos&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(θ/2) - sin&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(θ/2) = cos(θ)&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
2 cos(θ/2) sin(θ/2) = sin(θ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So this indeed represents a rotation of the k (z) axis by the angle θ.  We can infer that in the general case, to rotate a vector V around an axis A= (b,c,d)  (presumed normalized, that is ||A|| = 1) by an angle θ, we construct the quaternion&lt;br /&gt;
&lt;br /&gt;
z = cos(θ/2) + sin(θ/2)A = cos(θ/2) + sin(θ/2){bi + cj + dk}&lt;br /&gt;
&lt;br /&gt;
and then conjugate the quaternion Q = 0 + V with z :&lt;br /&gt;
&lt;br /&gt;
Q&#039; = zQz*&lt;br /&gt;
&lt;br /&gt;
from which we extract the vector part:&lt;br /&gt;
&lt;br /&gt;
Q&#039; = 0 + V&#039;&lt;br /&gt;
&lt;br /&gt;
V&#039; being the rotated vector V.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In Second Life, quaternions representing rotations are given as four floating point numbers.  The first three are the vector part, and the last is the scalar part:  Q = &amp;lt;Q.x, Q.y, Q.z, Q.s&amp;gt;.  In terms of Second Life region directions, the East-West direction is the x-axis, the North-South direction is the y-axis, and the Up-Down direction is the z-axis.   Recall that x maps to the imaginary i axis, y to j, and to z to k.  We can see that this is a right-handed coordinate system; if you position your right hand such that, without changing it&#039;s orientation, your extended fingers point in the plus x direction (East) and flexing your fingers point them in the plus y direction (North), then extending your thumb, in the plane of your palm and perpendicular to you fingers, points it in the plus z direction (Up).  Default angles of rotation are defined in radians, from -π (-pi) to π (pi); that is, we can rotate counter-clockwise (in the positive direction - rotating from plus x axis (East) through the plus y axis (North) to the minus x axis (West)) half-way around, or in the clockwise (negative - rotating from plus x axis (East) through minus y axis (South) to minus x axis (West)) direction half-way around, with the two directions giving the same physical result at a rotation angle of 3.141 radians or 180 degrees.  Thus a counter-clockwise rotation of a face pointing West, around the z axis by 90 degrees (to point South) is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0, 0, 0.707, 0.707&amp;gt;&lt;br /&gt;
&lt;br /&gt;
since the sine and cosine of π/4 (half of the rotation angle) are both 1/2&amp;lt;sup&amp;gt;0.5&amp;lt;/sup&amp;gt;.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:example_rotation.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Continuing around to point East is either&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0, 0, 1, 0&amp;gt; or &amp;lt;0, 0, -1, 0&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tilting an object to the right (that is, rotating it counter-clockwise around the x-axis) by e.g. 90 degrees is described by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0.707, 0, 0, 0.707&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and pitching forward (clockwise around the y-axis) by the same amount is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0, -0.707, 0, 0.707&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to note that the mapping of a single vector does not uniquely specify the corresponding quaternion rotation.  For example, in the figure below we see a number of ways to rotate the x axis into the y axis.  Different rotations result in different final orientations of the orthogonal (y and z) directions.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Alternate_rotations.jpg]]&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Return/ru&amp;diff=1180219</id>
		<title>Return/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Return/ru&amp;diff=1180219"/>
		<updated>2013-07-20T12:13:30Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: color&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|}}{{LSLC|Types||{{#var:lang}}}}{{LSLC|Types}}&lt;br /&gt;
{{LSLC|Keywords}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:name|return&lt;br /&gt;
}}{{#vardefine:p_value_desc| Возвращаемое функцией значение или переменная, тип должен быть тем же, что возвращается функцией.&lt;br /&gt;
}}{{#vardefine:header_title|{{return}} {{LSL Param|value}};&lt;br /&gt;
}}{{#vardefine:header_text|{{{!}}&lt;br /&gt;
{{LSL DefineRow|{{BlueText|type}}|{{value}}|{{#var:p_value_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
Используется для исполнения возврата  в предыдущую область видимости вместе со значением.&lt;br /&gt;
===Функции===&lt;br /&gt;
:Выход из функции и продолжение выполнения скрипта в предыдущей области видимости. &lt;br /&gt;
===События===&lt;br /&gt;
:Предпосылка скрипта к падению. События не могут возвращать значения. Используйте следующую форму ключевого слова вместо этой.&lt;br /&gt;
}}{{#vardefine:constants_nb|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;{{return}};&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Используется для преждевременного возврата выполнения в предыдущую область видимости перед достижением окончания функции/события.&lt;br /&gt;
Нет потребности использовать в конце события или функции, так как предполагается завершение компилятором.&lt;br /&gt;
===Функции===&lt;br /&gt;
:Выход из функции и продолжение выполнения скрипта в предыдущей области видимости. &lt;br /&gt;
===События===&lt;br /&gt;
:Выход из событий и удаление из очереди событий. Если есть еще одно событие в очереди - оно срабатывает.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}{{#vardefine:examples|&#039;&#039;&#039;Примеры&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer Goodbye()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;Goodbye&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Hello()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer Calc (string cmd, integer a, integer b)&lt;br /&gt;
{&lt;br /&gt;
    // Пользовательская функция была объявлена ​​как возвращающая integer,&lt;br /&gt;
    // следовательно каждый возврат функции должен возвращать integer&lt;br /&gt;
&lt;br /&gt;
    if (cmd == &amp;quot;+&amp;quot;)    return a + b;&lt;br /&gt;
    // Нет нужды здесь в коде &#039;else&#039;, так как предыдущий оператор привел к &#039;return&#039; при &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if (cmd == &amp;quot;-&amp;quot;)    return a - b;&lt;br /&gt;
    if (cmd == &amp;quot;*&amp;quot;)    return a * b;&lt;br /&gt;
    if (cmd == &amp;quot;/&amp;quot;)    return a / b;&lt;br /&gt;
    // Нужно возвращать значение и здесь, мы не можем опустить окончательного return (возвращения)&lt;br /&gt;
&lt;br /&gt;
    return -1;   &lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, llList2CSV ( [ Calc(&amp;quot;+&amp;quot;,1,2), Calc (&amp;quot;-&amp;quot;,5,3), Calc (&amp;quot;*&amp;quot;,3,4), Calc(&amp;quot;/&amp;quot;,18,6) ] ) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}{{#vardefine:notes|&lt;br /&gt;
}}{{#vardefine:caveats|&#039;&#039;&#039;Предостережения&#039;&#039;&#039;&lt;br /&gt;
* Есть ошибка в компиляторе и это позволит вам возвращать значение с событиями, которые при конфликте во время выполнения приведут скрипт к падению.&lt;br /&gt;
** Не пытайтесь возвращать значение в области видимости событи - если не хотите получать падения скрипта.&lt;br /&gt;
}}{{#vardefine:helpers|&lt;br /&gt;
}}{{#vardefine:also_header|&#039;&#039;См.также&#039;&#039; &lt;br /&gt;
&amp;lt;h3&amp;gt;Ключевые слова&amp;lt;/h3&amp;gt;&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow||[[jump/ru|jump]]|}}&lt;br /&gt;
{{LSL DefineRow||[[state/ru|state]]|}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}{{#vardefine:also_footer|&lt;br /&gt;
}}{{#vardefine:also_functions|&lt;br /&gt;
}}{{#vardefine:also_events|&lt;br /&gt;
}}{{#vardefine:also_articles|&lt;br /&gt;
}}{{#vardefine:also_tests|&lt;br /&gt;
}}{{#vardefine:location|&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Flow Control}}&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Return/ru&amp;diff=1180217</id>
		<title>Return/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Return/ru&amp;diff=1180217"/>
		<updated>2013-07-20T12:09:05Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: color&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|}}{{LSLC|Types||{{#var:lang}}}}{{LSLC|Types}}&lt;br /&gt;
{{LSLC|Keywords}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:name|return&lt;br /&gt;
}}{{#vardefine:p_value_desc| Возвращаемое функцией значение или переменная, тип должен быть тем же, что возвращается функцией.&lt;br /&gt;
}}{{#vardefine:header_title|{{LSL Param|return}} {{LSL Param|value}};&lt;br /&gt;
}}{{#vardefine:header_text|{{{!}}&lt;br /&gt;
{{LSL DefineRow|{{BlueText|type}}|{{value}}|{{#var:p_value_desc}}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
Используется для исполнения возврата  в предыдущую область видимости вместе со значением.&lt;br /&gt;
===Функции===&lt;br /&gt;
:Выход из функции и продолжение выполнения скрипта в предыдущей области видимости. &lt;br /&gt;
===События===&lt;br /&gt;
:Предпосылка скрипта к падению. События не могут возвращать значения. Используйте следующую форму ключевого слова вместо этой.&lt;br /&gt;
}}{{#vardefine:constants_nb|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;return;&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Используется для преждевременного возврата выполнения в предыдущую область видимости перед достижением окончания функции/события.&lt;br /&gt;
Нет потребности использовать в конце события или функции, так как предполагается завершение компилятором.&lt;br /&gt;
===Функции===&lt;br /&gt;
:Выход из функции и продолжение выполнения скрипта в предыдущей области видимости. &lt;br /&gt;
===События===&lt;br /&gt;
:Выход из событий и удаление из очереди событий. Если есть еще одно событие в очереди - оно срабатывает.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}{{#vardefine:examples|&#039;&#039;&#039;Примеры&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer Goodbye()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;Goodbye&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Hello()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;Hello&amp;quot;);&lt;br /&gt;
    return;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer Calc (string cmd, integer a, integer b)&lt;br /&gt;
{&lt;br /&gt;
    // Пользовательская функция была объявлена ​​как возвращающая integer,&lt;br /&gt;
    // следовательно каждый возврат функции должен возвращать integer&lt;br /&gt;
&lt;br /&gt;
    if (cmd == &amp;quot;+&amp;quot;)    return a + b;&lt;br /&gt;
    // Нет нужды здесь в коде &#039;else&#039;, так как предыдущий оператор привел к &#039;return&#039; при &amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if (cmd == &amp;quot;-&amp;quot;)    return a - b;&lt;br /&gt;
    if (cmd == &amp;quot;*&amp;quot;)    return a * b;&lt;br /&gt;
    if (cmd == &amp;quot;/&amp;quot;)    return a / b;&lt;br /&gt;
    // Нужно возвращать значение и здесь, мы не можем опустить окончательного return (возвращения)&lt;br /&gt;
&lt;br /&gt;
    return -1;   &lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, llList2CSV ( [ Calc(&amp;quot;+&amp;quot;,1,2), Calc (&amp;quot;-&amp;quot;,5,3), Calc (&amp;quot;*&amp;quot;,3,4), Calc(&amp;quot;/&amp;quot;,18,6) ] ) );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}{{#vardefine:notes|&lt;br /&gt;
}}{{#vardefine:caveats|&#039;&#039;&#039;Предостережения&#039;&#039;&#039;&lt;br /&gt;
* Есть ошибка в компиляторе и это позволит вам возвращать значение с событиями, которые при конфликте во время выполнения приведут скрипт к падению.&lt;br /&gt;
** Не пытайтесь возвращать значение в области видимости событи - если не хотите получать падения скрипта.&lt;br /&gt;
}}{{#vardefine:helpers|&lt;br /&gt;
}}{{#vardefine:also_header|&#039;&#039;См.также&#039;&#039; &lt;br /&gt;
&amp;lt;h3&amp;gt;Ключевые слова&amp;lt;/h3&amp;gt;&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow||[[jump/ru|jump]]|}}&lt;br /&gt;
{{LSL DefineRow||[[state/ru|state]]|}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}{{#vardefine:also_footer|&lt;br /&gt;
}}{{#vardefine:also_functions|&lt;br /&gt;
}}{{#vardefine:also_events|&lt;br /&gt;
}}{{#vardefine:also_articles|&lt;br /&gt;
}}{{#vardefine:also_tests|&lt;br /&gt;
}}{{#vardefine:location|&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Flow Control}}&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Value&amp;diff=1180214</id>
		<title>Template:Value</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Value&amp;diff=1180214"/>
		<updated>2013-07-20T12:03:03Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: magenta; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;value&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: magenta; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;value&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Return&amp;diff=1180213</id>
		<title>Template:Return</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Return&amp;diff=1180213"/>
		<updated>2013-07-20T12:01:30Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;font-size:150%; background: #yellow; color: blue; vertical-align: top; text-align: left; &amp;quot; class=&amp;quot;text&amp;quot;&amp;gt;&#039;&#039;&#039;return&#039;&#039;&#039;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Quaternion&amp;diff=1180211</id>
		<title>Quaternion</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Quaternion&amp;diff=1180211"/>
		<updated>2013-07-20T11:57:53Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: /* quaternion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#vardefine:ml-cat|/LSL}}{{Help |Glossary=*}}&lt;br /&gt;
{{LSL Header}}{{LSLC|Types}}{{LSLC|Keywords|quaternion}}&lt;br /&gt;
=={{quaternion}}==&lt;br /&gt;
&lt;br /&gt;
{{quaternion}} is a keyword supported by the LSL compiler that means the same thing as, and is interchangeable with, &amp;lt;code&amp;gt;{{LSLG|rotation}}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Definition and Properties: ==&lt;br /&gt;
&lt;br /&gt;
Quaternions are a generalization of complex numbers, invented by William Rowan Hamilton in the mid-19th century.   Recall that a complex number is the sum of an ordinary real number a and an imaginary number bi, where i is defined by:&lt;br /&gt;
&lt;br /&gt;
i&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = -1&lt;br /&gt;
&lt;br /&gt;
To construct a quaternion we introduce additional generalized imaginary units j and k with the assumptions:&lt;br /&gt;
&lt;br /&gt;
j&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = -1;    k&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = -1;    ijk = -1&lt;br /&gt;
&lt;br /&gt;
From these basic definitions it is easy to derive the multiplication relations for these generalized imaginary quantities:&lt;br /&gt;
&lt;br /&gt;
ij = k;     jk = i;    ki = j&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
ji = -k;     kj = -i;    ik = -j&lt;br /&gt;
&lt;br /&gt;
That is, the multiplication of quaternions is not commutative.  While non-commutative operations are now a familiar feature of matrix algebra and vector and tensor analysis, at the time of their invention the idea was radical.  &lt;br /&gt;
&lt;br /&gt;
A quaternion is then a number of the form&lt;br /&gt;
&lt;br /&gt;
Q = a + bi + cj + dk&lt;br /&gt;
&lt;br /&gt;
where a,b, and c are ordinary real numbers.  Adding quaternions is easy enough; one just adds the corresponding multipliers:&lt;br /&gt;
&lt;br /&gt;
(a + bi + cj + dk) + (e + fi + gj + hk) = ( a+e) + (b+f)i + (c+g)j + (d+h)k&lt;br /&gt;
&lt;br /&gt;
The result of multiplying two quaternions can be worked out using the product relations above, remembering to preserve the order of terms in i,j,k since the imaginary units do not commute.  &lt;br /&gt;
&lt;br /&gt;
QR = (a + bi + cj + dk)(e + fi + gj + hk) =&lt;br /&gt;
&lt;br /&gt;
ae + afi + agj + ahk +&lt;br /&gt;
bei - bf + bgij + bhik +&lt;br /&gt;
cej + cfji - cg + chjk  +&lt;br /&gt;
dek + dfki + dgkj - dh&lt;br /&gt;
&lt;br /&gt;
=&lt;br /&gt;
ae + afi + agj + ahk +&lt;br /&gt;
bei - bf + bgk - bhj +&lt;br /&gt;
cej - cfk - cg + chi  +&lt;br /&gt;
dek + dfj - dgi - dh&lt;br /&gt;
&lt;br /&gt;
= (ae - bf - cg - dh) + (af + be + ch - dg)i + (ag -bh + ce + df)j + (ah + bg - cf + de)k&lt;br /&gt;
&lt;br /&gt;
(And you thought multiplying complex numbers was a mess!)&lt;br /&gt;
&lt;br /&gt;
Now, we can define the analog of a complex conjugate (we&#039;ll use the * notation but other notations are also common):&lt;br /&gt;
&lt;br /&gt;
Q*= a - bi - cj - dk&lt;br /&gt;
&lt;br /&gt;
The product of a quaternion and its conjugate is:&lt;br /&gt;
                                         &lt;br /&gt;
QQ* = (a + bi + cj + dk)(a - bi - cj - dk) =&lt;br /&gt;
&lt;br /&gt;
= (a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + b&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + d&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) + (-ab + ba - cd + dc)i + (-ac + bd + ca - db)j + (-ad - bc + cb + da)k&lt;br /&gt;
&lt;br /&gt;
= (a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + b&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + d&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
which looks rather like the square of a Euclidean length.  If we regard the triplet (b,c,d) as a vector V, we can rewrite this squared length as:&lt;br /&gt;
&lt;br /&gt;
QQ* = a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + ||V||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first term, a, is thus often referred to as the scalar or sometimes the real part of the quaternion, and the triplet (b,c,d) as the vector part.&lt;br /&gt;
&lt;br /&gt;
== Quaternions and Rotations: ==&lt;br /&gt;
&lt;br /&gt;
The reason we care about quaternions is that Second Life uses them to represent rotations.  How is this done?  Consider the quaternion representation of a vector V = (b,c,d),  which is just a quaternion with a zero real part:&lt;br /&gt;
&lt;br /&gt;
Q(V) = 0 + bi + cj + dk  &lt;br /&gt;
&lt;br /&gt;
If we multiply Q by some other quaternion, in general we will get a non-zero real part; that is, we&#039;ve transformed the vector into a non-vector quaternion, which doesn&#039;t look at all like a rotation.  However, if we multiply on one side by a quaternion z, and on the other side by the multiplicative inverse of z, z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;, we will get a result with a 0-value real part:&lt;br /&gt;
&lt;br /&gt;
Re[zQ(V)z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;]  = 0&lt;br /&gt;
&lt;br /&gt;
-- that is, we&#039;ll map a vector into a vector.  To see that this is so, note that from the formula for multiplication, the real part of the product of two quaternions is invariant to the order of multiplication, that is:&lt;br /&gt;
&lt;br /&gt;
Re[QR] = Re[RQ].&lt;br /&gt;
&lt;br /&gt;
So we can invert the order of the first and (second*third) quaternions in the mapping without changing the real part:&lt;br /&gt;
&lt;br /&gt;
Re[z(Q(V)z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;)]  = Re[(Q(V)z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;)z]  = Re[Q(V)(z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;z)]  = 0&lt;br /&gt;
&lt;br /&gt;
since quaternion multiplication is associative and we assumed that Q has a zero-value real part.  This operation of left-multiplying by a quaternion and right-multiplying by its inverse is known as conjugation by z.  Readers familiar with matrix algebra will recognize it as similar to the decomposition of a matrix into a rotation and a pure scaling (a diagonal matrix).  &lt;br /&gt;
&lt;br /&gt;
Under what conditions does conjugation of a quaternion give back the original quaternion?&lt;br /&gt;
&lt;br /&gt;
zQz&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;  = Q  implies   zQ = Qz&lt;br /&gt;
&lt;br /&gt;
(which can be easily shown by right-multiplying the first expression by z).  When do quaternions commute?  From the expression for the product of two quaternions, recalling that the real parts commute in general, we have for example for the part multiplying i:&lt;br /&gt;
&lt;br /&gt;
(af + be + ch - dg)i + ... =  (eb+ fa + gd - hc)i + ...&lt;br /&gt;
&lt;br /&gt;
in the case where multiplication is commutative.  This can only be true if ch - dg = 0 or c/d = g/h: that is, the slope of the vector part in the (j,k) plane is the same for both quaternions.  Since there&#039;s nothing special about i, this must also be true of the (i,j) and (i,k) planes: that is, the two quaternions must have vector parts that point in the same direction, or in other words, that are collinear.&lt;br /&gt;
&lt;br /&gt;
It&#039;s not too hard to show that conjugation is also linear (that is, the conjugate of the sum is the sum of the conjugates), and it&#039;s easy to see that the length of the vector part of Q is preserved under conjugation.  What sort of length-conserving linear transformation preserves a vector only when its axis coincides with the vector?  Why -- a rotation, of course.  So conjugation of Q by z is equivalent to rotating the vector part of Q around the axis defined by the vector part of z.  &lt;br /&gt;
&lt;br /&gt;
Let&#039;s try a simple case.  Consider the vector V = (1,0,0) and corresponding quaternion Q = 0 + i.  To rotate around the z-axis we need a quaternion z of the form a + ck.  The conjugation is then:&lt;br /&gt;
&lt;br /&gt;
Q&#039; = (a+c k)(i)(a + ck)&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What is the inverse of z? It&#039;s easy to see that if we choose a and c so that the length of the quaternion is 1, then the inverse is equal to the conjugate:&lt;br /&gt;
&lt;br /&gt;
len(z) = 1 = zz*  implies  z* = z&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
so we can write:&lt;br /&gt;
&lt;br /&gt;
Q&#039; = (a+c k)(i)(a - ck) = (a+c k)(ai  + cj) = a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;i + acj + caj - c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;i  = ( a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;- c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)i + 2acj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with the constraint:&lt;br /&gt;
&lt;br /&gt;
a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+ c&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;  = 1  &lt;br /&gt;
&lt;br /&gt;
implying that we can write  a = cos(θ/2), b = sin(θ/2)  for some angle θ   (the reason for the factor of 1/2 will become clear in a moment).&lt;br /&gt;
&lt;br /&gt;
Now, the terms in i and j become respectively:&lt;br /&gt;
&lt;br /&gt;
cos&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(θ/2) - sin&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;(θ/2) = cos(θ)&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
2 cos(θ/2) sin(θ/2) = sin(θ)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So this indeed represents a rotation of the k (z) axis by the angle θ.  We can infer that in the general case, to rotate a vector V around an axis A= (b,c,d)  (presumed normalized, that is ||A|| = 1) by an angle θ, we construct the quaternion&lt;br /&gt;
&lt;br /&gt;
z = cos(θ/2) + sin(θ/2)A = cos(θ/2) + sin(θ/2){bi + cj + dk}&lt;br /&gt;
&lt;br /&gt;
and then conjugate the quaternion Q = 0 + V with z :&lt;br /&gt;
&lt;br /&gt;
Q&#039; = zQz*&lt;br /&gt;
&lt;br /&gt;
from which we extract the vector part:&lt;br /&gt;
&lt;br /&gt;
Q&#039; = 0 + V&#039;&lt;br /&gt;
&lt;br /&gt;
V&#039; being the rotated vector V.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In Second Life, quaternions representing rotations are given as four floating point numbers.  The first three are the vector part, and the last is the scalar part:  Q = &amp;lt;Q.x, Q.y, Q.z, Q.s&amp;gt;.  In terms of Second Life region directions, the East-West direction is the x-axis, the North-South direction is the y-axis, and the Up-Down direction is the z-axis.   Recall that x maps to the imaginary i axis, y to j, and to z to k.  We can see that this is a right-handed coordinate system; if you position your right hand such that, without changing it&#039;s orientation, your extended fingers point in the plus x direction (East) and flexing your fingers point them in the plus y direction (North), then extending your thumb, in the plane of your palm and perpendicular to you fingers, points it in the plus z direction (Up).  Default angles of rotation are defined in radians, from -π (-pi) to π (pi); that is, we can rotate counter-clockwise (in the positive direction - rotating from plus x axis (East) through the plus y axis (North) to the minus x axis (West)) half-way around, or in the clockwise (negative - rotating from plus x axis (East) through minus y axis (South) to minus x axis (West)) direction half-way around, with the two directions giving the same physical result at a rotation angle of 3.141 radians or 180 degrees.  Thus a counter-clockwise rotation of a face pointing West, around the z axis by 90 degrees (to point South) is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0, 0, 0.707, 0.707&amp;gt;&lt;br /&gt;
&lt;br /&gt;
since the sine and cosine of π/4 (half of the rotation angle) are both 1/2&amp;lt;sup&amp;gt;0.5&amp;lt;/sup&amp;gt;.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:example_rotation.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Continuing around to point East is either&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0, 0, 1, 0&amp;gt; or &amp;lt;0, 0, -1, 0&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tilting an object to the right (that is, rotating it counter-clockwise around the x-axis) by e.g. 90 degrees is described by:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0.707, 0, 0, 0.707&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and pitching forward (clockwise around the y-axis) by the same amount is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0, -0.707, 0, 0.707&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to note that the mapping of a single vector does not uniquely specify the corresponding quaternion rotation.  For example, in the figure below we see a number of ways to rotate the x axis into the y axis.  Different rotations result in different final orientations of the orthogonal (y and z) directions.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Alternate_rotations.jpg]]&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Float/ru&amp;diff=1180209</id>
		<title>Float/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Float/ru&amp;diff=1180209"/>
		<updated>2013-07-20T11:54:10Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|Types||{{#var:lang}}}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
К типу данных с плавающей точкой относятся 32-битные числа в &#039;&#039;&#039;IEEE-754&#039;&#039;&#039; форме, то есть числа с плавающей точкой относятся к вещественному типу.&lt;br /&gt;
Если Вам нужна десятичная точка в своём числе, то примените вещественный тип чисел [[float/ru|{{float}}]]. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений в пределах от &#039;&#039;&#039;1.175494351E-38&#039;&#039;&#039; до &#039;&#039;&#039;3.402823466E+38&#039;&#039;&#039; .&lt;br /&gt;
&lt;br /&gt;
Они могут быть указаны в научной нотации, наподобие &#039;&#039;&#039;2.6E-5&#039;&#039;&#039; .&lt;br /&gt;
&lt;br /&gt;
Если функция требует плавающую точку в качестве параметра, и число является целым числом (например, 5), то не забудьте добавить &#039;&#039;&#039;.0&#039;&#039;&#039; - так создается  {{float}} (в нашем примере, 5.0).&lt;br /&gt;
&lt;br /&gt;
Если вы делите 2 константы, не забудьте определить их вещественными числами, иначе ваш результат может получить округление. А еще лучше, вычислять математику на калькуляторе и сохранить на сервере несколько циклов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Пример ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;float min = 1.175494351E-38;&lt;br /&gt;
float max = 3.402823466E+38;&lt;br /&gt;
float sci = 2.6E-5;&lt;br /&gt;
float sci_a = 2.6E+3;&lt;br /&gt;
float sci_b = 2.6E3;&lt;br /&gt;
float sci_c = 26000.E-1;&lt;br /&gt;
float f = 2600;//неявное приведение к типу &#039;float&#039;&lt;br /&gt;
float E = 85.34859;&lt;br /&gt;
float cast = (float)&amp;quot;42&amp;quot;;//явное приведение к типу &#039;float&#039;&lt;br /&gt;
float Infintity = (float)&amp;quot;inf&amp;quot;; //-- могут быть отрицательными, приведет к ошибке, если математика оценивалась в LSO, см. &#039;предостережения&#039; ниже&lt;br /&gt;
float NotANumber = (float)&amp;quot;nan&amp;quot;; //-- могут быть отрицательными, приведет к ошибке, если математика оценивалась в LSO, см. &#039;предостережения&#039; ниже&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== Полезные фрагменты ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Если вам нужно для проверки произвольных &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; без ограничений, то следующая функция идеально здесь подходит:&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer isValidFloat(string s) { return (string)((float)s) != (string)((float)(&amp;quot;-&amp;quot; + llStringTrim(s, STRING_TRIM_HEAD))); }&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем не менее, следующий фрагмент более эффективен, но проходит с отмеченными оговорками. Если это не проблема для Вас, то это рекомендуемый вариант, особенно в режиме скрипта &#039;&#039;&#039;Mono&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer isValidFloat(string s) { return (float)(s + &amp;quot;1&amp;quot;) != 0.0; }&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Предостережения&#039;&#039;&#039;:&lt;br /&gt;
* Под LSO-LSL   научная нотация (экспоненциальная) с показателем больше 38 не удаётся (вкрадывается математическая ошибка). &#039;&#039;&#039;Mono&#039;&#039;&#039; не влияет, так как поддерживает &amp;lt;code&amp;gt;infinity&amp;lt;/code&amp;gt;&lt;br /&gt;
* Под &#039;&#039;&#039;Mono&#039;&#039;&#039; и LSO-LSL вы можете обнаружить странные результаты, если имеете дело со строкой содержащей более 9 знаков после запятой. Помните, что приведение (распределение)  строки в LSL дает только до 6 знаков безопасно, и вследствие человеческого фактора редко будет точной, но также малые значения обычно не все, что полезно.&lt;br /&gt;
* &amp;quot;nan&amp;quot;, &amp;quot;inf&amp;quot; и их негативы есть специальными значениями текста, которые можно привести из строки (с любым пробелами или конечными символами). Это значение приведет к математической ошибке, когда переменная оценивается в LSO. Если Вы разбираете пользовательские данные, путем приведения строки в обращении, используйте следующий код (заменив vStrDta с вашим именем переменной String) см. [https://jira.secondlife.com/browse/SVC-6847 SVC-6847]&lt;br /&gt;
** &amp;lt;lsl&amp;gt;(float)llList2String( llParseStringKeepNulls( llToLower( llStringTrim( vStrDta, STRING_TRIM ) ), [&amp;quot;inf&amp;quot;, &amp;quot;nan&amp;quot;], [] ), 0 )&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Float-to-String ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Есть несколько способов преобразования с {{float}} в {{strings}}. Первый - приведение в строку ({{strings}})({{MagentaText|1.0}}), что, однако, имеет недостаток округления и ограничивается до шести знаков после точки. Некоторые функции были написаны для обеспечения больших возможностей. Они делятся на две категории, без потерь (&#039;&#039;&#039;Lossless functions&#039;&#039;&#039;) и с потерями (&#039;&#039;&#039;Lossy functions&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|+ Функции с потерями (Lossy functions)&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! Название &lt;br /&gt;
! title=&amp;quot;Infinity / NaN support&amp;quot; {{!}} inf/nan&lt;br /&gt;
! Округление&lt;br /&gt;
! Сокращение&lt;br /&gt;
! Пояснения&lt;br /&gt;
|-&lt;br /&gt;
| Typecast&lt;br /&gt;
| Да&lt;br /&gt;
| Да&lt;br /&gt;
| Нет&lt;br /&gt;
| &amp;lt;code&amp;gt;(float)float_value&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;дает только в режиме &amp;quot;&#039;&#039;&#039;Mono&#039;&#039;&#039;&amp;quot; скрипта  [https://jira.secondlife.com/browse/SCR-397?focusedCommentId=340847&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-340847 6 знаков точности].&lt;br /&gt;
|-&lt;br /&gt;
| [[Format Decimal]]&lt;br /&gt;
| Нет&lt;br /&gt;
| Да&lt;br /&gt;
| Нет&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[Float2String]]&lt;br /&gt;
| Нет&lt;br /&gt;
| Да&lt;br /&gt;
| Да&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|+ Функции без потерь (Lossless functions)&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! Название &lt;br /&gt;
! Скорость&lt;br /&gt;
! Обратимость&lt;br /&gt;
! title=&amp;quot;Infinity / NaN support&amp;quot; {{!}} inf/nan support&lt;br /&gt;
! [[PI]]  [[PI/ru|PI]]&lt;br /&gt;
! Пояснения&lt;br /&gt;
|-&lt;br /&gt;
| [[Float2Hex]]&lt;br /&gt;
| Быстрая&lt;br /&gt;
| &amp;lt;code&amp;gt;(float)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Нет&lt;br /&gt;
| 0x6487ED5p-25&lt;br /&gt;
| Поскольку выход в шестнадцатеричной научной записи, это не совсем визуально читабельно.&lt;br /&gt;
|-&lt;br /&gt;
| [[Float2Sci]]&lt;br /&gt;
| Медленная&lt;br /&gt;
| &amp;lt;code&amp;gt;(float)&amp;lt;/code&amp;gt;&lt;br /&gt;
| Нет&lt;br /&gt;
| 3.1415925&lt;br /&gt;
| Полезно, если вы хотите, чтобы результат был без потерь и визуально читабельный, происходит за счет низкой скорости.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Strife_Onizuka/Float_Functions#Base64-Float|FUIS]]&lt;br /&gt;
| Быстрейшая&lt;br /&gt;
| [[User:Strife_Onizuka/Float_Functions#Base64-Float|SIUF]]&lt;br /&gt;
| Нет&lt;br /&gt;
| &amp;quot;QEkP2g&amp;quot;&lt;br /&gt;
| Вовсе не читабельно. Гарантированно всегда  использование шести символов.&lt;br /&gt;
|}&lt;br /&gt;
*Infinity (бесконечность) доступна только в &#039;&#039;&#039;Mono&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
== См. также ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Статьи&#039;&#039;&#039;&lt;br /&gt;
*LSL Примеры: [[Format_Decimal|Format Decimal]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Strings&amp;diff=1180208</id>
		<title>Template:Strings</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Strings&amp;diff=1180208"/>
		<updated>2013-07-20T11:52:07Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #eeeeee; color: green; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;string&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Strings&amp;diff=1180206</id>
		<title>Template:Strings</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Strings&amp;diff=1180206"/>
		<updated>2013-07-20T11:50:53Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #dddddd; color: green; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;string&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Strings&amp;diff=1180205</id>
		<title>Template:Strings</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Strings&amp;diff=1180205"/>
		<updated>2013-07-20T11:47:07Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: green; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;string&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: green; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;string&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Rotation/ru&amp;diff=1180204</id>
		<title>Rotation/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Rotation/ru&amp;diff=1180204"/>
		<updated>2013-07-20T11:36:20Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: /* Вращение(Rotation). */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|Types||{{#var:lang}}}}&lt;br /&gt;
&lt;br /&gt;
См. также [[:Category:LSL_Text|Text]].&lt;br /&gt;
== Вращение ({{greenText|rotation}}). ==&lt;br /&gt;
Тип &#039;&#039;&#039;вращение&#039;&#039;&#039; ( {{greenText|rotation}} ) в LSL является одним из нескольких способов представления ориентации в 3D-проостранстве - трехмерном пространстве. (Обратите внимание, что мы пытаемся написать имя типа в &#039;&#039;&#039;жирном&#039;&#039;&#039;.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вращение&#039;&#039;&#039; ({{rotation}})  можно рассматривать как дискретный поворот в трехмерном пространстве, и как ориентацию объекта так, насколько много он обернулся вокруг любых осей, которые мы используем - обычно осей региона.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Математический объект вызывает {{LSLG|quaternion}} ({{LSLG|кватернион}}). Вы можете представлять кватернион в виде четырех чисел, три из которых представляют направление объекта, а четвертое - крен объекта влево или вправо вокруг этого направления.Основным преимуществом использования кватернионов является то, что они не восприимчивы к [http://en.wikipedia.org/wiki/Gimbal_Lock блокировке вращения].&lt;br /&gt;
Для комплексной внутренней работы с кватернионной математикой - см. {{LSLG|quaternion|кватернион}}.&lt;br /&gt;
Список функций и событий, связанных с вращениями, см. {{LSLG|LSL Rotation Synopsis|краткий обзор LSL-вращения (rotation)}}.&lt;br /&gt;
Существует также информация о вызывании текстурных вращений в {{LSLG|texture|текстуры}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
{{whiteText|Пример:}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation R = &amp;lt;1.23, 0.0, 4.56, 1.0&amp;gt;;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_name_desc|variable name&lt;br /&gt;
}}{{#vardefine:p_value_desc|string expression or constant&lt;br /&gt;
}}{{#vardefine:p_value_t_desc|expression or constant&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Другие представления ==&lt;br /&gt;
=== Эйлера вектор ===&lt;br /&gt;
Другой способ представления Угол 3D использует три номера, &amp;lt;X, y, Z&amp;gt;, которые представляют собой сумму, объект поворачивается вокруг каждой оси. Это используется в окне редактирования, например, и, как правило, легко для людей, для визуализации. Легко регулировки вращения &amp;lt;x, y, z&amp;gt; номера в окне редактирования и посмотреть, как ведет себя объект. Обратите внимание, что в окне редактирования, цифры даны в градусах, то есть под прямым углом 90.&lt;br /&gt;
&lt;br /&gt;
В LSL, эти три угла выражены в [[радиан]] вместо градусов, то есть под прямым углом является PI / 2. (Радиан является своего рода очень толстый степени.)&lt;br /&gt;
Заметим, что эти три числа типа &amp;quot;вектор&#039;&#039; &#039;&#039;&#039;, а не типа&amp;quot; вращение&#039;&#039;&#039;&#039;&#039;, хотя это может представлять ту же информацию. Это называется&#039;&#039;&#039;&#039; Эйлера представление 3D углом. &#039;&#039; &#039;В LSL вращение вокруг Z делается, а затем вокруг у, и, наконец, вокруг X&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Оси плюс угол ===&lt;br /&gt;
При этом способе можно определить оси вращения, как определяющий ось, вокруг которой землей спины, и использовать его вместе с углом поворота вокруг оси, которая определяет величину поворота, чтобы дать&#039;&#039; &#039;вращение&#039;&#039;&#039; .&lt;br /&gt;
&lt;br /&gt;
Так что если вы хотите, чтобы определить &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; вокруг оси на 45 градусов в плоскости XY (North East в регионе координаты), вам нужно указать оси с тем же количеством х и у, но без каких-либо Z. Ось может быть &amp;lt;1.0, 1.0, 0.0&amp;gt;. Абсолютная величина числа, определяющие оси не имеют значения в этом представлении; &amp;lt;2.0, 2.0, 0.0&amp;gt; будет работать так же хорошо. Угол поворота отдельный номер задается в радианах, например. PI / 3 = 60 градусов. Вместе они определяют &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; глобальном 60 градусов по оси северо-востоке.&lt;br /&gt;
&lt;br /&gt;
Как Ось кватернионная плюс угол использует четыре цифры, но она не должна быть &amp;quot;нормальный&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== FWD, влево, вверх ===&lt;br /&gt;
Еще один способ для представления тех же 3D угол использовать три вектора, показывая, что фронт указывая на FWD (передний), что топ указывает на (вверх), и то, что с левой стороны указывает на (слева). На самом деле, только два из трех необходимы, потому что любые две определяет третий.&lt;br /&gt;
&lt;br /&gt;
По понятным причинам, такие как возможность легко комбинировать вращения, четыре версии, &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; кватернионов, лучше, хотя, возможно, сложнее для новичка, чтобы схватить. К счастью, это очень редко нужно делать ничего с фактическим внутренним представлением&#039;&#039;&#039;&#039; повороты и есть функции для преобразования легко переключаться между тремя типами LSL, а также между градусами и радианах.&lt;br /&gt;
&lt;br /&gt;
== Правилу правой руки ==&lt;br /&gt;
В LSL все вращения выполняется в соответствии с&#039;&#039; &#039;правилу правой руки&#039;&#039;&#039;. С правой стороны, расширить первого пальца в направлении положительного направления оси х. Расширение второй палец под прямым углом к ​​вашим первым пальцем, он будет указывать вдоль положительной оси, а большой палец, продлен по прямым углом как укажет вдоль положительной оси. При редактировании объекта, три цветных оси стрелки направлены в положительном направлении для каждой оси (X: красный, Y: зеленый, Z: синий).&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Right_hand_rule&lt;br /&gt;
&lt;br /&gt;
Теперь, не снимают правой рукой только все же, есть еще одно применение для него, определяющий направление положительного вращения. Сделать кулак правой рукой, большой палец простирался и указывая в положительном направлении оси вы заинтересованы Ваши пальцы локон вокруг в направлении положительного вращения. Вращений вокруг X, Y, Z и оси часто называют крен, тангаж, рыскание и, в частности, для транспортных средств.&lt;br /&gt;
&lt;br /&gt;
[Http://en.wikipedia.org/wiki/Tait-Bryan_angles ролл Шаг рыскания]&lt;br /&gt;
&lt;br /&gt;
== Объединение поворотов== &lt;br /&gt;
&#039;&lt;br /&gt;
Предположим, у вас есть два оборота. &#039;&#039;r1&#039;&#039; является поворот на 90 градусов влево, и &#039;&#039;r2&#039;&#039; Как вращаться на 30 градусов вправо. (Любые повороты будет работать, это всего лишь пример.)&lt;br /&gt;
Вы можете комбинировать &#039;&#039;r1&#039;&#039; и &#039;&#039;r2&#039;&#039;, чтобы сделать использование &#039;&#039;r3&#039;&#039; &#039;&#039;&#039;*&#039;&#039;&#039; оператора. Это действительно не умножать их, он &#039;&#039;сочиняет&#039;&#039; им.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
rotation R3 = R1 * R2;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат в этом случае является то, что&#039;&#039;&#039;&#039; R3 средства вращаются на 60 градусов влево.&lt;br /&gt;
&lt;br /&gt;
Другими словами, совместить&#039;&#039; &#039;вращения&#039;&#039;&#039;, можно использовать &amp;quot;многократно&#039;&#039; &#039;и&#039;&#039;&#039;&#039;&#039; разрыва&#039;&#039; &#039;операторов. Не пытайтесь использовать сложение или вычитание операторов на&#039;&#039; &#039;повороты&#039;&#039;&#039;, поскольку они не будут делать то, что вы ожидаете. Операция &amp;quot;умножения&#039;&#039; &#039;&#039;&#039; применяет вращение в положительном направлении, эксплуатация« разделяй&#039;&#039;&#039;&#039;&#039; означает отрицательный вращения. Вы также можете отрицать вращение непосредственно, просто свести на нет с компонентом, например, X.s = -X.s.&lt;br /&gt;
&lt;br /&gt;
В отличие от других типов, таких как {{LSLG | поплавок}}, порядок, в котором операции выполняются,&lt;br /&gt;
[Http://en.wikipedia.org/wiki/Commutative некоммутативную], имеет важное значение.&lt;br /&gt;
Причина этого проста: вы делаете заказ вращений в важно в RL. Например, если у Вас был дротик с четырьмя перьями, начал с вращением &amp;lt;0, 0, 0&amp;gt; с его хвостом о происхождении, он будет лежать на оси X с его точки направленные в положительном направлении X, его перья вдоль Z и Y оси и оси дротик и осей мир будет приведен в соответствие. Мы собираемся, чтобы повернуть его на 45 градусов вокруг X и 30 градусов вокруг Y, но в разной последовательности.&lt;br /&gt;
&lt;br /&gt;
Во-первых, после поворота 45 ° вокруг X дротик все равно будет по оси Х, неподвижная, просто повернулся вдоль его продольной оси, так что перьев будет на 45 градусов к оси. Тогда вращающийся 30 ° вокруг Y бы переместить его в плоскости XZ, чтобы указать на 30 градусов от оси X (вспомним правила правой руки для вращения означает небольшое положительное вращение вокруг Y перемещает точку вниз). Дарт ветров, направленная вверх 30 ° вниз, в одной вертикальной плоскости, это уже второй, но повернулся вокруг своей длинной оси так перья уже не вверх и вниз.&lt;br /&gt;
&lt;br /&gt;
Если вы сделали это в другую сторону, первая поворотная 30 град в Y, дротик будет вращаться вниз в плоскости XZ, но заметил, что она больше не находится на оси X, оси X и в мире не выровнены больше. Сейчас 45 градусов вращение вокруг оси X будет поворачивать вокруг своей дротик хвост, момент после 30 град конуса, ось которого вдоль положительной оси X мира, на 45 градусов вверх и вправо. Если вы искали вниз по оси X, было бы указывая поворота от 30 градусов ниже оси X, вверх и вправо, из плоскости XZ, до точки ниже первого квадранта в плоскости XY, перья, как это вращающийся пошли.&lt;br /&gt;
&lt;br /&gt;
Ясно, что это другой результат с первого вращения, но порядок ротации это единственное, что изменилось.&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать постоянной ротации необходимо определить&#039;&#039; &#039;вращения&#039;&#039;&#039; значение, которое может быть сделано путем создания LSLG {{|}} вектор с X, Y, Z углов в радианах в качестве компонентов (так называемый угол Эйлера) , то, что для преобразования&#039;&#039; &#039;вращения&#039;&#039;&#039; с помощью {{LSLG | llEuler2Rot}} функции. Чтобы перейти от вращения угол Эйлера {{LSLG | вектора}} {{использование LSLG | llRot2Euler}}.&lt;br /&gt;
&lt;br /&gt;
Если вы хотите осевого вращения вставке оси вращения и угол поворота в {{LSLG | llAxisAngle2Rot}} функция, и это вернется &amp;quot;вращение&#039;&#039; &#039;&#039;&#039;. Чтобы перейти от вращения Вернуться к оси и угла, используйте {{LSLG | llRot2Axis}} и {{LSLG | llRot2Angle}} соответственно.&lt;br /&gt;
&lt;br /&gt;
Можно попеременно создавать родной вращение непосредственно: реальная часть косинус половины угла поворота, а вектор часть нормированной оси вращения, умноженного на синус половины угла вращения.&lt;br /&gt;
&lt;br /&gt;
&#039;Примечание:&#039;&#039;&#039;&#039;&#039; углов в LSL даны в радианах, а не в градусах, но вы можете легко конвертировать с помощью встроенных констант [[# RAD_TO_DEG | RAD_TO_DEG]] и [[# DEG_TO_RAD | DEG_TO_RAD]]. Для &amp;quot;вращение&#039;&#039; &#039;30&#039;&#039; градусов вокруг оси X можно использовать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot30X&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llEuler2Rot]](&amp;lt;30, 0, 0&amp;gt; * [[DEG_TO_RAD]]);&lt;br /&gt;
||// convert the degrees to radians, then convert that [[vector]] into a rotation, rot30x&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |[[vector]] vec30X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llRot2Euler]](rot30X );&lt;br /&gt;
||// convert the rotation back to a [[vector]] (the values will be in radians)&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot30X&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llAxisAngle2Rot]](&amp;lt;1, 0, 0&amp;gt;, 30 * [[DEG_TO_RAD]]);&lt;br /&gt;
||// convert the degrees to radians, then convert into a rotation, rot30x&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Различия между кватернионам математики и LSL вращений ==&lt;br /&gt;
&lt;br /&gt;
Существуют некоторые различия между LSL и математике, которые имеют мало в то время как последствия сценария, но это может озадачить людей с предварительного математического знания. Поэтому мы подумали, что было бы хорошо, чтобы перечислить их здесь:&lt;br /&gt;
&lt;br /&gt;
* В LSL, все кватернионов нормированы (скалярное произведение&#039;&#039; &#039;R&#039;&#039;&#039; на&#039;&#039; &#039;R&#039;&#039;&#039; всегда&#039;&#039; &#039;1&#039;&#039; &#039;), и, следовательно, представляют собой способы для вращения объектов без изменения их размеров . В математике, общий кватернионов может быть не нормируется, и они представляют&#039;&#039;&#039;&#039; сродства, то есть способ, чтобы повернуть&#039;&#039; &#039;и&#039;&#039;&#039; изменения размера объектов.&lt;br /&gt;
* В LSL, термин&#039;&#039; &#039;с&#039;&#039;&#039; является четвертым членом вращения:&#039;&#039; &#039;&amp;lt;x, y, z, s&amp;gt;&#039;&#039;&#039;. В математике, термин&#039;&#039; &#039;с&#039;&#039;&#039;, которая также называется &amp;quot;реальная часть&amp;quot;, написана в качестве первой координаты кватернионов:&#039;&#039; &#039;(с, х, у, г)&#039;&#039;&#039;.&lt;br /&gt;
* Умножение написано в обратном порядке LSL и в математике. В LSL, вы должны написать&#039;&#039; &#039;R * S&#039;&#039;&#039;, где в математике можно было бы написать&#039;&#039; &#039;S. R&#039;&#039; &#039;.&lt;br /&gt;
&lt;br /&gt;
== Порядке ротации для векторов Эйлера ==&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, становится ясно, что при работе с вращений вокруг более одной оси, тем, как они сделали в критическое. В&#039;&#039;&#039;&#039; Эйлера обсуждения выше этого был отчасти умалчивается немного, отдельные повороты вокруг трех осей Определение общего вращения&#039;&#039;&#039;&#039;, но напрашивается вопрос: Что оси порядка вращениями сделано? Ответ&#039;&#039; &#039;Z, Y, X&#039;&#039;&#039; в глобальных координатах. Если вы пытаетесь, чтобы повернуть объект вокруг более одной оси одновременно использованием&#039;&#039;&#039;&#039; Эйлера представительства, определить правильный&#039;&#039;&#039;&#039; Эйлера {{LSLG | вектора}}, используя Z, Y, X порядке ротации, затем с помощью {{LSLG | llEuler2Rot}} функцию, чтобы получить&#039;&#039; &#039;вращение&#039;&#039;&#039; для использования в сочетании вращения или применение вращения к объекту.&lt;br /&gt;
&lt;br /&gt;
Местное == против глобального (Мир) вращений ==&lt;br /&gt;
&lt;br /&gt;
Важно провести различие между относительной &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; к миру, и относительная&amp;quot; вращение&#039;&#039;&#039;&#039;&#039; в местный самого объекта. В редакторе, вы можете переключаться с одного на другой. В скрипте, необходимо преобразовать из одного в другой, чтобы получить желаемое поведение.&lt;br /&gt;
&lt;br /&gt;
Вращений «Местные&#039;&#039; &#039;&#039;&#039; являются те сделали вокруг осей встроенный в сам объект вперед / назад, влево / вправо, вверх / вниз, независимо от того, вращается объект в мире. Вращений «Глобальный&#039;&#039; &#039;&#039;&#039; являются те, сделано во всем мире топоры, Север / Юг, Восток / Запад, Выше / Ниже. Вы можете увидеть разницу, вращая Prim, затем отредактировать его и изменить параметры осей между локальными и глобальными, обратите внимание, как цветные стрелки осей изменения.&lt;br /&gt;
&lt;br /&gt;
В LSL, разница между делают «местное&#039;&#039; &#039;&#039;&#039; или вращение&amp;quot; глобального&#039;&#039;&#039;&#039;&#039; порядок&#039;&#039; &#039;повороты&#039;&#039;&#039; оцениваются в заявлении.&lt;br /&gt;
&lt;br /&gt;
Это делает 30 градусов «местного&#039;&#039; &#039;&#039;&#039; вращения, поместив постоянной 30 градусов&#039;&#039;&#039; вращение&#039;&#039; &#039;слева от начала&#039;&#039; объекта&amp;quot; вращение&#039;&#039;&#039; (myRot). Это как первая операция в первом примере выше, просто скручивания дротик 30 градусов вокруг своей длинной оси.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation localRot = &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rot30X * myRot;&lt;br /&gt;
||// do a local rotation by multiplying a constant rotation by a world rotation&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вращения «глобальный&#039;&#039; &#039;&#039;&#039;, используйте&amp;quot; вращение&#039;&#039;&#039;&#039;&#039; же значения, но в обратном порядке. Это похоже на вторую операцию во втором примере, дротик вращающихся и вправо вокруг оси X мире. В этом случае существующий вращения (myRot) поворачивается на 30 градусов вокруг глобальной оси X.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation globalRot &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; | = myRot * rot30X;&lt;br /&gt;
||// do a global rotation by multiplying a world rotation by a constant rotation&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Еще один способ думать об объединении вращений ==&lt;br /&gt;
&lt;br /&gt;
Вы можете думать о «местных&#039;&#039; &#039;&#039;&#039; против этой разницы&#039;&#039;&#039; глобальной&#039;&#039; &#039;, считая, что&#039;&#039;&#039; повороты&#039;&#039; &#039;делается в оценке порядке, то есть слева направо, за исключением выражения в скобках.&lt;br /&gt;
&lt;br /&gt;
В localRot случае то, что произошло то, что, начиная с &amp;lt;0, 0, 0&amp;gt;, rot30X было сделано в первую очередь, вращающиеся Prim вокруг оси мира X, но, поскольку, когда он до вращения, локальных и глобальных осей одинаковы, то есть эффект делает вращение вокруг локальной оси X объекта. Тогда второй&#039;&#039; &#039;вращения&#039;&#039;&#039; myRot было сделано которая вращалась Prim в исходное вращение, но теперь с дополнительными оси вращения X запеченные дюйма, как это выглядит в том, что чопорная поворачиваться на месте, вокруг собственной оси X , с Y и Z вращения вращения неизменным,&#039;&#039; &#039;местные&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
В globalRot случае, опять начиная с &amp;lt;0, 0, 0&amp;gt;, первый объект вращается в исходное вращения (myRot), но теперь оси объекта и осей в мире больше не выровнены! Итак, &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; rot30x второй делает то, что сделал в локальном случае, вращается объект 30 градусов вокруг оси X мире, но эффект, чтобы повернуть объект через конус вокруг оси X, так как мир X объекта оси и оси Х в мире не то же самое это время. То, что это выглядит как то, что чопорные поворачивается на 30 градусов вокруг оси X мире, следовательно, вращение «глобальный&#039;&#039; &#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039; &#039;Отдел&#039;&#039;&#039; из&#039;&#039; &#039;вращения&#039;&#039;&#039; имеет эффект делает вращение в противоположном направлении, умножением на 330 градусов&#039;&#039; &#039;вращение&#039;&#039;&#039; такой же, как деление на 30 градусов&#039;&#039; &amp;quot;вращение&#039;&#039; &#039;.&lt;br /&gt;
&lt;br /&gt;
== Использование == Повороты&lt;br /&gt;
&lt;br /&gt;
Вы можете получить доступ к отдельным компонентам&#039;&#039; &#039;вращения&#039;&#039;&#039;&#039;&#039; &#039;R&#039;&#039;&#039; на&#039;&#039; &#039;Rx, Ry, Rz, R, S &amp;amp;&#039;&#039;&#039; (&#039;&#039; &#039;не&#039;&#039;&#039; Rw). Скалярная часть РС косинус половины угла поворота. Векторной части (Rx, Ry, Rz) есть произведение нормированных оси вращения, и на синус половины угла поворота. Вы можете создавать &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; обратной путем отрицания X, Y, Z членов (или, сделав значение с отрицательным). Как в стороне, вы можете также использовать &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; просто как хранилище [[поплавок]] значения,&amp;quot; вращение&#039;&#039;&#039;&#039;&#039; каждый магазинах четыре из них и [[Список]], состоящий из &#039; вращение&#039;&#039;&#039;&#039; &#039;является более эффективным, чем [[Список]], состоящий из [[поплавок]] ы, но есть накладные расходы в распаковывая их.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot30X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llEuler2Rot]](&amp;lt;30, 0, 0&amp;gt; * [[#DEG_TO_RAD|DEG_TO_RAD]] );&lt;br /&gt;
||// Create a rotation constant&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rotCopy &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rot30X;&lt;br /&gt;
||// Just copy it into rotCopy, it copies all 4 float components&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.x;&lt;br /&gt;
||// Get out the individual components of the rotation&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float Y &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.y;&lt;br /&gt;
||&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float Z &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.z;&lt;br /&gt;
||&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float S &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.s;&lt;br /&gt;
||&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation anotherCopy &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= &amp;lt;X, Y, Z, S&amp;gt;;&lt;br /&gt;
||// Make another rotation out of the components&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Существует встроенный в постоянном для нулевого&#039;&#039; &#039;вращения&#039;&#039;&#039; [[# ZERO_ROTATION | ZERO_ROTATION]], которые вы можете использовать прямо или, если вам нужно, чтобы инвертировать&#039;&#039; &#039;вращения R&#039;&#039;&#039;, разделите [[# ZERO_ROTATION | ZERO_ROTATION]] на&#039;&#039; &#039;R&#039;&#039;&#039;. В качестве напоминания сверху, это работает, первую вращающуюся в нулевое положение, то потому, что это пропасть, вращающихся в противоположном направлении к первоначальному&#039;&#039; &#039;вращения&#039;&#039;&#039;, тем самым делает обратное вращение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot330X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= &amp;lt;-rot30X.x, -rot30X.y, -rot30X.z, rot30X.s&amp;gt;;&lt;br /&gt;
||// invert a rotation - NOTE the s component isn&#039;t negated&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation another330X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[#ZERO_ROTATION|ZERO_ROTATION]] / rot30X;&lt;br /&gt;
||// invert a rotation by  division, same result as rot330X&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation yetanother330X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= &amp;lt;rot30X.x, rot30X.y, rot30X.z, -rot30X.s&amp;gt;;&lt;br /&gt;
||// not literally the same but works the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Одноместный или корневой Prims VS Связанные Prims против Вложения ==&lt;br /&gt;
&lt;br /&gt;
Причиной говорить о едином или связанных Prim вращений в том, что такие вещи, как двери на транспортные средства, желаемого движения является перемещение дверей относительно транспортного средства, независимо от того, что вращение общее транспортное средство. В то время как можно сделать это с глобальным вращений, было бы быстро расти утомительно.&lt;br /&gt;
Есть вообще три системы координат Prim может быть в: в полном одиночестве, часть {{LSLG |}} группы каналов или части LSLG {{|}} привязанности. Когда чопорная один, т.е. не является частью {{LSLG | группы каналов}}, он действует как росток чопорные, а когда она является частью {{LSLG | привязанности}}, он действует по-разному и немного нарушена.&lt;br /&gt;
&lt;br /&gt;
{{LSLRotGetSet}}&lt;br /&gt;
&lt;br /&gt;
== Вращающиеся векторы ==&lt;br /&gt;
&lt;br /&gt;
В LSL, вращая [[вектор]] очень полезно, если вы хотите переместить объект в дугу или окружность, когда центр вращения не центр объекта.&lt;br /&gt;
&lt;br /&gt;
Это звучит очень сложным, но гораздо меньше, чем кажется на первый взгляд. Помните, из вышеизложенного вращающихся [[# Объединение Повороты | дротик]], и заменить физические дротик с [[вектор]], происхождение которых хвост дротика и компоненты которого в X, Y, Z и описатьположение кончика дротик. Вращение вокруг своей дротик хвост движется кончик дротика и через дугу, центр вращения хвоста дротики. Точно таким же способом, вращая [[Vector]], который представляет смещение от центра вращается Prim Prim через ту же дугу. То, что это выглядит как это объект вращается вокруг позиции компенсируется [[вектор]] от центра Prim.&lt;br /&gt;
=== Положение Объект вращается вокруг относительной точки ===&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation vRotArc       = llEuler2Rot( &amp;lt;30.0, 0.0, 0.0&amp;gt; * DEG_TO_RAD );&lt;br /&gt;
 //-- creates a rotation constant, 30 degrees around the X axis&lt;br /&gt;
&lt;br /&gt;
vector   vPosOffset     = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
 //-- creates an offset one meter in the positive Y direction&lt;br /&gt;
&lt;br /&gt;
vector   vPosRotOffset  = vPosOffset * vRotArc;&lt;br /&gt;
 //-- rotates the offset to get the motion caused by the rotation&lt;br /&gt;
&lt;br /&gt;
vector   vPosOffsetDiff = vPosOffset - vPosRotOffset;&lt;br /&gt;
 //-- gets the local difference between the current offset and the rotated one&lt;br /&gt;
&lt;br /&gt;
vector   vPosRotDiff    = vPosOffsetDiff * llGetRot();&lt;br /&gt;
 //-- rotates the difference in the offsets to be relative to the global rotation.&lt;br /&gt;
&lt;br /&gt;
vector   vPosNew        = llGetPos() + vPosRotDiff;&lt;br /&gt;
 //-- finds the prims new position by adding the rotated offset difference&lt;br /&gt;
&lt;br /&gt;
rotation vRotNew        = vRotArc * llGetRot();&lt;br /&gt;
 //-- finds rot to continue facing offset point&amp;lt;/lsl&amp;gt;&lt;br /&gt;
: в применении, и то же действие, как:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetPrimitiveParams( [PRIM_POSITION, llGetPos() + (vPosOffset - vPosOffset * vRotArc) * llGetRot(),&lt;br /&gt;
                       PRIM_ROTATION, vRotArc * llGetRot()] );&amp;lt;/lsl&amp;gt;&lt;br /&gt;
* Приведенные выше результаты метода в орбите объект всегда с той же стороны, обращенной к центру. Альтернатива, которая сохраняет орбитальных вращений выглядит следующим образом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetPrimitiveParams( [PRIM_POSITION, llGetPos() + (vPosOffset - vPosOffset * vRotArc) * llGetRot()];&lt;br /&gt;
vPosOffset = vPosOffset * vRotArc;&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;На заметку:&#039;&#039;&#039; Делать это движение, так что не забывайте о проблемах перемещения Prim от мира, под землей, более чем на 10 метров и т.д. Кроме того, чтобы получить полную орбиту, вам нужно повторите перечисленные стадии (в [[Таймер]] может быть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Внимание:&#039;&#039;&#039; Эти условия распространяются на объекты (или корень примы если вы предпочитаете), детский примы должны использовать [[PRIM_POS_LOCAL]] за позицию, и [[PRIM_ROT_LOCAL]] или [[llGetlocalRot]] для вращения, а Суть в том, вращается вокруг должно быть относительно корня.&lt;br /&gt;
&lt;br /&gt;
=== Позиции относительной точкой, вокруг повернутого объекта ===&lt;br /&gt;
Чтобы получить точку относительно объектов текущего облицовка (например, используется в rezzors)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;vector   vPosOffset     = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
 //-- создает смещение на один метр в положительном направлении Z.&lt;br /&gt;
&lt;br /&gt;
vector   vPosRotOffset  = vPosOffset * llGetRot();&lt;br /&gt;
 //-- вращать смещение, которое по отношению к вращению объектов&lt;br /&gt;
&lt;br /&gt;
vector   vPosOffsetIsAt = llGetPos() + vPosRotOffset;&lt;br /&gt;
 //-- получить область положение поворачивается смещение&amp;lt;/lsl&amp;gt;&lt;br /&gt;
:в применении, те же действия,:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llRezAtRoot( &amp;quot;Object&amp;quot;, llGetPos() + vPosOffset * llGetRot(), ZERO_VECTOR, ZERO_ROTATION, 0 );&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Нормализация вращения == &lt;br /&gt;
При необходимости точности, часто важно - даже необходимым - работать с нормированными вращения, что означает масштабирования каждого кватернион, так что его&#039;&#039; х, у, и&#039;&#039;&#039;&#039;&#039;&#039; г значения равны 1. Некоторые операции в LSL будет фактически генерировать ошибку времени выполнения, если вы не делаете этого. Глядя на это с другой стороны, необходимо, чтобы выразить вращения таким образом, что касается угла поворота вектора &amp;lt;1.0,1.0,1.0&amp;gt;. Математически нормализации вращения&#039;&#039; &#039;Q&#039;&#039;&#039; означает расчета&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нормализация Q = Q / Sqrt( Q.x^2 + Q.y^2 + Q.z^2 + Q.s^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Полагая, что с точки LSL:&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation NormRot(rotation Q)&lt;br /&gt;
{&lt;br /&gt;
    float MagQ = llSqrt(Q.x*Q.x + Q.y*Q.y +Q.z*Q.z + Q.s*Q.s);&lt;br /&gt;
    return &amp;lt;Q.x/MagQ, Q.y/MagQ, Q.z/MagQ, Q.s/MagQ&amp;gt;;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Примечание&#039;&#039;&#039;: только методы в LSL для получения де-нормированной вращений [[llAxes2Rot]] (&#039;&#039; через входы, которые не являются взаимно ортогональных или через входы различной величины&#039;&#039;), или прямой манипулирование элементами ротации. Все остальные функции * LL вернуться нормированного вращений. Использование предыдущего примера может ввести небольшой плавающей точкой ошибки в нормированный вращения из-за ограниченной точностью.&lt;br /&gt;
&lt;br /&gt;
== Полезные фрагменты ==&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer IsRotation(string s)&lt;br /&gt;
{&lt;br /&gt;
    list split = llParseString2List(s, [&amp;quot; &amp;quot;], [&amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;]);&lt;br /&gt;
    if(llGetListLength(split) != 9)//we must check the list length, or the next test won&#039;t work properly.&lt;br /&gt;
        return 0;&lt;br /&gt;
    return !((string)((rotation)s) == (string)((rotation)((string)llListInsertList(split, [&amp;quot;-&amp;quot;], 7))));&lt;br /&gt;
    //it works by trying to flip the sign on the S element of the rotation,&lt;br /&gt;
    //if it works or breaks the rotation then the values won&#039;t match.&lt;br /&gt;
    //if the rotation was already broken then the sign flip will have no affect and the values will match&lt;br /&gt;
    //we cast back to string so we can catch negative zero which allows for support of &amp;lt;0,0,0,0&amp;gt;&lt;br /&gt;
}//Strife Onizuka&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Рассчитайте точку D на расстоянии в направлении аватара ID сталкивается}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;vector point_in_front_of( key id, float d )&lt;br /&gt;
{&lt;br /&gt;
    list pose = llGetObjectDetails( id, [ OBJECT_POS, OBJECT_ROT ] );&lt;br /&gt;
    return ( llList2Vector( pose, 0 ) + &amp;lt; d, 0.0, 0.0 &amp;gt; * llList2Rot( pose, 1 ) );&lt;br /&gt;
}// Mephistopheles Thalheimer&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Rez объект о на расстоянии г от конца оси z.&amp;lt;br&amp;gt;&lt;br /&gt;
Объект rezzed ориентирована на rezzer}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;rez_object_at_end( string o, float d )&lt;br /&gt;
{&lt;br /&gt;
    vector s = llGetScale();&lt;br /&gt;
    &lt;br /&gt;
    if( llGetInventoryType( o ) == INVENTORY_OBJECT )&lt;br /&gt;
    {&lt;br /&gt;
        llRezObject( o, llGetPos() + llRot2Up( llGetRot() ) * ( s.z / 2.0 + d ) , ZERO_VECTOR, llGetRot(), 0 );&lt;br /&gt;
    }&lt;br /&gt;
}// Mephistopheles Thalheimer(Мефистофель Тальгеймер)&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Полезные функции преобразуются в LSL от [http://www.isner.com/tutorials/quatSpells/quaternion_spells_12.htm this page]: {{HiddenButCopy|http://www.isner.com/tutorials/quatSpells/quaternion_spells_12.htm}}}}&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Масштабирование вращения:}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation ScaleQuat(rotation source, float ratio)&lt;br /&gt;
{&lt;br /&gt;
	return llAxisAngle2Rot(llRot2Axis(source), ratio * llRot2Angle(source));&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Ограничение вращения в данной плоскости, определяется его нормальным, очень полезно для транспортных средств, которые остаются в горизонтальном получается: ​​&amp;lt;br/&amp;gt;&lt;br /&gt;
Отметим, что существует недостаток где-то в этой функции, это дает неправильные результаты в некоторых обстоятельствах.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation ConstrainQuat2Plane(rotation source, vector normal)&lt;br /&gt;
{&lt;br /&gt;
	return llAxisAngle2Rot(normal, &amp;lt;source.x, source.y, source.z&amp;gt; * normal * llRot2Angle(source));&lt;br /&gt;
} // Jesrad Seraph&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Slerp (rotation combination) function from [[Slerp]]:}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation BlendQuats(rotation a, rotation b, float ratio)&lt;br /&gt;
{&lt;br /&gt;
	return llAxisAngle2Rot(llRot2Axis(b /= a), ratio * llRot2Angle(b)) * a;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Константы ==&lt;br /&gt;
=== [[ZERO_ROTATION]] ===&lt;br /&gt;
ZERO_ROTATION = &amp;lt;0.0, 0.0, 0.0, 1.0&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
Вращения константа, представляющая угла Эйлера &amp;lt;0.0, 0.0, 0.0&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== [[DEG_TO_RAD]] ===&lt;br /&gt;
DEG_TO_RAD = 0.01745329238f;&amp;lt;br/&amp;gt;&lt;br /&gt;
float-константа, которая при умножении на угол в градусах дает угол в радианах.&lt;br /&gt;
&lt;br /&gt;
=== [[RAD_TO_DEG]] ===&lt;br /&gt;
RAD_TO_DEG = 57.29578f;&amp;lt;br/&amp;gt;&lt;br /&gt;
float-константа при умножении на угол в радианах дает угол в градусах.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL_Types|Rotation]][[Category:LSL_Math]][[Category:LSL_Math/3D]][[Category:LSL Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Полезные функции ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
=== Созданные пользоваетем полезные функции ===&lt;br /&gt;
Эти функции были созданы и предоставлены пользователям LSL для выполнения операций не распространяется встроенный LSL функций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|+&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!function&lt;br /&gt;
!purpose&lt;br /&gt;
|-&lt;br /&gt;
|| [[Chr]] || Возвращает Unicode символ с данным кодом. См. также [[Ord]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[Float2String]] || Позволяет Выходная строка из поплавка в аккуратные текстовый формат, с возможностью округления.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Left]] || Возврат текста осталось от указанного сепаратора.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Like]] || Смотрите, если одно слово соответствует части другого.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Ord]] || Возвращает порядковое (Unicode код) характер. См. также [[Chr]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[RandomString]] || Создает случайной строки.&lt;br /&gt;
|-&lt;br /&gt;
|| [[RemoveHTMLTags]] || Удаляет HTML-теги из строки (и символы новой строки)&lt;br /&gt;
|-&lt;br /&gt;
|| [[Right]] || возвращает текст праве указанный разделитель.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Library_Combined_Library#str_replace|str_replace]] || заменить все вхождения строки другой строки в строку.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Stristr]] || Возвращает строку из первого вхождения иглы до конца стогу.&lt;br /&gt;
|-&lt;br /&gt;
|| [[SplitLine]] || вставка escape &#039;new line&#039; кодов в определенных позициях строки.&lt;br /&gt;
|-&lt;br /&gt;
|| [[WrapText]] || Прерывает текст в соответствие длины вашей спецификации.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Текст-документы из библиотеки скриптов ===&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[ParseString2List]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||То же, что [[llParseString2List]] и [[llParseStringKeepNulls]], но не ограничены 8 прокладками или сепараторов. Таким образом заменить вызов [[llParseString2List]] и [[llParseStringKeepNulls]] функций с помощью вызова [[Parse_String_To_List|ParseString2List]] всякий раз, когда у вас есть более чем на 8 сепараторов или более 8 распорки.&lt;br /&gt;
|-&lt;br /&gt;
||[[String Compare]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Сравнивает две строки и надежно возвращает либо 1, -1 или 0, если они такие же.&lt;br /&gt;
|-&lt;br /&gt;
||[[XyText 1.5|XyText]]&lt;br /&gt;
||[[User:Xylor Baysklef|Xylor Baysklef]]&lt;br /&gt;
|| Текстовый дисплей (до 10 символов) на прим. Используйте столько примы как хотелось бы.&lt;br /&gt;
|-&lt;br /&gt;
||[[XyyyyzText|XyyyyzText]]&lt;br /&gt;
||[[User:Criz Collins|Criz Collins]]&lt;br /&gt;
|| Текстовый дисплей (до 10 символов) на прим. Отображает различные текст для каждой строки, а не единый текст, который будет разбит на следующие строки. Смотреть здесь, что это значит: http://screencast.com/t/1wMLujLcEO&lt;br /&gt;
|-&lt;br /&gt;
||[[XyzzyText|XyzzyText]]&lt;br /&gt;
||[[User:Thraxis Epsilon|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
|| Текстовый дисплей (до 10 символов) на примы. Путь, более эффективны, чем XyText.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Text&amp;diff=1180203</id>
		<title>Template:Text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Text&amp;diff=1180203"/>
		<updated>2013-07-20T11:28:10Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{{2|}}}|[[{{{1}}}{{!}}{{{2}}}]]|[[{{{1}}}]]}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: black; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Rotation/ru&amp;diff=1180202</id>
		<title>Rotation/ru</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Rotation/ru&amp;diff=1180202"/>
		<updated>2013-07-20T11:24:31Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: /* Вращение(Rotation). */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Multi-lang}}&lt;br /&gt;
{{LSL Header/ru}}{{LSLC|||{{#var:lang}}}}{{LSLC|Types||{{#var:lang}}}}&lt;br /&gt;
&lt;br /&gt;
См. также [[:Category:LSL_Text|Text]].&lt;br /&gt;
== Вращение(Rotation). ==&lt;br /&gt;
Тип &#039;&#039;&#039;вращение&#039;&#039;&#039; ( {{greenText|rotation}} ) в LSL является одним из нескольких способов представления ориентации в 3D-проостранстве - трехмерном пространстве. (Обратите внимание, что мы пытаемся написать имя типа в &#039;&#039;&#039;жирном&#039;&#039;&#039;.)&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вращение&#039;&#039;&#039; ({{rotation}})  можно рассматривать как дискретный поворот в трехмерном пространстве, и как ориентацию объекта так, насколько много он обернулся вокруг любых осей, которые мы используем - обычно осей региона.&lt;br /&gt;
&lt;br /&gt;
Математический объект вызывает {{LSLG|quaternion}} ({{LSLG|кватернион}}). Вы можете представлять кватернион в виде четырех чисел, три из которых представляют направление объекта, а четвертое - крен объекта влево или вправо вокруг этого направления.Основным преимуществом использования кватернионов является то, что они не восприимчивы к [http://en.wikipedia.org/wiki/Gimbal_Lock блокировке вращения].&lt;br /&gt;
Для комплексной внутренней работы с кватернионной математикой - см. {{LSLG|quaternion|кватернион}}.&lt;br /&gt;
Список функций и событий, связанных с вращениями, см. {{LSLG|LSL Rotation Synopsis|краткий обзор LSL-вращения (rotation)}}.&lt;br /&gt;
Существует также информация о вызывании текстурных вращений в {{LSLG|texture|текстуры}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
{{whiteText|Пример:}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation R = &amp;lt;1.23, 0.0, 4.56, 1.0&amp;gt;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_name_desc|variable name&lt;br /&gt;
}}{{#vardefine:p_value_desc|string expression or constant&lt;br /&gt;
}}{{#vardefine:p_value_t_desc|expression or constant&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Другие представления ==&lt;br /&gt;
=== Эйлера вектор ===&lt;br /&gt;
Другой способ представления Угол 3D использует три номера, &amp;lt;X, y, Z&amp;gt;, которые представляют собой сумму, объект поворачивается вокруг каждой оси. Это используется в окне редактирования, например, и, как правило, легко для людей, для визуализации. Легко регулировки вращения &amp;lt;x, y, z&amp;gt; номера в окне редактирования и посмотреть, как ведет себя объект. Обратите внимание, что в окне редактирования, цифры даны в градусах, то есть под прямым углом 90.&lt;br /&gt;
&lt;br /&gt;
В LSL, эти три угла выражены в [[радиан]] вместо градусов, то есть под прямым углом является PI / 2. (Радиан является своего рода очень толстый степени.)&lt;br /&gt;
Заметим, что эти три числа типа &amp;quot;вектор&#039;&#039; &#039;&#039;&#039;, а не типа&amp;quot; вращение&#039;&#039;&#039;&#039;&#039;, хотя это может представлять ту же информацию. Это называется&#039;&#039;&#039;&#039; Эйлера представление 3D углом. &#039;&#039; &#039;В LSL вращение вокруг Z делается, а затем вокруг у, и, наконец, вокруг X&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Оси плюс угол ===&lt;br /&gt;
При этом способе можно определить оси вращения, как определяющий ось, вокруг которой землей спины, и использовать его вместе с углом поворота вокруг оси, которая определяет величину поворота, чтобы дать&#039;&#039; &#039;вращение&#039;&#039;&#039; .&lt;br /&gt;
&lt;br /&gt;
Так что если вы хотите, чтобы определить &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; вокруг оси на 45 градусов в плоскости XY (North East в регионе координаты), вам нужно указать оси с тем же количеством х и у, но без каких-либо Z. Ось может быть &amp;lt;1.0, 1.0, 0.0&amp;gt;. Абсолютная величина числа, определяющие оси не имеют значения в этом представлении; &amp;lt;2.0, 2.0, 0.0&amp;gt; будет работать так же хорошо. Угол поворота отдельный номер задается в радианах, например. PI / 3 = 60 градусов. Вместе они определяют &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; глобальном 60 градусов по оси северо-востоке.&lt;br /&gt;
&lt;br /&gt;
Как Ось кватернионная плюс угол использует четыре цифры, но она не должна быть &amp;quot;нормальный&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== FWD, влево, вверх ===&lt;br /&gt;
Еще один способ для представления тех же 3D угол использовать три вектора, показывая, что фронт указывая на FWD (передний), что топ указывает на (вверх), и то, что с левой стороны указывает на (слева). На самом деле, только два из трех необходимы, потому что любые две определяет третий.&lt;br /&gt;
&lt;br /&gt;
По понятным причинам, такие как возможность легко комбинировать вращения, четыре версии, &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; кватернионов, лучше, хотя, возможно, сложнее для новичка, чтобы схватить. К счастью, это очень редко нужно делать ничего с фактическим внутренним представлением&#039;&#039;&#039;&#039; повороты и есть функции для преобразования легко переключаться между тремя типами LSL, а также между градусами и радианах.&lt;br /&gt;
&lt;br /&gt;
== Правилу правой руки ==&lt;br /&gt;
В LSL все вращения выполняется в соответствии с&#039;&#039; &#039;правилу правой руки&#039;&#039;&#039;. С правой стороны, расширить первого пальца в направлении положительного направления оси х. Расширение второй палец под прямым углом к ​​вашим первым пальцем, он будет указывать вдоль положительной оси, а большой палец, продлен по прямым углом как укажет вдоль положительной оси. При редактировании объекта, три цветных оси стрелки направлены в положительном направлении для каждой оси (X: красный, Y: зеленый, Z: синий).&lt;br /&gt;
&lt;br /&gt;
http://en.wikipedia.org/wiki/Right_hand_rule&lt;br /&gt;
&lt;br /&gt;
Теперь, не снимают правой рукой только все же, есть еще одно применение для него, определяющий направление положительного вращения. Сделать кулак правой рукой, большой палец простирался и указывая в положительном направлении оси вы заинтересованы Ваши пальцы локон вокруг в направлении положительного вращения. Вращений вокруг X, Y, Z и оси часто называют крен, тангаж, рыскание и, в частности, для транспортных средств.&lt;br /&gt;
&lt;br /&gt;
[Http://en.wikipedia.org/wiki/Tait-Bryan_angles ролл Шаг рыскания]&lt;br /&gt;
&lt;br /&gt;
== Объединение поворотов== &lt;br /&gt;
&#039;&lt;br /&gt;
Предположим, у вас есть два оборота. &#039;&#039;r1&#039;&#039; является поворот на 90 градусов влево, и &#039;&#039;r2&#039;&#039; Как вращаться на 30 градусов вправо. (Любые повороты будет работать, это всего лишь пример.)&lt;br /&gt;
Вы можете комбинировать &#039;&#039;r1&#039;&#039; и &#039;&#039;r2&#039;&#039;, чтобы сделать использование &#039;&#039;r3&#039;&#039; &#039;&#039;&#039;*&#039;&#039;&#039; оператора. Это действительно не умножать их, он &#039;&#039;сочиняет&#039;&#039; им.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
rotation R3 = R1 * R2;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат в этом случае является то, что&#039;&#039;&#039;&#039; R3 средства вращаются на 60 градусов влево.&lt;br /&gt;
&lt;br /&gt;
Другими словами, совместить&#039;&#039; &#039;вращения&#039;&#039;&#039;, можно использовать &amp;quot;многократно&#039;&#039; &#039;и&#039;&#039;&#039;&#039;&#039; разрыва&#039;&#039; &#039;операторов. Не пытайтесь использовать сложение или вычитание операторов на&#039;&#039; &#039;повороты&#039;&#039;&#039;, поскольку они не будут делать то, что вы ожидаете. Операция &amp;quot;умножения&#039;&#039; &#039;&#039;&#039; применяет вращение в положительном направлении, эксплуатация« разделяй&#039;&#039;&#039;&#039;&#039; означает отрицательный вращения. Вы также можете отрицать вращение непосредственно, просто свести на нет с компонентом, например, X.s = -X.s.&lt;br /&gt;
&lt;br /&gt;
В отличие от других типов, таких как {{LSLG | поплавок}}, порядок, в котором операции выполняются,&lt;br /&gt;
[Http://en.wikipedia.org/wiki/Commutative некоммутативную], имеет важное значение.&lt;br /&gt;
Причина этого проста: вы делаете заказ вращений в важно в RL. Например, если у Вас был дротик с четырьмя перьями, начал с вращением &amp;lt;0, 0, 0&amp;gt; с его хвостом о происхождении, он будет лежать на оси X с его точки направленные в положительном направлении X, его перья вдоль Z и Y оси и оси дротик и осей мир будет приведен в соответствие. Мы собираемся, чтобы повернуть его на 45 градусов вокруг X и 30 градусов вокруг Y, но в разной последовательности.&lt;br /&gt;
&lt;br /&gt;
Во-первых, после поворота 45 ° вокруг X дротик все равно будет по оси Х, неподвижная, просто повернулся вдоль его продольной оси, так что перьев будет на 45 градусов к оси. Тогда вращающийся 30 ° вокруг Y бы переместить его в плоскости XZ, чтобы указать на 30 градусов от оси X (вспомним правила правой руки для вращения означает небольшое положительное вращение вокруг Y перемещает точку вниз). Дарт ветров, направленная вверх 30 ° вниз, в одной вертикальной плоскости, это уже второй, но повернулся вокруг своей длинной оси так перья уже не вверх и вниз.&lt;br /&gt;
&lt;br /&gt;
Если вы сделали это в другую сторону, первая поворотная 30 град в Y, дротик будет вращаться вниз в плоскости XZ, но заметил, что она больше не находится на оси X, оси X и в мире не выровнены больше. Сейчас 45 градусов вращение вокруг оси X будет поворачивать вокруг своей дротик хвост, момент после 30 град конуса, ось которого вдоль положительной оси X мира, на 45 градусов вверх и вправо. Если вы искали вниз по оси X, было бы указывая поворота от 30 градусов ниже оси X, вверх и вправо, из плоскости XZ, до точки ниже первого квадранта в плоскости XY, перья, как это вращающийся пошли.&lt;br /&gt;
&lt;br /&gt;
Ясно, что это другой результат с первого вращения, но порядок ротации это единственное, что изменилось.&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать постоянной ротации необходимо определить&#039;&#039; &#039;вращения&#039;&#039;&#039; значение, которое может быть сделано путем создания LSLG {{|}} вектор с X, Y, Z углов в радианах в качестве компонентов (так называемый угол Эйлера) , то, что для преобразования&#039;&#039; &#039;вращения&#039;&#039;&#039; с помощью {{LSLG | llEuler2Rot}} функции. Чтобы перейти от вращения угол Эйлера {{LSLG | вектора}} {{использование LSLG | llRot2Euler}}.&lt;br /&gt;
&lt;br /&gt;
Если вы хотите осевого вращения вставке оси вращения и угол поворота в {{LSLG | llAxisAngle2Rot}} функция, и это вернется &amp;quot;вращение&#039;&#039; &#039;&#039;&#039;. Чтобы перейти от вращения Вернуться к оси и угла, используйте {{LSLG | llRot2Axis}} и {{LSLG | llRot2Angle}} соответственно.&lt;br /&gt;
&lt;br /&gt;
Можно попеременно создавать родной вращение непосредственно: реальная часть косинус половины угла поворота, а вектор часть нормированной оси вращения, умноженного на синус половины угла вращения.&lt;br /&gt;
&lt;br /&gt;
&#039;Примечание:&#039;&#039;&#039;&#039;&#039; углов в LSL даны в радианах, а не в градусах, но вы можете легко конвертировать с помощью встроенных констант [[# RAD_TO_DEG | RAD_TO_DEG]] и [[# DEG_TO_RAD | DEG_TO_RAD]]. Для &amp;quot;вращение&#039;&#039; &#039;30&#039;&#039; градусов вокруг оси X можно использовать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot30X&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llEuler2Rot]](&amp;lt;30, 0, 0&amp;gt; * [[DEG_TO_RAD]]);&lt;br /&gt;
||// convert the degrees to radians, then convert that [[vector]] into a rotation, rot30x&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |[[vector]] vec30X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llRot2Euler]](rot30X );&lt;br /&gt;
||// convert the rotation back to a [[vector]] (the values will be in radians)&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot30X&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llAxisAngle2Rot]](&amp;lt;1, 0, 0&amp;gt;, 30 * [[DEG_TO_RAD]]);&lt;br /&gt;
||// convert the degrees to radians, then convert into a rotation, rot30x&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Различия между кватернионам математики и LSL вращений ==&lt;br /&gt;
&lt;br /&gt;
Существуют некоторые различия между LSL и математике, которые имеют мало в то время как последствия сценария, но это может озадачить людей с предварительного математического знания. Поэтому мы подумали, что было бы хорошо, чтобы перечислить их здесь:&lt;br /&gt;
&lt;br /&gt;
* В LSL, все кватернионов нормированы (скалярное произведение&#039;&#039; &#039;R&#039;&#039;&#039; на&#039;&#039; &#039;R&#039;&#039;&#039; всегда&#039;&#039; &#039;1&#039;&#039; &#039;), и, следовательно, представляют собой способы для вращения объектов без изменения их размеров . В математике, общий кватернионов может быть не нормируется, и они представляют&#039;&#039;&#039;&#039; сродства, то есть способ, чтобы повернуть&#039;&#039; &#039;и&#039;&#039;&#039; изменения размера объектов.&lt;br /&gt;
* В LSL, термин&#039;&#039; &#039;с&#039;&#039;&#039; является четвертым членом вращения:&#039;&#039; &#039;&amp;lt;x, y, z, s&amp;gt;&#039;&#039;&#039;. В математике, термин&#039;&#039; &#039;с&#039;&#039;&#039;, которая также называется &amp;quot;реальная часть&amp;quot;, написана в качестве первой координаты кватернионов:&#039;&#039; &#039;(с, х, у, г)&#039;&#039;&#039;.&lt;br /&gt;
* Умножение написано в обратном порядке LSL и в математике. В LSL, вы должны написать&#039;&#039; &#039;R * S&#039;&#039;&#039;, где в математике можно было бы написать&#039;&#039; &#039;S. R&#039;&#039; &#039;.&lt;br /&gt;
&lt;br /&gt;
== Порядке ротации для векторов Эйлера ==&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, становится ясно, что при работе с вращений вокруг более одной оси, тем, как они сделали в критическое. В&#039;&#039;&#039;&#039; Эйлера обсуждения выше этого был отчасти умалчивается немного, отдельные повороты вокруг трех осей Определение общего вращения&#039;&#039;&#039;&#039;, но напрашивается вопрос: Что оси порядка вращениями сделано? Ответ&#039;&#039; &#039;Z, Y, X&#039;&#039;&#039; в глобальных координатах. Если вы пытаетесь, чтобы повернуть объект вокруг более одной оси одновременно использованием&#039;&#039;&#039;&#039; Эйлера представительства, определить правильный&#039;&#039;&#039;&#039; Эйлера {{LSLG | вектора}}, используя Z, Y, X порядке ротации, затем с помощью {{LSLG | llEuler2Rot}} функцию, чтобы получить&#039;&#039; &#039;вращение&#039;&#039;&#039; для использования в сочетании вращения или применение вращения к объекту.&lt;br /&gt;
&lt;br /&gt;
Местное == против глобального (Мир) вращений ==&lt;br /&gt;
&lt;br /&gt;
Важно провести различие между относительной &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; к миру, и относительная&amp;quot; вращение&#039;&#039;&#039;&#039;&#039; в местный самого объекта. В редакторе, вы можете переключаться с одного на другой. В скрипте, необходимо преобразовать из одного в другой, чтобы получить желаемое поведение.&lt;br /&gt;
&lt;br /&gt;
Вращений «Местные&#039;&#039; &#039;&#039;&#039; являются те сделали вокруг осей встроенный в сам объект вперед / назад, влево / вправо, вверх / вниз, независимо от того, вращается объект в мире. Вращений «Глобальный&#039;&#039; &#039;&#039;&#039; являются те, сделано во всем мире топоры, Север / Юг, Восток / Запад, Выше / Ниже. Вы можете увидеть разницу, вращая Prim, затем отредактировать его и изменить параметры осей между локальными и глобальными, обратите внимание, как цветные стрелки осей изменения.&lt;br /&gt;
&lt;br /&gt;
В LSL, разница между делают «местное&#039;&#039; &#039;&#039;&#039; или вращение&amp;quot; глобального&#039;&#039;&#039;&#039;&#039; порядок&#039;&#039; &#039;повороты&#039;&#039;&#039; оцениваются в заявлении.&lt;br /&gt;
&lt;br /&gt;
Это делает 30 градусов «местного&#039;&#039; &#039;&#039;&#039; вращения, поместив постоянной 30 градусов&#039;&#039;&#039; вращение&#039;&#039; &#039;слева от начала&#039;&#039; объекта&amp;quot; вращение&#039;&#039;&#039; (myRot). Это как первая операция в первом примере выше, просто скручивания дротик 30 градусов вокруг своей длинной оси.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation localRot = &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rot30X * myRot;&lt;br /&gt;
||// do a local rotation by multiplying a constant rotation by a world rotation&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вращения «глобальный&#039;&#039; &#039;&#039;&#039;, используйте&amp;quot; вращение&#039;&#039;&#039;&#039;&#039; же значения, но в обратном порядке. Это похоже на вторую операцию во втором примере, дротик вращающихся и вправо вокруг оси X мире. В этом случае существующий вращения (myRot) поворачивается на 30 градусов вокруг глобальной оси X.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation globalRot &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; | = myRot * rot30X;&lt;br /&gt;
||// do a global rotation by multiplying a world rotation by a constant rotation&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Еще один способ думать об объединении вращений ==&lt;br /&gt;
&lt;br /&gt;
Вы можете думать о «местных&#039;&#039; &#039;&#039;&#039; против этой разницы&#039;&#039;&#039; глобальной&#039;&#039; &#039;, считая, что&#039;&#039;&#039; повороты&#039;&#039; &#039;делается в оценке порядке, то есть слева направо, за исключением выражения в скобках.&lt;br /&gt;
&lt;br /&gt;
В localRot случае то, что произошло то, что, начиная с &amp;lt;0, 0, 0&amp;gt;, rot30X было сделано в первую очередь, вращающиеся Prim вокруг оси мира X, но, поскольку, когда он до вращения, локальных и глобальных осей одинаковы, то есть эффект делает вращение вокруг локальной оси X объекта. Тогда второй&#039;&#039; &#039;вращения&#039;&#039;&#039; myRot было сделано которая вращалась Prim в исходное вращение, но теперь с дополнительными оси вращения X запеченные дюйма, как это выглядит в том, что чопорная поворачиваться на месте, вокруг собственной оси X , с Y и Z вращения вращения неизменным,&#039;&#039; &#039;местные&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
В globalRot случае, опять начиная с &amp;lt;0, 0, 0&amp;gt;, первый объект вращается в исходное вращения (myRot), но теперь оси объекта и осей в мире больше не выровнены! Итак, &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; rot30x второй делает то, что сделал в локальном случае, вращается объект 30 градусов вокруг оси X мире, но эффект, чтобы повернуть объект через конус вокруг оси X, так как мир X объекта оси и оси Х в мире не то же самое это время. То, что это выглядит как то, что чопорные поворачивается на 30 градусов вокруг оси X мире, следовательно, вращение «глобальный&#039;&#039; &#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039; &#039;Отдел&#039;&#039;&#039; из&#039;&#039; &#039;вращения&#039;&#039;&#039; имеет эффект делает вращение в противоположном направлении, умножением на 330 градусов&#039;&#039; &#039;вращение&#039;&#039;&#039; такой же, как деление на 30 градусов&#039;&#039; &amp;quot;вращение&#039;&#039; &#039;.&lt;br /&gt;
&lt;br /&gt;
== Использование == Повороты&lt;br /&gt;
&lt;br /&gt;
Вы можете получить доступ к отдельным компонентам&#039;&#039; &#039;вращения&#039;&#039;&#039;&#039;&#039; &#039;R&#039;&#039;&#039; на&#039;&#039; &#039;Rx, Ry, Rz, R, S &amp;amp;&#039;&#039;&#039; (&#039;&#039; &#039;не&#039;&#039;&#039; Rw). Скалярная часть РС косинус половины угла поворота. Векторной части (Rx, Ry, Rz) есть произведение нормированных оси вращения, и на синус половины угла поворота. Вы можете создавать &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; обратной путем отрицания X, Y, Z членов (или, сделав значение с отрицательным). Как в стороне, вы можете также использовать &amp;quot;вращение&#039;&#039; &#039;&#039;&#039; просто как хранилище [[поплавок]] значения,&amp;quot; вращение&#039;&#039;&#039;&#039;&#039; каждый магазинах четыре из них и [[Список]], состоящий из &#039; вращение&#039;&#039;&#039;&#039; &#039;является более эффективным, чем [[Список]], состоящий из [[поплавок]] ы, но есть накладные расходы в распаковывая их.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot30X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[llEuler2Rot]](&amp;lt;30, 0, 0&amp;gt; * [[#DEG_TO_RAD|DEG_TO_RAD]] );&lt;br /&gt;
||// Create a rotation constant&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rotCopy &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rot30X;&lt;br /&gt;
||// Just copy it into rotCopy, it copies all 4 float components&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.x;&lt;br /&gt;
||// Get out the individual components of the rotation&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float Y &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.y;&lt;br /&gt;
||&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float Z &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.z;&lt;br /&gt;
||&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |float S &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= rotCopy.s;&lt;br /&gt;
||&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation anotherCopy &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= &amp;lt;X, Y, Z, S&amp;gt;;&lt;br /&gt;
||// Make another rotation out of the components&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Существует встроенный в постоянном для нулевого&#039;&#039; &#039;вращения&#039;&#039;&#039; [[# ZERO_ROTATION | ZERO_ROTATION]], которые вы можете использовать прямо или, если вам нужно, чтобы инвертировать&#039;&#039; &#039;вращения R&#039;&#039;&#039;, разделите [[# ZERO_ROTATION | ZERO_ROTATION]] на&#039;&#039; &#039;R&#039;&#039;&#039;. В качестве напоминания сверху, это работает, первую вращающуюся в нулевое положение, то потому, что это пропасть, вращающихся в противоположном направлении к первоначальному&#039;&#039; &#039;вращения&#039;&#039;&#039;, тем самым делает обратное вращение.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{| cellpadding=0 cellspacing=0&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation rot330X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= &amp;lt;-rot30X.x, -rot30X.y, -rot30X.z, rot30X.s&amp;gt;;&lt;br /&gt;
||// invert a rotation - NOTE the s component isn&#039;t negated&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation another330X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= [[#ZERO_ROTATION|ZERO_ROTATION]] / rot30X;&lt;br /&gt;
||// invert a rotation by  division, same result as rot330X&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |rotation yetanother330X &lt;br /&gt;
| style=&amp;quot;white-space: nowrap&amp;quot; |= &amp;lt;rot30X.x, rot30X.y, rot30X.z, -rot30X.s&amp;gt;;&lt;br /&gt;
||// not literally the same but works the same.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Одноместный или корневой Prims VS Связанные Prims против Вложения ==&lt;br /&gt;
&lt;br /&gt;
Причиной говорить о едином или связанных Prim вращений в том, что такие вещи, как двери на транспортные средства, желаемого движения является перемещение дверей относительно транспортного средства, независимо от того, что вращение общее транспортное средство. В то время как можно сделать это с глобальным вращений, было бы быстро расти утомительно.&lt;br /&gt;
Есть вообще три системы координат Prim может быть в: в полном одиночестве, часть {{LSLG |}} группы каналов или части LSLG {{|}} привязанности. Когда чопорная один, т.е. не является частью {{LSLG | группы каналов}}, он действует как росток чопорные, а когда она является частью {{LSLG | привязанности}}, он действует по-разному и немного нарушена.&lt;br /&gt;
&lt;br /&gt;
{{LSLRotGetSet}}&lt;br /&gt;
&lt;br /&gt;
== Вращающиеся векторы ==&lt;br /&gt;
&lt;br /&gt;
В LSL, вращая [[вектор]] очень полезно, если вы хотите переместить объект в дугу или окружность, когда центр вращения не центр объекта.&lt;br /&gt;
&lt;br /&gt;
Это звучит очень сложным, но гораздо меньше, чем кажется на первый взгляд. Помните, из вышеизложенного вращающихся [[# Объединение Повороты | дротик]], и заменить физические дротик с [[вектор]], происхождение которых хвост дротика и компоненты которого в X, Y, Z и описатьположение кончика дротик. Вращение вокруг своей дротик хвост движется кончик дротика и через дугу, центр вращения хвоста дротики. Точно таким же способом, вращая [[Vector]], который представляет смещение от центра вращается Prim Prim через ту же дугу. То, что это выглядит как это объект вращается вокруг позиции компенсируется [[вектор]] от центра Prim.&lt;br /&gt;
=== Положение Объект вращается вокруг относительной точки ===&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation vRotArc       = llEuler2Rot( &amp;lt;30.0, 0.0, 0.0&amp;gt; * DEG_TO_RAD );&lt;br /&gt;
 //-- creates a rotation constant, 30 degrees around the X axis&lt;br /&gt;
&lt;br /&gt;
vector   vPosOffset     = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
 //-- creates an offset one meter in the positive Y direction&lt;br /&gt;
&lt;br /&gt;
vector   vPosRotOffset  = vPosOffset * vRotArc;&lt;br /&gt;
 //-- rotates the offset to get the motion caused by the rotation&lt;br /&gt;
&lt;br /&gt;
vector   vPosOffsetDiff = vPosOffset - vPosRotOffset;&lt;br /&gt;
 //-- gets the local difference between the current offset and the rotated one&lt;br /&gt;
&lt;br /&gt;
vector   vPosRotDiff    = vPosOffsetDiff * llGetRot();&lt;br /&gt;
 //-- rotates the difference in the offsets to be relative to the global rotation.&lt;br /&gt;
&lt;br /&gt;
vector   vPosNew        = llGetPos() + vPosRotDiff;&lt;br /&gt;
 //-- finds the prims new position by adding the rotated offset difference&lt;br /&gt;
&lt;br /&gt;
rotation vRotNew        = vRotArc * llGetRot();&lt;br /&gt;
 //-- finds rot to continue facing offset point&amp;lt;/lsl&amp;gt;&lt;br /&gt;
: в применении, и то же действие, как:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetPrimitiveParams( [PRIM_POSITION, llGetPos() + (vPosOffset - vPosOffset * vRotArc) * llGetRot(),&lt;br /&gt;
                       PRIM_ROTATION, vRotArc * llGetRot()] );&amp;lt;/lsl&amp;gt;&lt;br /&gt;
* Приведенные выше результаты метода в орбите объект всегда с той же стороны, обращенной к центру. Альтернатива, которая сохраняет орбитальных вращений выглядит следующим образом&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetPrimitiveParams( [PRIM_POSITION, llGetPos() + (vPosOffset - vPosOffset * vRotArc) * llGetRot()];&lt;br /&gt;
vPosOffset = vPosOffset * vRotArc;&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;На заметку:&#039;&#039;&#039; Делать это движение, так что не забывайте о проблемах перемещения Prim от мира, под землей, более чем на 10 метров и т.д. Кроме того, чтобы получить полную орбиту, вам нужно повторите перечисленные стадии (в [[Таймер]] может быть).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Внимание:&#039;&#039;&#039; Эти условия распространяются на объекты (или корень примы если вы предпочитаете), детский примы должны использовать [[PRIM_POS_LOCAL]] за позицию, и [[PRIM_ROT_LOCAL]] или [[llGetlocalRot]] для вращения, а Суть в том, вращается вокруг должно быть относительно корня.&lt;br /&gt;
&lt;br /&gt;
=== Позиции относительной точкой, вокруг повернутого объекта ===&lt;br /&gt;
Чтобы получить точку относительно объектов текущего облицовка (например, используется в rezzors)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;vector   vPosOffset     = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
 //-- создает смещение на один метр в положительном направлении Z.&lt;br /&gt;
&lt;br /&gt;
vector   vPosRotOffset  = vPosOffset * llGetRot();&lt;br /&gt;
 //-- вращать смещение, которое по отношению к вращению объектов&lt;br /&gt;
&lt;br /&gt;
vector   vPosOffsetIsAt = llGetPos() + vPosRotOffset;&lt;br /&gt;
 //-- получить область положение поворачивается смещение&amp;lt;/lsl&amp;gt;&lt;br /&gt;
:в применении, те же действия,:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llRezAtRoot( &amp;quot;Object&amp;quot;, llGetPos() + vPosOffset * llGetRot(), ZERO_VECTOR, ZERO_ROTATION, 0 );&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Нормализация вращения == &lt;br /&gt;
При необходимости точности, часто важно - даже необходимым - работать с нормированными вращения, что означает масштабирования каждого кватернион, так что его&#039;&#039; х, у, и&#039;&#039;&#039;&#039;&#039;&#039; г значения равны 1. Некоторые операции в LSL будет фактически генерировать ошибку времени выполнения, если вы не делаете этого. Глядя на это с другой стороны, необходимо, чтобы выразить вращения таким образом, что касается угла поворота вектора &amp;lt;1.0,1.0,1.0&amp;gt;. Математически нормализации вращения&#039;&#039; &#039;Q&#039;&#039;&#039; означает расчета&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Нормализация Q = Q / Sqrt( Q.x^2 + Q.y^2 + Q.z^2 + Q.s^2)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Полагая, что с точки LSL:&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation NormRot(rotation Q)&lt;br /&gt;
{&lt;br /&gt;
    float MagQ = llSqrt(Q.x*Q.x + Q.y*Q.y +Q.z*Q.z + Q.s*Q.s);&lt;br /&gt;
    return &amp;lt;Q.x/MagQ, Q.y/MagQ, Q.z/MagQ, Q.s/MagQ&amp;gt;;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Примечание&#039;&#039;&#039;: только методы в LSL для получения де-нормированной вращений [[llAxes2Rot]] (&#039;&#039; через входы, которые не являются взаимно ортогональных или через входы различной величины&#039;&#039;), или прямой манипулирование элементами ротации. Все остальные функции * LL вернуться нормированного вращений. Использование предыдущего примера может ввести небольшой плавающей точкой ошибки в нормированный вращения из-за ограниченной точностью.&lt;br /&gt;
&lt;br /&gt;
== Полезные фрагменты ==&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer IsRotation(string s)&lt;br /&gt;
{&lt;br /&gt;
    list split = llParseString2List(s, [&amp;quot; &amp;quot;], [&amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;]);&lt;br /&gt;
    if(llGetListLength(split) != 9)//we must check the list length, or the next test won&#039;t work properly.&lt;br /&gt;
        return 0;&lt;br /&gt;
    return !((string)((rotation)s) == (string)((rotation)((string)llListInsertList(split, [&amp;quot;-&amp;quot;], 7))));&lt;br /&gt;
    //it works by trying to flip the sign on the S element of the rotation,&lt;br /&gt;
    //if it works or breaks the rotation then the values won&#039;t match.&lt;br /&gt;
    //if the rotation was already broken then the sign flip will have no affect and the values will match&lt;br /&gt;
    //we cast back to string so we can catch negative zero which allows for support of &amp;lt;0,0,0,0&amp;gt;&lt;br /&gt;
}//Strife Onizuka&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Рассчитайте точку D на расстоянии в направлении аватара ID сталкивается}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;vector point_in_front_of( key id, float d )&lt;br /&gt;
{&lt;br /&gt;
    list pose = llGetObjectDetails( id, [ OBJECT_POS, OBJECT_ROT ] );&lt;br /&gt;
    return ( llList2Vector( pose, 0 ) + &amp;lt; d, 0.0, 0.0 &amp;gt; * llList2Rot( pose, 1 ) );&lt;br /&gt;
}// Mephistopheles Thalheimer&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Rez объект о на расстоянии г от конца оси z.&amp;lt;br&amp;gt;&lt;br /&gt;
Объект rezzed ориентирована на rezzer}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;rez_object_at_end( string o, float d )&lt;br /&gt;
{&lt;br /&gt;
    vector s = llGetScale();&lt;br /&gt;
    &lt;br /&gt;
    if( llGetInventoryType( o ) == INVENTORY_OBJECT )&lt;br /&gt;
    {&lt;br /&gt;
        llRezObject( o, llGetPos() + llRot2Up( llGetRot() ) * ( s.z / 2.0 + d ) , ZERO_VECTOR, llGetRot(), 0 );&lt;br /&gt;
    }&lt;br /&gt;
}// Mephistopheles Thalheimer(Мефистофель Тальгеймер)&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Полезные функции преобразуются в LSL от [http://www.isner.com/tutorials/quatSpells/quaternion_spells_12.htm this page]: {{HiddenButCopy|http://www.isner.com/tutorials/quatSpells/quaternion_spells_12.htm}}}}&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Масштабирование вращения:}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation ScaleQuat(rotation source, float ratio)&lt;br /&gt;
{&lt;br /&gt;
	return llAxisAngle2Rot(llRot2Axis(source), ratio * llRot2Angle(source));&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Ограничение вращения в данной плоскости, определяется его нормальным, очень полезно для транспортных средств, которые остаются в горизонтальном получается: ​​&amp;lt;br/&amp;gt;&lt;br /&gt;
Отметим, что существует недостаток где-то в этой функции, это дает неправильные результаты в некоторых обстоятельствах.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation ConstrainQuat2Plane(rotation source, vector normal)&lt;br /&gt;
{&lt;br /&gt;
	return llAxisAngle2Rot(normal, &amp;lt;source.x, source.y, source.z&amp;gt; * normal * llRot2Angle(source));&lt;br /&gt;
} // Jesrad Seraph&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CopyAsComment|Slerp (rotation combination) function from [[Slerp]]:}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;rotation BlendQuats(rotation a, rotation b, float ratio)&lt;br /&gt;
{&lt;br /&gt;
	return llAxisAngle2Rot(llRot2Axis(b /= a), ratio * llRot2Angle(b)) * a;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Константы ==&lt;br /&gt;
=== [[ZERO_ROTATION]] ===&lt;br /&gt;
ZERO_ROTATION = &amp;lt;0.0, 0.0, 0.0, 1.0&amp;gt;;&amp;lt;br/&amp;gt;&lt;br /&gt;
Вращения константа, представляющая угла Эйлера &amp;lt;0.0, 0.0, 0.0&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== [[DEG_TO_RAD]] ===&lt;br /&gt;
DEG_TO_RAD = 0.01745329238f;&amp;lt;br/&amp;gt;&lt;br /&gt;
float-константа, которая при умножении на угол в градусах дает угол в радианах.&lt;br /&gt;
&lt;br /&gt;
=== [[RAD_TO_DEG]] ===&lt;br /&gt;
RAD_TO_DEG = 57.29578f;&amp;lt;br/&amp;gt;&lt;br /&gt;
float-константа при умножении на угол в радианах дает угол в градусах.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL_Types|Rotation]][[Category:LSL_Math]][[Category:LSL_Math/3D]][[Category:LSL Rotation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Полезные функции ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
=== Созданные пользоваетем полезные функции ===&lt;br /&gt;
Эти функции были созданы и предоставлены пользователям LSL для выполнения операций не распространяется встроенный LSL функций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|+&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!function&lt;br /&gt;
!purpose&lt;br /&gt;
|-&lt;br /&gt;
|| [[Chr]] || Возвращает Unicode символ с данным кодом. См. также [[Ord]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[Float2String]] || Позволяет Выходная строка из поплавка в аккуратные текстовый формат, с возможностью округления.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Left]] || Возврат текста осталось от указанного сепаратора.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Like]] || Смотрите, если одно слово соответствует части другого.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Ord]] || Возвращает порядковое (Unicode код) характер. См. также [[Chr]].&lt;br /&gt;
|-&lt;br /&gt;
|| [[RandomString]] || Создает случайной строки.&lt;br /&gt;
|-&lt;br /&gt;
|| [[RemoveHTMLTags]] || Удаляет HTML-теги из строки (и символы новой строки)&lt;br /&gt;
|-&lt;br /&gt;
|| [[Right]] || возвращает текст праве указанный разделитель.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Library_Combined_Library#str_replace|str_replace]] || заменить все вхождения строки другой строки в строку.&lt;br /&gt;
|-&lt;br /&gt;
|| [[Stristr]] || Возвращает строку из первого вхождения иглы до конца стогу.&lt;br /&gt;
|-&lt;br /&gt;
|| [[SplitLine]] || вставка escape &#039;new line&#039; кодов в определенных позициях строки.&lt;br /&gt;
|-&lt;br /&gt;
|| [[WrapText]] || Прерывает текст в соответствие длины вашей спецификации.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Текст-документы из библиотеки скриптов ===&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[ParseString2List]]&lt;br /&gt;
||[[User:Strife Onizuka|Strife Onizuka]]&lt;br /&gt;
||То же, что [[llParseString2List]] и [[llParseStringKeepNulls]], но не ограничены 8 прокладками или сепараторов. Таким образом заменить вызов [[llParseString2List]] и [[llParseStringKeepNulls]] функций с помощью вызова [[Parse_String_To_List|ParseString2List]] всякий раз, когда у вас есть более чем на 8 сепараторов или более 8 распорки.&lt;br /&gt;
|-&lt;br /&gt;
||[[String Compare]]&lt;br /&gt;
||[[User:Xaviar Czervik|Xaviar Czervik]]&lt;br /&gt;
||Сравнивает две строки и надежно возвращает либо 1, -1 или 0, если они такие же.&lt;br /&gt;
|-&lt;br /&gt;
||[[XyText 1.5|XyText]]&lt;br /&gt;
||[[User:Xylor Baysklef|Xylor Baysklef]]&lt;br /&gt;
|| Текстовый дисплей (до 10 символов) на прим. Используйте столько примы как хотелось бы.&lt;br /&gt;
|-&lt;br /&gt;
||[[XyyyyzText|XyyyyzText]]&lt;br /&gt;
||[[User:Criz Collins|Criz Collins]]&lt;br /&gt;
|| Текстовый дисплей (до 10 символов) на прим. Отображает различные текст для каждой строки, а не единый текст, который будет разбит на следующие строки. Смотреть здесь, что это значит: http://screencast.com/t/1wMLujLcEO&lt;br /&gt;
|-&lt;br /&gt;
||[[XyzzyText|XyzzyText]]&lt;br /&gt;
||[[User:Thraxis Epsilon|Thraxis Epsilon]] and [[User:Gigs Taggart|Gigs Taggart]]&lt;br /&gt;
|| Текстовый дисплей (до 10 символов) на примы. Путь, более эффективны, чем XyText.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:CyanDarkText&amp;diff=1180201</id>
		<title>Template:CyanDarkText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:CyanDarkText&amp;diff=1180201"/>
		<updated>2013-07-20T11:20:37Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: darkcyan; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: darkcyan; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:OrangeDarkText&amp;diff=1180200</id>
		<title>Template:OrangeDarkText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:OrangeDarkText&amp;diff=1180200"/>
		<updated>2013-07-20T11:19:57Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: darkorange; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: darkorange; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:MagentaDarkText&amp;diff=1180199</id>
		<title>Template:MagentaDarkText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:MagentaDarkText&amp;diff=1180199"/>
		<updated>2013-07-20T11:15:56Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #440044; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #440044; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:BlueDarkText&amp;diff=1180198</id>
		<title>Template:BlueDarkText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:BlueDarkText&amp;diff=1180198"/>
		<updated>2013-07-20T11:15:23Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #000044; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #000044; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RedDarkText&amp;diff=1180197</id>
		<title>Template:RedDarkText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RedDarkText&amp;diff=1180197"/>
		<updated>2013-07-20T11:14:47Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #440000; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #440000; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:GreenDarkText&amp;diff=1180196</id>
		<title>Template:GreenDarkText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:GreenDarkText&amp;diff=1180196"/>
		<updated>2013-07-20T11:13:37Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #004400; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: #004400; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:BlackText&amp;diff=1180195</id>
		<title>Template:BlackText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:BlackText&amp;diff=1180195"/>
		<updated>2013-07-20T11:09:59Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: black; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: black; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:WhiteText&amp;diff=1180194</id>
		<title>Template:WhiteText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:WhiteText&amp;diff=1180194"/>
		<updated>2013-07-20T11:09:26Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: gray; color: white; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: gray; color: white; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:OrangeText&amp;diff=1180193</id>
		<title>Template:OrangeText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:OrangeText&amp;diff=1180193"/>
		<updated>2013-07-20T11:08:37Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: orange; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: orange; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:GrayText&amp;diff=1180192</id>
		<title>Template:GrayText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:GrayText&amp;diff=1180192"/>
		<updated>2013-07-20T11:08:06Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: gray; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: gray; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:CyanText&amp;diff=1180191</id>
		<title>Template:CyanText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:CyanText&amp;diff=1180191"/>
		<updated>2013-07-20T11:07:28Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: cyan; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: cyan; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:MagentaText&amp;diff=1180190</id>
		<title>Template:MagentaText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:MagentaText&amp;diff=1180190"/>
		<updated>2013-07-20T11:07:01Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: magenta; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: magenta; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:BlueText&amp;diff=1180189</id>
		<title>Template:BlueText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:BlueText&amp;diff=1180189"/>
		<updated>2013-07-20T11:06:35Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: blue; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: blue; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RedText&amp;diff=1180188</id>
		<title>Template:RedText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RedText&amp;diff=1180188"/>
		<updated>2013-07-20T11:06:08Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: red; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: red; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:GreenText&amp;diff=1180187</id>
		<title>Template:GreenText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:GreenText&amp;diff=1180187"/>
		<updated>2013-07-20T11:05:48Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: green; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: green; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:YellowText&amp;diff=1180186</id>
		<title>Template:YellowText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:YellowText&amp;diff=1180186"/>
		<updated>2013-07-20T11:05:13Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: yellow; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: yellow; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Magentatext&amp;diff=1180185</id>
		<title>Template:Magentatext</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Magentatext&amp;diff=1180185"/>
		<updated>2013-07-20T11:04:26Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: magenta; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: magenta; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Text&amp;diff=1180184</id>
		<title>Template:Text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Text&amp;diff=1180184"/>
		<updated>2013-07-20T11:03:47Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: black; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: black; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Bluetext&amp;diff=1180183</id>
		<title>Template:Bluetext</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Bluetext&amp;diff=1180183"/>
		<updated>2013-07-20T11:02:59Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: Created page with &amp;quot;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: blue; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;{{{1}}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: blue; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Greentext&amp;diff=1180182</id>
		<title>Template:Greentext</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Greentext&amp;diff=1180182"/>
		<updated>2013-07-20T11:02:27Z</updated>

		<summary type="html">&lt;p&gt;Fashion Atlas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;help-hidden&amp;quot; style=&amp;quot;font-size:100%; background: #ffffff; color: green; vertical-align: top; text-align: left;&amp;quot;&amp;gt;&#039;&#039;&#039;{{{1}}}&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fashion Atlas</name></author>
	</entry>
</feed>