- Main Page
- Modules
- Data Structures
- Files

# Joints

## Functions
ODE_API dJointID | dJointCreateBall (dWorldID, dJointGroupID)
| Create a new joint of the ball type.
ODE_API dJointID | dJointCreateHinge (dWorldID, dJointGroupID)
| Create a new joint of the hinge type.
ODE_API dJointID | dJointCreateSlider (dWorldID, dJointGroupID)
| Create a new joint of the slider type.
ODE_API dJointID | dJointCreateContact (dWorldID, dJointGroupID, const dContact *)
| Create a new joint of the contact type.
ODE_API dJointID | dJointCreateHinge2 (dWorldID, dJointGroupID)
| Create a new joint of the hinge2 type.
ODE_API dJointID | dJointCreateUniversal (dWorldID, dJointGroupID)
| Create a new joint of the universal type.
ODE_API dJointID | dJointCreateFixed (dWorldID, dJointGroupID)
| Create a new joint of the fixed type.
ODE_API dJointID | dJointCreateAMotor (dWorldID, dJointGroupID)
| Create a new joint of the A-motor type.
ODE_API dJointID | dJointCreateLMotor (dWorldID, dJointGroupID)
| Create a new joint of the L-motor type.
ODE_API void | dJointDestroy (dJointID)
| Destroy a joint. disconnects it from its attached bodies and removing it from the world. However, if the joint is a member of a group then this function has no effect - to destroy that joint the group must be emptied or destroyed.
ODE_API dJointGroupID | dJointGroupCreate (int max_size)
| Create a joint group.
ODE_API void | dJointGroupDestroy (dJointGroupID)
| Destroy a joint group. All joints in the joint group will be destroyed.
ODE_API void | dJointGroupEmpty (dJointGroupID)
| Empty a joint group. All joints in the joint group will be destroyed, but the joint group itself will not be destroyed.
ODE_API void | dJointAttach (dJointID, dBodyID body1, dBodyID body2)
| Attach the joint to some new bodies. If the joint is already attached, it will be detached from the old bodies first. To attach this joint to only one body, set body1 or body2 to zero - a zero body refers to the static environment. Setting both bodies to zero puts the joint into "limbo", i.e. it will have no effect on the simulation.
ODE_API void | dJointSetData (dJointID, void *data)
| Set the user-data pointer.
ODE_API void * | dJointGetData (dJointID)
| Get the user-data pointer.
ODE_API int | dJointGetType (dJointID)
| Get the type of the joint.
ODE_API dBodyID | dJointGetBody (dJointID, int index)
| Return the bodies that this joint connects.
ODE_API void | dJointSetFeedback (dJointID, dJointFeedback *)
| Sets the datastructure that is to receive the feedback.
ODE_API dJointFeedback * | dJointGetFeedback (dJointID)
| Gets the datastructure that is to receive the feedback.
ODE_API void | dJointSetBallAnchor (dJointID, dReal x, dReal y, dReal z)
| Set the joint anchor point. The joint will try to keep this point on each body together. The input is specified in world coordinates.
ODE_API void | dJointSetBallAnchor2 (dJointID, dReal x, dReal y, dReal z)
| Set the joint anchor point.
ODE_API void | dJointSetHingeAnchor (dJointID, dReal x, dReal y, dReal z)
| Set hinge anchor parameter.
ODE_API void | dJointSetHingeAxis (dJointID, dReal x, dReal y, dReal z)
| Set hinge axis.
ODE_API void | dJointSetHingeParam (dJointID, int parameter, dReal value)
| set joint parameter
ODE_API void | dJointAddHingeTorque (dJointID joint, dReal torque)
| Applies the torque about the hinge axis.
ODE_API void | dJointSetSliderAxis (dJointID, dReal x, dReal y, dReal z)
| set the joint axis
ODE_API void | dJointSetSliderAxisDelta (dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az)
ODE_API void | dJointSetSliderParam (dJointID, int parameter, dReal value)
| set joint parameter
ODE_API void | dJointAddSliderForce (dJointID joint, dReal force)
| Applies the given force in the slider's direction.
ODE_API void | dJointSetHinge2Anchor (dJointID, dReal x, dReal y, dReal z)
| set anchor
ODE_API void | dJointSetHinge2Axis1 (dJointID, dReal x, dReal y, dReal z)
| set axis
ODE_API void | dJointSetHinge2Axis2 (dJointID, dReal x, dReal y, dReal z)
| set axis
ODE_API void | dJointSetHinge2Param (dJointID, int parameter, dReal value)
| set joint parameter
ODE_API void | dJointAddHinge2Torques (dJointID joint, dReal torque1, dReal torque2)
| Applies torque1 about the hinge2's axis 1, torque2 about the hinge2's axis 2.
ODE_API void | dJointSetUniversalAnchor (dJointID, dReal x, dReal y, dReal z)
| set anchor
ODE_API void | dJointSetUniversalAxis1 (dJointID, dReal x, dReal y, dReal z)
| set axis
ODE_API void | dJointSetUniversalAxis2 (dJointID, dReal x, dReal y, dReal z)
| set axis
ODE_API void | dJointSetUniversalParam (dJointID, int parameter, dReal value)
| set joint parameter
ODE_API void | dJointAddUniversalTorques (dJointID joint, dReal torque1, dReal torque2)
| Applies torque1 about the universal's axis 1, torque2 about the universal's axis 2.
ODE_API void | dJointSetFixed (dJointID)
| Call this on the fixed joint after it has been attached to remember the current desired relative offset and desired relative rotation between the bodies.
ODE_API void | dJointSetAMotorNumAxes (dJointID, int num)
| set the nr of axes
ODE_API void | dJointSetAMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z)
| set axis
ODE_API void | dJointSetAMotorAngle (dJointID, int anum, dReal angle)
| Tell the AMotor what the current angle is along axis anum.
ODE_API void | dJointSetAMotorParam (dJointID, int parameter, dReal value)
| set joint parameter
ODE_API void | dJointSetAMotorMode (dJointID, int mode)
| set mode
ODE_API void | dJointAddAMotorTorques (dJointID, dReal torque1, dReal torque2, dReal torque3)
| Applies torque0 about the AMotor's axis 0, torque1 about the AMotor's axis 1, and torque2 about the AMotor's axis 2.
ODE_API void | dJointSetLMotorNumAxes (dJointID, int num)
| Set the number of axes that will be controlled by the LMotor.
ODE_API void | dJointSetLMotorAxis (dJointID, int anum, int rel, dReal x, dReal y, dReal z)
| Set the AMotor axes.
ODE_API void | dJointSetLMotorParam (dJointID, int parameter, dReal value)
| set joint parameter
ODE_API void | dJointGetHingeAnchor (dJointID, dVector3 result)
| Get the hinge anchor point, in world coordinates.
ODE_API void | dJointGetHingeAnchor2 (dJointID, dVector3 result)
| Get the joint anchor point, in world coordinates.
ODE_API void | dJointGetHingeAxis (dJointID, dVector3 result)
| get axis
ODE_API dReal | dJointGetHingeParam (dJointID, int parameter)
| get joint parameter
ODE_API dReal | dJointGetHingeAngle (dJointID)
| Get the hinge angle.
ODE_API dReal | dJointGetHingeAngleRate (dJointID)
| Get the hinge angle time derivative.
ODE_API dReal | dJointGetSliderPosition (dJointID)
| Get the slider linear position (i.e. the slider's extension).
ODE_API dReal | dJointGetSliderPositionRate (dJointID)
| Get the slider linear position's time derivative.
ODE_API void | dJointGetSliderAxis (dJointID, dVector3 result)
| Get the slider axis.
ODE_API dReal | dJointGetSliderParam (dJointID, int parameter)
| get joint parameter
ODE_API void | dJointGetHinge2Anchor (dJointID, dVector3 result)
| Get the joint anchor point, in world coordinates.
ODE_API void | dJointGetHinge2Anchor2 (dJointID, dVector3 result)
| Get the joint anchor point, in world coordinates. This returns the point on body 2. If the joint is perfectly satisfied, this will return the same value as dJointGetHinge2Anchor. If not, this value will be slightly different. This can be used, for example, to see how far the joint has come apart.
ODE_API void | dJointGetHinge2Axis1 (dJointID, dVector3 result)
| Get joint axis.
ODE_API void | dJointGetHinge2Axis2 (dJointID, dVector3 result)
| Get joint axis.
ODE_API dReal | dJointGetHinge2Param (dJointID, int parameter)
| get joint parameter
ODE_API dReal | dJointGetHinge2Angle1 (dJointID)
| Get angle.
ODE_API dReal | dJointGetHinge2Angle1Rate (dJointID)
| Get time derivative of angle.
ODE_API dReal | dJointGetHinge2Angle2Rate (dJointID)
| Get time derivative of angle.
ODE_API void | dJointGetUniversalAnchor (dJointID, dVector3 result)
| Get the joint anchor point, in world coordinates.
ODE_API void | dJointGetUniversalAnchor2 (dJointID, dVector3 result)
| Get the joint anchor point, in world coordinates.
ODE_API void | dJointGetUniversalAxis1 (dJointID, dVector3 result)
| Get axis.
ODE_API void | dJointGetUniversalAxis2 (dJointID, dVector3 result)
| Get axis.
ODE_API dReal | dJointGetUniversalParam (dJointID, int parameter)
| get joint parameter
ODE_API dReal | dJointGetUniversalAngle1 (dJointID)
| Get angle.
ODE_API dReal | dJointGetUniversalAngle2 (dJointID)
| Get angle.
ODE_API dReal | dJointGetUniversalAngle1Rate (dJointID)
| Get time derivative of angle.
ODE_API dReal | dJointGetUniversalAngle2Rate (dJointID)
| Get time derivative of angle.
ODE_API int | dJointGetAMotorNumAxes (dJointID)
| Get the number of angular axes that will be controlled by the AMotor.
ODE_API void | dJointGetAMotorAxis (dJointID, int anum, dVector3 result)
| Get the AMotor axes.
ODE_API int | dJointGetAMotorAxisRel (dJointID, int anum)
| Get axis.
ODE_API dReal | dJointGetAMotorAngle (dJointID, int anum)
| Get the current angle for axis.
ODE_API dReal | dJointGetAMotorAngleRate (dJointID, int anum)
| Get the current angle rate for axis anum.
ODE_API dReal | dJointGetAMotorParam (dJointID, int parameter)
| get joint parameter
ODE_API int | dJointGetAMotorMode (dJointID)
| Get the angular motor mode.
ODE_API int | dJointGetLMotorNumAxes (dJointID)
| Get nr of axes.
ODE_API void | dJointGetLMotorAxis (dJointID, int anum, dVector3 result)
| Get axis.
ODE_API dReal | dJointGetLMotorParam (dJointID, int parameter)
| get joint parameter
ODE_API dJointID | dConnectingJoint (dBodyID, dBodyID)
ODE_API int | dConnectingJointList (dBodyID, dBodyID, dJointID *)
ODE_API int | dAreConnected (dBodyID, dBodyID)
| Utility function.
ODE_API int | dAreConnectedExcluding (dBodyID, dBodyID, int joint_type)
| Utility function.

## Detailed Description

In real life a joint is something like a hinge, that is used to connect two objects. In ODE a joint is very similar: It is a relationship that is enforced between two bodies so that they can only have certain positions and orientations relative to each other. This relationship is called a constraint -- the words joint and constraint are often used interchangeably.

A joint has a set of parameters that can be set. These include:

- dParamLoStop Low stop angle or position. Setting this to -dInfinity (the default value) turns off the low stop. For rotational joints, this stop must be greater than -pi to be effective.
- dParamHiStop High stop angle or position. Setting this to dInfinity (the default value) turns off the high stop. For rotational joints, this stop must be less than pi to be effective. If the high stop is less than the low stop then both stops will be ineffective.
- dParamVel Desired motor velocity (this will be an angular or linear velocity).
- dParamFMax The maximum force or torque that the motor will use to achieve the desired velocity. This must always be greater than or equal to zero. Setting this to zero (the default value) turns off the motor.
- dParamFudgeFactor The current joint stop/motor implementation has a small problem: when the joint is at one stop and the motor is set to move it away from the stop, too much force may be applied for one time step, causing a ``jumping'' motion. This fudge factor is used to scale this excess force. It should have a value between zero and one (the default value). If the jumping motion is too visible in a joint, the value can be reduced. Making this value too small can prevent the motor from being able to move the joint away from a stop.
- dParamBounce The bouncyness of the stops. This is a restitution parameter in the range 0..1. 0 means the stops are not bouncy at all, 1 means maximum bouncyness.
- dParamCFM The constraint force mixing (CFM) value used when not at a stop.
- dParamStopERP The error reduction parameter (ERP) used by the stops.
- dParamStopCFM The constraint force mixing (CFM) value used by the stops. Together with the ERP value this can be used to get spongy or soft stops. Note that this is intended for unpowered joints, it does not really work as expected when a powered joint reaches its limit.
- dParamSuspensionERP Suspension error reduction parameter (ERP). Currently this is only implemented on the hinge-2 joint.
- dParamSuspensionCFM Suspension constraint force mixing (CFM) value. Currently this is only implemented on the hinge-2 joint.

If a particular parameter is not implemented by a given joint, setting it will have no effect. These parameter names can be optionally followed by a digit (2 or 3) to indicate the second or third set of parameters, e.g. for the second axis in a hinge-2 joint, or the third axis in an AMotor joint.

## Function Documentation

ODE_API int dAreConnected | ( | dBodyID | ,
|  | dBodyID |
| ) |

| Utility function. Returns: 1 if the two bodies are connected together by a joint, otherwise return 0.

ODE_API int dAreConnectedExcluding | ( | dBodyID | ,
|  | dBodyID | ,
|  | int | joint_type
| ) |

  | Utility function. Returns: 1 if the two bodies are connected together by a joint that does not have type {joint_type}, otherwise return 0. Parameters:
  | joint_type | is a dJointTypeXXX constant. This is useful for deciding whether to add contact joints between two bodies: if they are already connected by non-contact joints then it may not be appropriate to add contacts, however it is okay to add more contact between- bodies that already have contacts.

ODE_API void dJointAddAMotorTorques | ( | dJointID | ,
|  | dReal | torque1,
|  | dReal | torque2,
|  | dReal | torque3
| ) |

| Applies torque0 about the AMotor's axis 0, torque1 about the AMotor's axis 1, and torque2 about the AMotor's axis 2. Remarks: If the motor has fewer than three axes, the higher torques are ignored. This function is just a wrapper for dBodyAddTorque().

ODE_API void dJointAddHinge2Torques | ( | dJointID | joint,
|  | dReal | torque1,
|  | dReal | torque2
| ) |

| Applies torque1 about the hinge2's axis 1, torque2 about the hinge2's axis 2. Remarks: This function is just a wrapper for dBodyAddTorque().

ODE_API void dJointAddHingeTorque | ( | dJointID | joint,
|  | dReal | torque
| ) |

| Applies the torque about the hinge axis. That is, it applies a torque with specified magnitude in the direction of the hinge axis, to body 1, and with the same magnitude but in opposite direction to body 2. This function is just a wrapper for dBodyAddTorque()}

