## Modelling Tank Velocity

Member
Posts: 24
Joined: 2008.01
Post: #1
Hi guys. I've started working on a 3D tank game in OpenGL and I need some advice on how to model the speed and direction of the tank based on the speed of it's two tracks.

This is a C++ project and I'm fairly confident with vector math and trig. The tank's left and right tracks can be controlled independently (ie. accelerated or even reversed). When both tracks are engaged are full speed, the tank should move forward. If the left track is spinning faster than the right track, the tank should move forward while turning to the right. Likewise, if the left track is reversed and the right track is at full speed, the tank should turn on the spot towards the left. Just like a real tank

I need some advice on how to model this. Each track has it's own speed and the tank itself has a position and a direction vector.

One idea - give each track a vector facing away from the tank's center position (ie. left and right) and increase the length as that track accelerates. Then build the direction vector from the sum of the two?

I'm sure this sort of thing has been done before
Member
Posts: 283
Joined: 2006.05
Post: #2
Ugh... this sounds like a tough one to get right, because as the difference between the two track speeds changes the centre of rotation changes. i.e. if the left track has speed -1 and the right track has speed +1 it rotates about the very centre of the two. But if left = +1 and right = 0 it rotates about the centre of the right track.

I don't have any idea how to help you. Just wanted to make life more difficult for anyone that wants to try.
Moderator
Posts: 1,140
Joined: 2005.07
Post: #3
You can think of the treads as 2 vectors on either side of the center of the tank, and connected by a bar at the middle. For example, in ASCII it would look something like this:
Code:
```| | |_| | | | |```
To calculate the total forward motion, you add the vectors of the 2 tracks. To calculate the rotation, you need to do the torque on the bar in the center. The bar is the simplest to calculate, but a box would probably be more correct for angular momentum. Of course, you could also just scale it as necessary, since game physics are all about approximations.
Member
Posts: 338
Joined: 2004.07
Post: #4
If I were modeling it, I'd probably fudge the physics a little bit.

So you have the two treads, and the speed for each can be any value between a min and a max (say -1 and +1.) At rest, these values are 0. +1 is full speed ahead, and -1 is full reverse.

The tank itself has its speed and orientation. For the speed (along the orientation) just sum the values of the two vectors. (You could also have a tank speed variable somewhere you could multiply by.) Example:

Tank speed = 10.0

Both treads forward: (1 + 1) * 10.0 = 20.0
One tread forward, one back: (1 + -1) * 10.0 = 0
Both treads back: (-1 + -1) * 10.0 = -20.0

For orientation, I would take the difference between those two values, and again, multiply by some turn speed.

Tank turn speed = 5.0

So both treads equal: (x - x) * 5.0 = 0
Left tread forward, right back: (1 - (-1)) * 5.0 = 10.0 (positive = right turn)
Right tread forward, left back: (-1 - 1) * 5.0 = -10.0 (negative = left turn)
Right tread forward, left at rest: (-1 - 0) * 5.0 = -5.0 (slight left turn)

That gives you an angular velocity which you can apply to your orientation.

Justin Ficarrotta
http://www.justinfic.com
"It is better to be The Man than to work for The Man." - Alexander Seropian
Member
Posts: 24
Joined: 2008.01
Post: #5
Thankyou very much for your help guys! I'll try out these ideas and I'll let you know how I get on.
Member
Posts: 24
Joined: 2008.01
Post: #6
JustinFic - I tried out your idea and with a little tweaking it works great! Thanks.

At some point I may need to implement real torque rotation but for now this works and looks fine.