Garry's Mod Wiki

Revision Difference

PhysObj:ApplyForceCenter#546422

<function name="ApplyForceCenter" parent="PhysObj" type="classfunc"> <description> Applies the specified impulse in the mass center of the physics object. <note>This will not work on players, use <page>Entity:SetVelocity</page> instead.</note> </description> <realm>Shared</realm> <args> <arg name="impulse" type="Vector">The [impulse](https://en.wikipedia.org/wiki/Impulse_(physics)) to be applied in `kg*source_unit/s`. (The vector is in world frame)</arg> </args> </function> <example> <description> An entity that simulates its own gravity by applying a force downward on the entity based on the force equation: `(Force = mass * acceleration)` Since, by default, entities already have gravity, the default gravity must be turned off by adding `phys:EnableGravity(false)` in the entity's <page text="Initialize">ENTITY:Initialize</page> function so that the default gravity doesn't interfere with our custom gravity. **NOTE**: We can get the mass of the entity by using the <page>PhysObj:GetMass</page> function. <note>-9.80665 (meters / second ^ 2) Is the approximate acceleration of objects on Earth due to gravity. (It is negative because gravity pushes things downwards.)</note> <note>Considering that the unit of the impulse that ApplyForceCenter accepts is kg*source_unit / s, we have to do unit conversion: 1 meter ≈ 39.37 source units ([on entity scale](https://developer.valvesoftware.com/wiki/Dimensions#Source_Engine_Scale_Calculations))</note> </description> <code> function ENT:Initialize() self:SetModel( "models/hunter/blocks/cube1x1x1.mdl" ) self:PhysicsInit( SOLID_VPHYSICS ) self:SetSolid( SOLID_VPHYSICS ) self:SetMoveType( MOVETYPE_VPHYSICS ) local phys = self:GetPhysicsObject() if phys:IsValid() then phys:EnableGravity( false ) -- This is required. Since we are creating our own gravity. phys:Wake() end end function ENT:PhysicsUpdate( phys ) local force = phys:GetMass() * Vector( 0, 0, -9.80665 ) * 39.37⤶ local dt = engine.TickInterval() phys:ApplyForceCenter( force * dt )⤶ local force = phys:GetMass() * Vector( 0, 0, -9.80665 ) * 39.37 -- This gives us the force in kg*source_unit/s^2⤶ local dt = engine.TickInterval() -- The time interval over which the force acts on the object (in seconds) phys:ApplyForceCenter( force * dt ) -- Multiplying the two gives us the impulse in kg*source_unit/s⤶ end </code> </example>