ODE_API void dJointAddSliderForce | ( | dJointID | joint,
|  | dReal | force
| ) |

| Applies the given force in the slider's direction. That is, it applies a force with specified magnitude, in the direction of slider's axis, to body1, and with the same magnitude but opposite direction to body2. This function is just a wrapper for dBodyAddForce().

ODE_API void dJointAddUniversalTorques | ( | dJointID | joint,
|  | dReal | torque1,
|  | dReal | torque2
| ) |

| Applies torque1 about the universal's axis 1, torque2 about the universal's axis 2. Remarks: This function is just a wrapper for dBodyAddTorque().

ODE_API void dJointAttach | ( | dJointID | ,
|  | dBodyID | body1,
|  | dBodyID | body2
| ) |

| Attach the joint to some new bodies. If the joint is already attached, it will be detached from the old bodies first. To attach this joint to only one body, set body1 or body2 to zero - a zero body refers to the static environment. Setting both bodies to zero puts the joint into "limbo", i.e. it will have no effect on the simulation. Remarks: Some joints, like hinge-2 need to be attached to two bodies to work.

ODE_API dJointID dJointCreateAMotor | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the A-motor type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateBall | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the ball type. Remarks: The joint is initially in "limbo" (i.e. it has no effect on the simulation) because it does not connect to any bodies. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateContact | ( | dWorldID | ,
|  | dJointGroupID | ,
|  | const dContact * |
| ) |

  | Create a new joint of the contact type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateFixed | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the fixed type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateHinge | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the hinge type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateHinge2 | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the hinge2 type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateLMotor | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the L-motor type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateSlider | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the slider type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dJointID dJointCreateUniversal | ( | dWorldID | ,
|  | dJointGroupID |
| ) |

  | Create a new joint of the universal type. Parameters:
  | dJointGroupID | set to 0 to allocate the joint normally. If it is nonzero the joint is allocated in the given joint group.

