NVIDIA-Omniverse / PhysX

NVIDIA PhysX SDK
BSD 3-Clause "New" or "Revised" License
2.54k stars 360 forks source link

Mechanical energy is lost when setting initial velocities or applying impulses #308

Open paulsinnett opened 1 month ago

paulsinnett commented 1 month ago

Library and Version

PhysX v5.4.1

Operating System

Windows 11

Steps to Trigger Behavior

  1. Download this sample program
  2. Compile and debug
  3. Examine the output

Expected Behavior

The mechanical energy (kinetic energy + potential energy) should remain constant.

Actual Behavior

A significant amount of energy is lost during the simulation which causes the ball to fall short of its intended height by about 4cm.

Investigation

This appears to be caused by a lag in the velocity value compared to the position. If the calculation of mechanical energy is adjusted for this lag, the energy remains constant throughout the simulation (however, the same loss shows immediately after the first frame.) If a correcting velocity value is calculated to cancel out the difference during the first frame, the simulation runs without any appreciable energy loss and the ball reaches the target height. This correction is included in the sample program.

paulsinnett commented 1 month ago

I have created a simplified physics integrator to play with solutions to this issue. I think it can be handled fairly transparently by adjusting how bodies are updated on the first update after waking. Technically this is known as the leapfrog method, but really all that means is adjusting the accelerations applied during the first update frame.

https://github.com/paulsinnett/SymplecticIntegrator