From 52b972167a977179d68ff5938596c40757f23aa3 Mon Sep 17 00:00:00 2001 From: ecker Date: Fri, 22 May 2026 22:23:42 -0500 Subject: [PATCH] body_medium_impact_hard6.wav (ragdoll works) --- bin/data/entities/scripts/player.lua | 29 +++++++++++++----------- bin/data/entities/scripts/ragdoll.lua | 2 +- engine/src/ext/lua/usertypes/physics.cpp | 8 +++---- engine/src/utils/math/physics/impl.cpp | 2 +- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/bin/data/entities/scripts/player.lua b/bin/data/entities/scripts/player.lua index c2291466..bc4a5ba4 100644 --- a/bin/data/entities/scripts/player.lua +++ b/bin/data/entities/scripts/player.lua @@ -206,19 +206,20 @@ ent:bind( "tick", function(self) local forward = flattenedTransform.forward * heldObject.distance --flattenedTransform.orientation:rotate( Vector3f(0,0,1) ) if heldObject.smoothSpeed ~= 0 then - local target = flattenedTransform.position + forward - local offset = target - heldObjectTransform.position - local delta = offset * time.delta() * heldObject.smoothSpeed + local heldObjectFlattened = heldObjectTransform:flatten() - local distance = delta:norm() - if distance > 0.001 then - if timers.holp:elapsed() > 0.125 then - timers.holp:reset() - heldObjectPhysicsBody:setVelocity( delta * 20 ) - end - else - heldObjectPhysicsBody:setVelocity( Vector3f(0,0,0) ) - end + local target = flattenedTransform.position + forward + local offset = target - heldObjectFlattened.position + + local stiffness = 15.0 + local damping = 2.0 + local currentVelocity = heldObjectPhysicsBody:getVelocity() + local mass = heldObjectPhysicsBody:getMass() + + local springForce = offset * stiffness + local dampingForce = currentVelocity * -damping + + heldObjectPhysicsBody:applyImpulse((springForce + dampingForce) * mass * time.delta()) else heldObjectTransform.position = flattenedTransform.position + forward end @@ -236,7 +237,9 @@ ent:addHook( "entity:Use.%UID%", function( payload ) local propMetadata = prop:getComponent("Metadata") if propMetadata["holdable"] then validUse = true - local offset = transform.position - prop:getComponent("Transform").position + local heldObjectTransform = prop:getComponent("Transform") + local heldObjectFlattened = heldObjectTransform:flatten() + local offset = transform.position - heldObjectFlattened.position heldObject.uid = payload.uid heldObject.distance = offset:norm() diff --git a/bin/data/entities/scripts/ragdoll.lua b/bin/data/entities/scripts/ragdoll.lua index 4b1031c4..ec28c9ee 100644 --- a/bin/data/entities/scripts/ragdoll.lua +++ b/bin/data/entities/scripts/ragdoll.lua @@ -56,7 +56,7 @@ for k, _ in pairs( bodies ) do body = physics.create( child, mass ) body:asObb( OBB( Vector3f(), extent ) ) - body:setGravity( Vector3f( 0, 0, 0 ) ) + --body:setGravity( Vector3f( 0, 0, 0 ) ) children[k] = child bodies[k] = body diff --git a/engine/src/ext/lua/usertypes/physics.cpp b/engine/src/ext/lua/usertypes/physics.cpp index 474cdfd7..90422adc 100644 --- a/engine/src/ext/lua/usertypes/physics.cpp +++ b/engine/src/ext/lua/usertypes/physics.cpp @@ -5,8 +5,8 @@ namespace binds { namespace body { bool initialized( pod::PhysicsBody& self ) { return !!self.world; } - pod::Vector3f& velocity( pod::PhysicsBody& self ) { return self.velocity; } - pod::Vector3f& angularVelocity( pod::PhysicsBody& self ) { return self.angularVelocity; } + pod::Vector3f& getVelocity( pod::PhysicsBody& self ) { return self.velocity; } + pod::Vector3f& getAngularVelocity( pod::PhysicsBody& self ) { return self.angularVelocity; } void setVelocity( pod::PhysicsBody& self, const pod::Vector3f& v ) { uf::physics::setVelocity( self, v ); } void setAngularVelocity( pod::PhysicsBody& self, const pod::Quaternion<>& q, float dt = 0 ) { uf::physics::setAngularVelocity( self, q, dt ); } @@ -194,12 +194,12 @@ UF_LUA_REGISTER_USERTYPE_AND_COMPONENT(pod::Ray, UF_LUA_REGISTER_USERTYPE_AND_COMPONENT(pod::PhysicsBody, UF_LUA_REGISTER_USERTYPE_DEFINE( initialized, UF_LUA_C_FUN(::binds::body::initialized) ), - UF_LUA_REGISTER_USERTYPE_MEMBER( pod::PhysicsBody::velocity ), - UF_LUA_REGISTER_USERTYPE_MEMBER( pod::PhysicsBody::angularVelocity ), + UF_LUA_REGISTER_USERTYPE_DEFINE( getVelocity, UF_LUA_C_FUN(::binds::body::getVelocity) ), UF_LUA_REGISTER_USERTYPE_DEFINE( setVelocity, UF_LUA_C_FUN(::binds::body::setVelocity) ), UF_LUA_REGISTER_USERTYPE_DEFINE( applyVelocity, UF_LUA_C_FUN(::binds::body::applyVelocity) ), + UF_LUA_REGISTER_USERTYPE_DEFINE( getAngularVelocity, UF_LUA_C_FUN(::binds::body::getAngularVelocity) ), UF_LUA_REGISTER_USERTYPE_DEFINE( setAngularVelocity, UF_LUA_C_FUN(::binds::body::setAngularVelocity) ), UF_LUA_REGISTER_USERTYPE_DEFINE( applyAngularVelocity, UF_LUA_C_FUN(::binds::body::applyAngularVelocity) ), diff --git a/engine/src/utils/math/physics/impl.cpp b/engine/src/utils/math/physics/impl.cpp index 57fb7a22..3708c21d 100644 --- a/engine/src/utils/math/physics/impl.cpp +++ b/engine/src/utils/math/physics/impl.cpp @@ -9,7 +9,7 @@ #include -#define UF_PHYSICS_TEST 1 +#define UF_PHYSICS_TEST 0 pod::PhysicsSettings uf::physics::settings;