require 'honey.std' return function(entities, id, dt) local self = honey.ecs.Accessor(entities, id) local pressed = function(key) return glfw.GetKey(window.win, key) == glfw.PRESS end local float = self.node._child.spring.spring.F ode.BodyAddForce(self.physics._body, 0, float, 0) self.node._child.spring.spring.F = 0 local yaw = math.rad( self.node._child.p .node._child.pivot .pitchyaw.yaw) local forward = Vec3{-math.sin(yaw), 0, -math.cos(yaw)} local left = Vec3{-math.cos(yaw), 0, math.sin(yaw)} local vel = Vec3{0,0,0} if pressed(glfw.KEY_W) then vel = vel + forward end if pressed(glfw.KEY_A) then vel = vel + left end if pressed(glfw.KEY_S) then vel = vel - forward end if pressed(glfw.KEY_D) then vel = vel - left end vel = 2000 * vel:normalize() x, y, z = ode.BodyGetLinearVel(self.physics._body) if Vec3{x,y,z}:norm2() < 500 then ode.BodyAddForce(self.physics._body, vel[1], vel[2], vel[3]) end -- slow down local horizontalDamping = 100 local verticalDamping = 5 ode.BodyAddForce(self.physics._body, -horizontalDamping*x, -verticalDamping*y, -horizontalDamping*z) if y < 0.3 and float > 0 then ode.BodySetLinearVel(self.physics._body, x, 0, z) end end