# Physics in Video Games, Apply Torque to Angular Acceleration

I am working on a top driver game project in 2d. I want to manage all physics myself. Im working with this book: http://www.amazon.fr/Game-Physics-Engine-Development-Commercial-Grade/dp/0123819768 for physics implementation.

From now on, my physics engine can handle force on different axes. But I have some problems to simulate the rotation correctly. I am trying to implement some torque to find angular acceleration. So I applied the inertia tensor matrix:

``````setMass(400.f);
Matrix3 it;
it.setBlockInertiaTensor(Vector3(2, 1, 1), 400);
setInertiaTensor(it);

void setBlockInertiaTensor(const Vector3 &halfSizes, float mass)
{
Vector3 squares = halfSizes.componentProduct(halfSizes);
setInertiaTensorCoeffs(0.3f*mass*(squares.y + squares.z),
0.3f*mass*(squares.x + squares.z),
0.3f*mass*(squares.x + squares.y));
}
```

```

To apply torque, I apply force at a point on the body of my car, and I find torque by the transverse product:

``````player->addForceAtBodyPoint(Vector3(-2000, 1000, 0), Vector3(0, 100, 0));

void AObject::addForceAtBodyPoint(const Vector3 &force, const Vector3 &point)
{
Vector3 pt = getPointInWorldSpace(point);
}

const Vector3 &point)
{
// Convert to coordinates relative to center of mass.
Vector3 pt = point;
pt -= _position;

_forceAccumulate += force;
_torqueAccumulate += pt % force;
//std::cout << "torque x " << pt.x << " y " << pt.y  <<  " z "<< pt.z <<  std::endl;
}

Vector3 Vector3::operator%(const Vector3 &vector) const
{
return Vector3(y*vector.z - z*vector.y,
z*vector.x - x*vector.z,
x*vector.y - y*vector.x);
}
```

```

(Modulo% - cross product)

And finally, I am doing all data integration:

``````void    Player::integrate(float deltaTime)
{

// Calculate linear acceleration from force inputs.
_lastFrameAcceleration = _acceleration;
// Calculate angular acceleration from torque inputs.
Vector3 angularAcceleration = _inverseInertiaTensorWorld.transform(_torqueAccumulate);
// Update linear velocity from acceleration .
// Update angular velocity from  acceleration .
// Impose drag.
_velocity *= pow(_linearDamping, deltaTime);
_rotation *= pow(_angularDamping, deltaTime);
// Update linear position.
_position.z = 0;
// Update angular position
// Normalise the orientation, and update the matrice
calculateWorldLocalData();
// Clear accumulators.
clearAccumulator();
}
```

```

And orientation doesn't work at all. I am not that good at physics, so I think I misunderstand the physical implementation of torque with tensor of inertia ...

+3

source to share

If your game is top-down in 2D, you can only have a rotation in the Z direction. I.E. inside and outside the screen. This way you can simplify your task and avoid 3D tensors. In this case, in your car class, I will have a private variable called rotation. eg.

``````private:
double angle;
double tourque;
public:
void updateTorque(*some way of passing forces*)
{
double total_t = 0;
for each force
{
double t = use cosine and length to point to generate a tourque
total_t = t + total_t
}
}
void update_angle // place your integration routine here and call once per loop
```

```
+1

source

All Articles