Apply Angular Torque to Ammo.js Rigid Body

This article explains how to apply angular torque to a rigid body in Ammo.js, the JavaScript port of the Bullet physics engine. You will learn the difference between continuous torque and torque impulses, how to wake up sleeping physics bodies, and how to write the exact code needed to make your 3D objects spin.

To make a rigid body spin in Ammo.js, you must apply rotational force using a three-dimensional vector (btVector3). This vector defines the axis of rotation and the strength of the force. Ammo.js provides two primary methods for this: applyTorque and applyTorqueImpulse.

Step 1: Activate the Rigid Body

Before applying any force or torque, you must activate the rigid body. Ammo.js puts objects to sleep (deactivates them) when they stop moving to save CPU cycles. If an object is sleeping, applying torque will have no effect.

rigidBody.activate();

Step 2: Define the Torque Vector

Create a btVector3 to represent the axis and magnitude of the spin. For example, to make an object spin around its Y-axis (upwards), define the Y value of the vector.

const torque = new Ammo.btVector3(0, 5.0, 0); 

Step 3: Choose the Right Method

Method A: Continuous Torque (applyTorque)

Use applyTorque if you want to apply a constant rotational force over time. Because this force is applied per physics step, you must call this method inside your physics simulation loop.

// Run this inside your render/physics update loop
rigidBody.activate();
rigidBody.applyTorque(torque);

Method B: Instant Spin (applyTorqueImpulse)

Use applyTorqueImpulse if you want to apply an instant burst of rotational energy, such as a sudden flick, an explosion, or a jump start. This only needs to be called once.

// Run this once to instantly spin the object
rigidBody.activate();
rigidBody.applyTorqueImpulse(torque);

Step 4: Clean Up Memory

Ammo.js is a C++ wrapper, meaning it does not automatically garbage collect objects created with the new keyword. To prevent memory leaks, you must destroy the torque vector once you are done using it.

Ammo.destroy(torque);