ODE_API dReal dJointGetAMotorAngle | ( | dJointID | ,
|  | int | anum
| ) |

| Get the current angle for axis. Remarks: In dAMotorUser mode this is simply the value that was set with dJointSetAMotorAngle(). In dAMotorEuler mode this is the corresponding euler angle.

ODE_API dReal dJointGetAMotorAngleRate | ( | dJointID | ,
|  | int | anum
| ) |

| Get the current angle rate for axis anum. Remarks: In dAMotorUser mode this is always zero, as not enough information is available. In dAMotorEuler mode this is the corresponding euler angle rate.

ODE_API void dJointGetAMotorAxis | ( | dJointID | ,
|  | int | anum,
|  | dVector3 | result
| ) |

  | Get the AMotor axes. Parameters:
  | anum | selects the axis to change (0,1 or 2).
  | rel | Each axis can have one of three ``relative orientation'' modes. 0: The axis is anchored to the global frame. 1: The axis is anchored to the first body. 2: The axis is anchored to the second body.

ODE_API int dJointGetAMotorAxisRel | ( | dJointID | ,
|  | int | anum
| ) |

| Get axis. Remarks: The axis vector is always specified in global coordinates regardless of the setting of rel. There are two GetAMotorAxis functions, one to return the axis and one to return the relative mode. For dAMotorEuler mode: Only axes 0 and 2 need to be set. Axis 1 will be determined automatically at each time step. Axes 0 and 2 must be perpendicular to each other. Axis 0 must be anchored to the first body, axis 2 must be anchored to the second body.

