Handling Geometry Contact : Algorithm Explication

Here is a function I use a lot (I think I stole it from @britzl 's projects

local function handle_geometry_contact(self, normal, distance) 
	-- project the correction vector onto the contact normal
	-- (the correction vector is the 0-vector for the first contact point)
	local proj = vmath.dot(self.correction, normal)
	-- calculate the compensation we need to make for this contact point
	local comp = (distance - proj) * normal
	-- add it to the correction vector
	self.correction = self.correction + comp
	-- apply the compensation to the player character
	go.set_position(go.get_position() + comp)
	-- check if the normal points enough up to consider the player standing on the ground
	-- (0.7 is roughly equal to 45 degrees deviation from pure vertical direction)
	if normal.y > 0.7 then
		self.ground_contact = true
	end
	-- project the velocity onto the normal
	proj = vmath.dot(self.velocity, normal)
	-- if the projection is negative, it means that some of the velocity points towards the contact point
	if proj < 0 then
		-- remove that component in that case
		self.velocity = self.velocity - proj * normal
	end
end

So this function calculate the force necessary for an object to stay on the geometry level.
Can someone explain how does the vector algebra works in this case ?

There’s at least a partial explanation here (where the code originates from): https://www.defold.com/tutorials/platformer/#_collision_response

1 Like

Thanks, yes it was helpful.
In the meantime I found explanations on the vector correction part :