|
joint - distance, slider or hinge joint handle target# - finite rest length in metres (distance), translation in metres (slider), or angle in radians (hinge) |
|
Changes the resting target of a distance, slider or hinge joint without recreating it. For a distance joint, target is the unloaded distance between the two anchor points and must be positive. Box3D clamps very small lengths to its stable minimum. The initial target comes from CreatePhysicsDistanceJoint, including its automatic initial-distance calculation. For a slider, target is signed travel along the joint axis in metres, relative to its creation frames. Zero is the initial anchor alignment; a negative value moves in the opposite direction to the axis. For a hinge, target is a signed angle around the hinge axis, relative to its creation frames. Hinge targets must be between -Pi and Pi radians, inclusive; about 1.571 radians is 90 degrees. Slider and hinge targets initially equal zero. Use PhysicsJointSpring to enable the spring and choose frequency and damping. Changing a target does not enable the spring or alter those settings. On a distance joint with its spring disabled, the new target changes the rigid rod length. On sliders and hinges with their springs disabled, it is remembered for the next time the spring is enabled. The command wakes both connected bodies; call it when the target changes rather than every frame. The bodies move through physics on subsequent StepPhysics calls, rather than being teleported. Limits and motors remain in force, and gravity or other loads can prevent the body from resting exactly at the target. Invalid or stale handles, non-finite targets, non-positive distance lengths, out-of-range hinge angles, and ball or fixed joints raise a runtime error. See also: PhysicsJointSpring, CreatePhysicsDistanceJoint, CreatePhysicsSliderJoint, CreatePhysicsHingeJoint, PhysicsJointLimits. |
; PhysicsJointSpringTarget Example
; --------------------------------
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2
camera=CreateCamera()
PositionEntity camera,0,3,-7
RotateEntity camera,20,0,0
light=CreateLight()
RotateEntity light,45,-30,0
AmbientLight 60,60,60
; An independent Box3D world with standard gravity
world=CreatePhysicsWorld()
; Blue static floor
ground=CreateCube()
ScaleEntity ground,6,0.5,6
PositionEntity ground,0,-0.5,0
EntityColor ground,80,160,255
ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC)
ground_shape=PhysicsBodyBox(ground_body,12,1,12)
; A static post, and a door hinged to it on a vertical axis
post=CreateCube()
ScaleEntity post,0.1,1.5,0.1
PositionEntity post,-1.5,1.5,0
EntityColor post,150,150,160
post_body=CreatePhysicsBody(world,post,PHYSICS_STATIC)
post_shape=PhysicsBodyBox(post_body,0.2,3,0.2)
door=CreateCube()
ScaleEntity door,1.2,1.4,0.05
PositionEntity door,-0.2,1.5,0
EntityColor door,255,120,70
door_body=CreatePhysicsBody(world,door,PHYSICS_DYNAMIC)
door_shape=PhysicsBodyBox(door_body,2.4,2.8,0.1)
PhysicsBodyDamping door_body,0,1
hinge=CreatePhysicsHingeJoint(post_body,door_body,-1.4,1.5,0,0,1,0)
target#=0
; A spring closes the door again, like a self-closing hinge
PhysicsJointSpring hinge,True,0.5,0.3
While Not KeyDown(1)
; Space pushes the far edge of the door
If KeyHit(57)
TFormPoint 1,0,0,door,0
PhysicsBodyImpulseAt door_body,0,0,2,TFormedX(),TFormedY(),TFormedZ()
EndIf
; [ and ] move the angle the spring pulls the door towards
If KeyHit(26) Then target=target-0.25
If KeyHit(27) Then target=target+0.25
PhysicsJointSpringTarget hinge,target
StepPhysics world,1.0/60.0,4
; Arrow keys move the camera
If KeyDown(200) Then MoveEntity camera,0,0,0.1
If KeyDown(208) Then MoveEntity camera,0,0,-0.1
If KeyDown(203) Then TurnEntity camera,0,1,0
If KeyDown(205) Then TurnEntity camera,0,-1,0
RenderWorld
Text 0,0,"Arrow keys: move camera Space: push [ / ]: target Esc: exit"
Text 0,20,"PhysicsJointSpringTarget hinge,"+target
Text 0,40,"Door angle: "+PhysicsJointAngle(hinge)+" radians"
Flip
Wend
FreePhysicsWorld world
End