Good Building Practices

From Second Life Wiki
Revision as of 12:09, 7 April 2012 by Hyper Mole (talk | contribs)
Jump to navigation Jump to search

Physics Optimization:

(See handy script at bottom of page)

NOTE: Setting prims to Phantom does not stop them from being calculated by the physics engine!

The less the physics engine has to calculate, the smoother your region will perform. Creating clean low poly physics shapes for your meshes is helpful, but you can also remove prim, mesh, and sculpted objects from the physics calculations completely.

Link your complicated geometry to simple shapes. Here we linked to a cube and set all child prims to physics shape type None (in Edit > Features > Physics Shape Type):

To simulate a physics shape and keep avatars from walking through your optimized object, just add physics where it's needed.


Here is another example scenario. This is a sculpted prim fence. The physics shape is not as clean as it could be, and the edges don't cover all edges of the fence itself. To fix it, I created a cube physics shape, linked the fence to the cube with the cube as the root prim, and set the fence to Physics Shape Type: None. As you can see, the resulting physics shape is lower in polygons and better covers the fence area.

This is a tree comprised of many sculpted pieces. Keep in mind that the physics engine needs to calculate every part of the physics shape in the second picture. Here I created a cylinder for the physics shape to fit on the bottom of the tree trunk. By linking the cylinder to the tree, and setting the tree to physics shape none, I have a much cleaner static object.

Use the following script to set all child prims to None. Be sure to check what physics are needed for your linkset prior to using, and/or add a simple cube as the root prim. <lsl> default {

   state_entry()
   {
       llShout(0, "Setting all child prims to PRIM_PHYSICS_SHAPE_NONE");
       llSetLinkPrimitiveParamsFast(LINK_ALL_CHILDREN, [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_NONE]);
       llRemoveInventory(llGetScriptName());
   }

} </lsl>