# Physics joints - disconnecting?

Hi all,

I realize a code sample would probably help but, in general: when/how can a physics joint (REVOLUTE type) become separated? It there some force calculation? If so, is there a flag I can set on the physics bodies or joint to prevent separation? I am sure that I’ve created the joint properly, and the separation behavior is not consistent. It will happen during one execution, and then not on the next. And more often the joint remains connected. But sometimes it doesn’t.

Thanks!

Look in the reference under physics.joint. There’s a variable called reactionForce. That might be what you’re after.

You didn’t provide an example, so here’s one of mine that uses REVOLUTE. Drag your finger around the screen. The joints stay connected. But then I don’t know how much force your putting on your joints.

``````displayMode(FULLSCREEN)

function setup()
physics.continuous=true
physics.gravity(0,0)
p1=physics.body(CIRCLE,10)
p1.x=200
p1.y=320

p2=physics.body(CIRCLE,5)
p2.x=200
p2.y=300
p3=physics.body(CIRCLE,5)
p3.x=130
p3.y=300
p4=physics.body(CIRCLE,5)
p4.x=270
p4.y=300

p5=physics.body(CIRCLE,5)
p5.x=200
p5.y=200
p6=physics.body(CIRCLE,5)
p6.x=100
p6.y=200
p7=physics.body(CIRCLE,5)
p7.x=300
p7.y=200
jnt1=physics.joint(REVOLUTE,p1,p2,p1.position)
jnt2=physics.joint(REVOLUTE,p2,p3,p2.position)
jnt3=physics.joint(REVOLUTE,p2,p4,p2.position)
jnt4=physics.joint(REVOLUTE,p2,p5,p2.position)
jnt5=physics.joint(REVOLUTE,p5,p6,p5.position)
jnt6=physics.joint(REVOLUTE,p5,p7,p5.position)
fill(255)
stroke(255)
strokeWidth(2)
end

function draw()
background(0)
ellipse(p1.x,p1.y,20)
ellipse(p2.x,p2.y,10)
ellipse(p3.x,p3.y,10)
ellipse(p4.x,p4.y,10)
ellipse(p5.x,p5.y,10)
ellipse(p6.x,p6.y,10)
ellipse(p7.x,p7.y,10)
line(p1.x,p1.y,p2.x,p2.y)
line(p2.x,p2.y,p3.x,p3.y)
line(p2.x,p2.y,p4.x,p4.y)
line(p2.x,p2.y,p5.x,p5.y)
line(p5.x,p5.y,p6.x,p6.y)
line(p5.x,p5.y,p7.x,p7.y)
end

function touched(t)
if t.state==MOVING then
p1.linearVelocity=vec2(t.deltaX*20,t.deltaY*20)
end
end
``````

Hey, @dave1707, I thought your revolute man needed some boundaries. It’s fun watching him dance around the screen.

``````-- Revolute-Man V2
-- Inspiration by: dave1707

-- Mods by Scotty

displayMode(STANDARD)

function setup()
print("Use touch to set Revolute-Man in motion.")

parameter.integer("use_accelerometer", 0, 1,0)

X = WIDTH/2
Y = HEIGHT/2
neck     =  20
arm      =  70
body     = 180
leg      = 100

physics.continuous=true
physics.gravity(0,-10)

p1=physics.body(CIRCLE,10)
p1.x=X
p1.y=Y

p2=physics.body(CIRCLE,5)
p2.x=X
p2.y=Y-neck

p3=physics.body(CIRCLE,5)
p3.x=X-arm
p3.y=Y-neck

p4=physics.body(CIRCLE,5)
p4.x=X+arm
p4.y=Y-neck

p5=physics.body(CIRCLE,5)
p5.x=X
p5.y=Y-neck-body

p6=physics.body(CIRCLE,5)
p6.x=X-leg
p6.y=Y-neck-body

p7=physics.body(CIRCLE,5)
p7.x=X+leg
p7.y=Y-neck-body

