Vehicles
From OpenSimulator
Contents |
Summary
August 2009: Kitto Flora is revising the OdePlugin files in an attempt to provide SL-compatible VEHICLE functionality to OpenSimulator. A couple of test regions have been provided by Bri Hasp, these are Sea-3 and Sea-4 in OSgrid. You may visit there and test vehicles but please clean up after. The revised OpenSimulator files are not generally available at this time as there are many bugs and deficiencies to be dealt with. The regions will frequently be restarted to test revisions.
Terminology
Here some terms are defined so that when we communicate we are talking about the same things.
Vehicle
Any object or link-set that moves. It is usually rideable. It may be Physical or not.
VEHICLE
Any object or link-set that uses LSL VEHICLE functions to achieve mobility. It is set to other than 'VEHICLE_TYPE_NONE'.
Physical
Any object or link-set that is llSetStatus(STATUS_PHYSICS, TRUE). It will fall due to gravity (unless buoyancy is changed) and collide with other prims, avatars and the ground (unless set phantom).
Non-Physical
Any object or link-set that is llSetStatus(STATUS_PHYSICS, FALSE), or has never has llSetStatus(STATUS_PHYSICS,...) applied. Such objects 'stick in midair' and can interpenetrate other objects.
Kinematic
Motion system used by Non-Physical objects, applied by such functions as llSetPos() and llSetRot().
Dynamic
Motion system used by Physical objects, applied by such functions as llSetForce() and llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <...>).
About This Project
The objectives of this project are:
- To provide VEHICLE associated LSL functions within OpenSimulator that are compatible with Second Life functionality. This means trying to get them really close, but as we are trying to emulate complex HAVOK functions using what is available in ODE they may be only close to the SL functions.
- To clean up the OdePlugin files. Over many revisions and add-ons they are somewhat non-optimal. In particular the 'Move' operation that makes objects move around needs to be very clean and smooth so that the update rate remains high.
- Maintain the existing non-VEHICLE dynamic functions and fix errors where found.
Vehicle LSL Functions in revised OpenSimulator
There are three categories of LSL functions that are used by Vehicles: Kinematic, Dynamic and VEHICLE. These are listed below with information on their current status within the revised OpenSimulator. (Not the general release at this time.) Kinematic vehicle motion can be used by non-physical objects. VEHICLE motion and the associated functions ONLYapply to objects that are set to a VEHICLE_TYPE of AIRPLANE, BALLOON, BOAT, CAR or SLED. Dynamic functions ONLYapply (at this time) to VEHICLE_TYPE_NONE, which is the default condition of an object. (In SL it appears that one can use Dynamic functions on a VEHICLE, but to keep things simple at the start of this project such a combination is not allowed.)
VEHICLE SCRIPTING
In revised OpenSimulator the function llSetVehicleType(VEHICLE_TYPE_xxx), where xxx is AIRPLANE, BALLOON, BOAT, CAR or SLED, pre-sets all the applicable VEHICLE parameters to reasonable numbers. If you wish to change any of these pre-set parameters do so after asserting llSetVehicleType(VEHICLE_TYPE_xxx). You only need to assert llSetVehicleType(VEHICLE_TYPE_xxx) once unless your vehicle morphs to another type. You do not need to assert llSetVehicleType(VEHICLE_TYPE_NONE) unless you wish to use non-VEHICLE Dynamic motion functions. Use llSetStatus(STATUS_PHYSICS, TRUE) to enable the VEHICLE, usually when the driver sits. Use llSetStatus(STATUS_PHYSICS, FALSE) to disable the VEHICLE, usually when the driver stands.
Vehicle LSL Functions and Status
NOTE! This list applies to the revised OpenSimulator, not the released OpenSimulator.
Key: Y = Yes; N = No; F = Framework present but commented out
KINEMATIC
(object must not be PHYSICAL)
(Some work, some do not.)
llSetPos() llSetRot() llSetLocalRot() llSetScale() llLookAt() llRotLookAt() llSetPrimitiveParams() llSetLinkPrimitiveParams() llTargetOmega()
DYNAMIC
(object must be PHYSICAL and VEHICLE_TYPE_NONE(default))
(Some work, some do not.)
llApplyImpulse() llApplyRotationalImpulse() llGroundRepel() llMoveToTarget() llPushObject() llSetBuoyancy() (do not confuse with VEHICLE_BUOYANCY) llSetForce() llSetForceAndTorque() llSetHoverHeight() (do not confuse with VEHICLE_HOVER_HEIGHT) llSetTorque() llTargetOmega() llLookAt() llRotLookAt() llSetPrimitiveParams() llSetLinkPrimitiveParams() llTargetOmega()
VEHICLE
(object must be PHYSICAL and VEHICLE_TYPE_<other than NONE>)
Parameter LSLsets Used Works Exceptions
VEHICLE_LINEAR_MOTOR_DIRECTION Y Y Y VEHICLE_LINEAR_MOTOR_TIMESCALE Y Y Y VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE Y Y Y VEHICLE_LINEAR_FRICTION_TIMESCALE Y Y Y VEHICLE_LINEAR_MOTOR_OFFSET F N VEHICLE_ANGULAR_MOTOR_DIRECTION Y Y Y VEHICLE_ANGULAR_MOTOR_TIMESCALE Y Y Y VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE Y Y Y VEHICLE_ANGULAR_FRICTION_TIMESCALE Y Y Y
VEHICLE_BANKING_EFFICIENCY F N VEHICLE_BANKING_MIX F N VEHICLE_BANKING_TIMESCALE F N
VEHICLE_BUOYANCY Y Y Y VEHICLE_HOVER_HEIGHT Y N VEHICLE_HOVER_EFFICIENCY Y N VEHICLE_HOVER_TIMESCALE Y N
VEHICLE_LINEAR_DEFLECTION_EFFICIENCY F N VEHICLE_LINEAR_DEFLECTION_TIMESCALE F N VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY F N VEHICLE_ANGULAR_DEFLECTION_TIMESCALE F N
VEHICLE_REFERENCE_FRAME F N
VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY Y Y Y
VEHICLE_VERTICAL_ATTRACTION_TIMESCALE Y Y Y
VEHICLE_TYPE_NONE Y Y Y VEHICLE_TYPE_BALLOON Y Y Y VEHICLE_TYPE_BOAT Y Y Y VEHICLE_TYPE_CAR Y Y Y VEHICLE_TYPE_SLED Y Y Y VEHICLE_FLAG_NO_DEFLECTION_UP Y N VEHICLE_FLAG_LIMIT_ROLL_ONLY Y N VEHICLE_FLAG_HOVER_WATER_ONLY Y Y VEHICLE_FLAG_HOVER_TERRAIN_ONLY Y Y VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT Y Y VEHICLE_FLAG_HOVER_UP_ONLY Y Y VEHICLE_FLAG_LIMIT_MOTOR_UP Y N VEHICLE_FLAG_MOUSELOOK_STEER Y N VEHICLE_FLAG_MOUSELOOK_BANK Y N VEHICLE_FLAG_CAMERA_DECOUPLED Y N