Kinematic resolving on moving objects

Hey there, I posted a question days ago, partially I solved the problem. But there is another one, I got a ball and a ground. Ground is moving vertically up to bottom and bottom to up. So when the ball jumps and hits the ground, because of the moving ground ball cannot fix y position so it does not touch the ground. How can I fix it any idea?

What do you mean by this? How are you resolving the kinematic collision?


may you look at this topic that I created few days ago, you will understand what is fixing y position. The last code that I used is there :

local gravity = -70
local jump_takeoff_speed = 1500

function init(self)
	msg.post(".", "acquire_input_focus")

	self.position = go.get_position()
	self.velocity = vmath.vector3(0, 0, 0)
	self.ground_contact = false
end

function final(self)
	msg.post(".", "release_input_focus")
end

function update(self, dt)
	local gravity = vmath.vector3(0, gravity, 0)

	if not self.ground_contact then
		-- Apply gravity if there's no ground contact
		self.velocity = self.velocity + gravity
	end

	-- apply velocity to the player character
	self.velocity.x = 0
	go.set_position(go.get_position() + self.velocity * dt)

	-- reset volatile state
	self.correction = vmath.vector3()
	self.ground_contact = false
end

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
	comp.x = 0
	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.5 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

function on_message(self, message_id, message, sender)
	if message_id == hash("contact_point_response") then
		-- check if we received a contact point message. One message for each contact point
		if message.group == hash("brick") then
			self.ground_contact = true
			handle_geometry_contact(self, message.normal, message.distance)
		end
	end
end

local function jump(self)
	-- only allow jump from ground
	if self.ground_contact then
		-- set take-off speed
		self.velocity.y = jump_takeoff_speed
	end
end

local function abort_jump(self)
	-- cut the jump short if we are still going up
	if self.velocity.y > 0 then
		-- scale down the upwards speed
		self.velocity.y = self.velocity.y * 0.5
	end
end

function on_input(self, action_id, action)
	if action_id == hash("jump") or action_id == hash("touch") then
		if action.pressed then
			jump(self)
		elseif action.released then
			abort_jump(self)
		end
	end
end

Ok, but what is the problem? What is not working as expected? Try to explain it in text or post screenshots or a video.

1 Like