jnt1=physics.joint(REVOLUTE,p1,p2,p1.position)
jnt2=physics.joint(REVOLUTE,p2,p3,p2.position)
jnt3=physics.joint(REVOLUTE,p2,p4,p2.position)
jnt4=physics.joint(REVOLUTE,p2,p5,p2.position)
jnt5=physics.joint(REVOLUTE,p5,p6,p5.position)
jnt6=physics.joint(REVOLUTE,p5,p7,p5.position)

fill(255)
stroke(255)
strokeWidth(2)

lineWidth = 4
-- Draw a boarder, one pixel in, using the same values for vec2() and lines.
-- Going CCW around the screen we have:

LLX = lineWidth/2
LLY = lineWidth/2

LRX = WIDTH-lineWidth/2
LRY = lineWidth/2

URX = WIDTH-lineWidth/2
URY = HEIGHT-lineWidth/2

ULX = lineWidth/2
ULY = HEIGHT-lineWidth/2

CreateWalls() -- this will create all the required walls or bountries. CALLED FROM setup()

defaultGravity = physics.gravity()

end

function draw()

if use_accelerometer == 1 then
physics.gravity(Gravity)
else
physics.gravity(defaultGravity)
end

-- Draw Revolute-Man
background(0)
fill(255, 255, 255, 255)
stroke(255, 255, 255, 255)
strokeWidth(2)
ellipse(p1.x,p1.y,20)
--face
pushStyle()
fill(0, 0, 0, 255)
stroke(0, 0, 0, 255)
ellipse(p1.x+4,p1.y+4,4)
ellipse(p1.x-4,p1.y+4,4)
ellipse(p1.x,p1.y-4,8)
popStyle()
ellipse(p2.x,p2.y,10)
ellipse(p3.x,p3.y,10)
ellipse(p4.x,p4.y,10)
ellipse(p5.x,p5.y,10)
ellipse(p6.x,p6.y,10)
ellipse(p7.x,p7.y,10)

line(p1.x,p1.y-8,p2.x,p2.y)
line(p2.x,p2.y,p3.x,p3.y)
line(p2.x,p2.y,p4.x,p4.y)
line(p2.x,p2.y,p5.x,p5.y)
line(p5.x,p5.y,p6.x,p6.y)
line(p5.x,p5.y,p7.x,p7.y)

-- Draw four sides (different colors so you know what's going on)
strokeWidth(lineWidth)
stroke(255, 0, 0, 255)
line(LLX,LLY,LRX,LRY) -- sending same two x,y pairs as sent to CreateWall()
stroke(255, 0, 204, 255)
line(LRX,LRY,URX,URY)
stroke(134, 0, 255, 255)
line(URX,URY,ULX,ULY)
stroke(0, 255, 55, 255)
line(ULX,ULY,LLX,LLY)

end

function touched(t)
if t.state==MOVING then
p5.linearVelocity=vec2(t.deltaX*20,t.deltaY*20)
end
end

-- I can't take full credit for the following two functions.
-- This function() calls CreateWall() which in turn creates a physical edge-type body.
-- Sending the same values as you would use to draw lines on top of the edges.
function CreateWalls()
local r=2.5
leftWall   = CreateWall(LLX,LLY,ULX,ULY,r) -- sending two x,y pairs and restitution
rightWall  = CreateWall(LRX,LRY,URX,URY,r)
bottomWall = CreateWall(LLX,LLY,LRX,LRY,r)
topWall    = CreateWall(ULX,ULY,URX,URY,r)
end

-- This function() does the actual creation of a physical edge-type body.
-- Line locs are converted into vecs().
function CreateWall(x,y,x1,y1,r)
local w = physics.body(EDGE,vec2(x,y),vec2(x1,y1)) -- using two vec2() pairs
w.restitution=r
return w
end
``````

@Scotty I like it. Makes it a lot more interesting to watch.

Thanks