# Revision history [back]

This is a big question! If you're willing to build the underlying physics engines from source, I think you can change just about anything. Here's a list of approaches you can take for osrf/gazebo (I will leave discussion of ignition for a follow-up post):

1. To add functionality using the gazebo::physics APIs that are agnostic of physics engine, you can write a ModelPlugin or WorldPlugin. See the HarnessPlugin for example.

2. You can also write plugins that are specific to certain physics engines if the gazebo::physics API is not enough. For example, the WheelSlipPlugin uses ODE slip parameters that aren't broadly exposed by the gazebo::physics API.

3. To change the way Gazebo interfaces its gazebo::physics APIs with a physics engine, modify the files in the sub-folders like gazebo/physics/dart or gazebo/physics/bullet. For example, see some changes to support of kinematic loops in DART in bitbucket pull request 3086 merged in osrf/gazebo@bee69082.

4. To modify the way a physics engine works, you can build it from source. The easiest example of this is by modifying our fork of Open Dynamics Engine in the deps/opende folder. For example see a modification of the Gearbox joint in our ODE fork in bitbucket pull request 3073 merged in osrf/gazebo@e11215a7. There are some old instructions for building the other physics engines from source using a catkin workspace, though I would now recommend using a colcon workspace.

5. Adding or modifying the gazebo::physics API that is agnostic of physics engine is a bigger endeavor since it may require modifying the interfaces to all the supported physics engines.