ODE_API int dJointGetAMotorMode | ( | dJointID |  | ) |

  | Get the angular motor mode. Parameters:
  | mode | must be one of the following constants: dAMotorUser The AMotor axes and joint angle settings are entirely controlled by the user. This is the default mode. dAMotorEuler Euler angles are automatically computed. The axis a1 is also automatically computed. The AMotor axes must be set correctly when in this mode, as described below. When this mode is initially set the current relative orientations of the bodies will correspond to all euler angles at zero.

ODE_API int dJointGetAMotorNumAxes | ( | dJointID |  | ) |

  | Get the number of angular axes that will be controlled by the AMotor. Parameters:
  | num | can range from 0 (which effectively deactivates the joint) to 3. This is automatically set to 3 in dAMotorEuler mode.

ODE_API dBodyID dJointGetBody | ( | dJointID | ,
|  | int | index
| ) |

  | Return the bodies that this joint connects. Parameters:
  | index | return the first (0) or second (1) body.
Remarks: If one of these returned body IDs is zero, the joint connects the other body to the static environment. If both body IDs are zero, the joint is in ``limbo'' and has no effect on the simulation.

ODE_API void dJointGetHinge2Anchor | ( | dJointID | ,
|  | dVector3 | result
| ) |

| Get the joint anchor point, in world coordinates. Returns: the point on body 1. If the joint is perfectly satisfied, this will be the same as the point on body 2.

