Saloon Door

SourceEdit
-- Saloon doors attached with hinge joint to frame, and with distance joint to each other

local world
local door1, door2

function lovr.load()
  world = lovr.physics.newWorld(0, -9.8, 0, false)
  -- a static geometry that functions as door frame
  local frame = world:newBoxCollider(vec3(0, -0.1, -1), vec3(2.2, 0.05, 0.2))
  frame:setKinematic(true)
  door1 = world:newBoxCollider(vec3( 0.55, 0.5, -1), vec3(1, 1, 0.2))
  door2 = world:newBoxCollider(vec3(-0.55, 0.5, -1), vec3(1, 1, 0.2))
  door1:setAngularDamping(0.01)
  door2:setAngularDamping(0.01)
  -- attach doors to frame, with hinges being oriented vertically (up vector is 0,1,0)
  lovr.physics.newHingeJoint(frame, door1, vec3( 1, 0, -1), vec3(0,1,0))
  lovr.physics.newHingeJoint(frame, door2, vec3(-1, 0, -1), vec3(0,1,0))
  -- model door springiness by attaching loose distance joint between two doors
  local joint = lovr.physics.newDistanceJoint(door1, door2, vec3(door1:getPosition()), vec3(door2:getPosition()))
  joint:setTightness(0.2)
  joint:setResponseTime(10)
  lovr.graphics.setBackgroundColor(0.1, 0.1, 0.1)
end

function lovr.draw(pass)
  for i, boxCollider in ipairs(world:getColliders()) do
    pass:setColor(i / 3, i / 3, i / 3)
    local pose = mat4(boxCollider:getPose())
    local size = vec3(boxCollider:getShapes()[1]:getDimensions())
    pass:box(pose:scale(size))
  end
end

function lovr.update(dt)
  world:update(dt)
  -- every few seconds simulate a push
  if lovr.timer.getTime() % 3 < dt then
    door1:applyForce(0, 0, -50)
    door2:applyForce(0, 0, -50)
  end
end