ODE_API void dJointGetHingeAnchor | ( | dJointID | ,
|  | dVector3 | result
| ) |

| Get the hinge anchor point, in world coordinates. This returns the point on body 1. If the joint is perfectly satisfied, this will be the same as the point on body 2.

ODE_API void dJointGetHingeAnchor2 | ( | dJointID | ,
|  | dVector3 | result
| ) |

| Get the joint anchor point, in world coordinates. Returns: The point on body 2. If the joint is perfectly satisfied, this will return the same value as dJointGetHingeAnchor(). If not, this value will be slightly different. This can be used, for example, to see how far the joint has come apart.

ODE_API dReal dJointGetHingeAngle | ( | dJointID |  | ) |

| Get the hinge angle. The angle is measured between the two bodies, or between the body and the static environment. The angle will be between -pi..pi. When the hinge anchor or axis is set, the current position of the attached bodies is examined and that position will be the zero angle.

ODE_API dReal dJointGetSliderPosition | ( | dJointID |  | ) |

| Get the slider linear position (i.e. the slider's extension). When the axis is set, the current position of the attached bodies is examined and that position will be the zero position.

ODE_API int dJointGetType | ( | dJointID |  | ) |

| Get the type of the joint. Returns: the type, being one of these: JointTypeBall JointTypeHinge JointTypeSlider JointTypeContact JointTypeUniversal JointTypeHinge2 JointTypeFixed JointTypeAMotor JointTypeLMotor

ODE_API void dJointGetUniversalAnchor | ( | dJointID | ,
|  | dVector3 | result
| ) |

| Get the joint anchor point, in world coordinates. Returns: the point on body 1. If the joint is perfectly satisfied, this will be the same as the point on body 2.

ODE_API void dJointGetUniversalAnchor2 | ( | dJointID | ,
|  | dVector3 | result
| ) |

| Get the joint anchor point, in world coordinates. Returns: This returns the point on body 2. Remarks: You can think of the ball and socket part of a universal joint as trying to keep the result of dJointGetBallAnchor() and dJointGetBallAnchor2() the same. If the joint is perfectly satisfied, this function will return the same value as dJointGetUniversalAnchor() to within roundoff errors. dJointGetUniversalAnchor2() can be used, along with dJointGetUniversalAnchor(), to see how far the joint has come apart.

ODE_API dJointGroupID dJointGroupCreate | ( | int | max_size | ) |

  | Create a joint group. Parameters:
  | max_size | deprecated. Set to 0.

ODE_API void dJointSetAMotorAngle | ( | dJointID | ,
|  | int | anum,
|  | dReal | angle
| ) |

| Tell the AMotor what the current angle is along axis anum. This function should only be called in dAMotorUser mode, because in this mode the AMotor has no other way of knowing the joint angles. The angle information is needed if stops have been set along the axis, but it is not needed for axis motors.

ODE_API void dJointSetAMotorNumAxes | ( | dJointID | ,
|  | int | num
| ) |

  | set the nr of axes Parameters:
  | num | 0..3

ODE_API void dJointSetFeedback | ( | dJointID | ,
|  | dJointFeedback * |
| ) |

| Sets the datastructure that is to receive the feedback. The feedback can be used by the user, so that it is known how much force an individual joint exerts.

ODE_API void dJointSetLMotorAxis | ( | dJointID | ,
|  | int | anum,
|  | int | rel,
|  | dReal | x,
|  | dReal | y,
|  | dReal | z
| ) |

  | Set the AMotor axes. Parameters:
  | anum | selects the axis to change (0,1 or 2).
  | rel | Each axis can have one of three ``relative orientation'' modes 0: The axis is anchored to the global frame. 1: The axis is anchored to the first body. 2: The axis is anchored to the second body.
Remarks: The axis vector is always specified in global coordinates regardless of the setting of rel.

ODE_API void dJointSetLMotorNumAxes | ( | dJointID | ,
|  | int | num
| ) |

  | Set the number of axes that will be controlled by the LMotor. Parameters:
  | num | can range from 0 (which effectively deactivates the joint) to 3.