Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# A tough one, Game

Posted on 2000-04-17
Medium Priority
355 Views
I've got a networked driving game that drives cars around a 3D(DirectX) arena bounded by a wall. The problem is that while I can detect if one of the corners of the has hit a wall I can't figure out the maths of what how the car reacts afterwards.

All I can do successfully a straight bounce so that the reflected angle equals the incident angle. The problem lies in the left-hand co-ordinate system, which puts 90degrees to the left, but by calculation sin(90) is to the right as normal.

This is the code so far.
//Calculate the incidint angle
D3DVALUE iAngle = (1.570796f - 6.28318f - m_pBoids[0].fYaw - d3dApp.wallAngles[wallID]);

//calculate new angle
m_pBoids[0].fYaw += iAngle *2 ;
m_pBoids[0].fYaw = m_pBoids[0].fYaw - 6.28318f * (int)(m_pBoids[0].fYaw / 6.28318f);
if(m_pBoids[0].fYaw < 0)
m_pBoids[0].fYaw += 6.28318f;

There are 120 panels in the wall, and the angle of the panel hit is gotten using wallID.
The m_pBoids array is the array of cars.
A D3DVALUE is the same as a float.
The constants you see here are radian values e.g. 6.28318f = 360degrees

How do I calculate the angle car will end up in giving rough car collision dynamics and physics?

0
Question by:ajmcgarry
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 13
• 9

LVL 22

Accepted Solution

nietod earned 800 total points
ID: 2724338
its hard to understandand the meaning of what you have so far.

But what you want to do is to breakt he car's velocity vector into 2 component vectors.  One that is parallel to the wall and one that is at right angles to the wall.  You leave the component vector that is parallel to the wall unaltered and you reverse the sign of the component vector that is perpendicar.  Then you combine these two component vectors to get the velocity vector after the collision.

I'll try to post an example shortly.
0

LVL 22

Expert Comment

ID: 2724365
Actually, that seems to be kind of trivial, since you are not loosing mementum in this case (you are assuming a perfectly elastic colission)  so iin this case the velocity has the same magnitude and the direction is simply 90-the incident angle.

It might help if you were clearer about what figures you are working with and what figures you what to obtain,

but from what I can gather the only thing you are concerned about is the directionl (the speed doesn't change) so in this case the new velocity direction will be the wall's angle plus 180 minus the incident angle where the incident angle is the angle between the incomining velocity and the perpendicular to the wall.
0

LVL 22

Expert Comment

ID: 2724369
Opps that should be plus 90
0

LVL 2

Author Comment

ID: 2724427
Thanks for the quick reply nietod,

I am actually worried about momentum but to keep things simple I left it out of the question.

If the incident angle is greater than 72degrees, roughly the angle through the opposite corner wheel, then the car should turn inwards, otherwise the car should turn outwards. Also because of the compression of the cars impact the resultant angle is not 90-incident.

I have to apply this to car to car collisions later, then I'll have fun.

Obviously the loss in momentum is equal to the (speed before)*cos(incident Angle)
0

LVL 2

Author Comment

ID: 2724441
The root of the problem is the reverse angle system, otherwise I could do it myself. It took me ages to come up with what I have. I allow it to always go minus and then make up the difference by adding 360 till its positive.
0

LVL 22

Expert Comment

ID: 2724577
Can you explain to me the coordinate system you are using.  This "reverse angle" term is not familiar.   I guess I need to know

How is the wall angle specified (relative to what)
How is the car's velicity specified (angle (relative to what) and speed, or components).

Do you wish to absorb some energy in an impact, i.e have a loss of momentum?  There is a way to do that ithat will look good, without being to difficult, though I doubt it is scientifically accurate.  (I'm not sure...)  For this you will have to break the velocity into component vectors, then when you flip the sign of the perpendicular vector, you will also make it a little smaller, Maybe by about 50% or so, you'll have to play with the figure to see what you like.  What this does is allow the car to carry the same speed parallel to the wall, but loose speed perpendicular to the wall.  I guess that is what would happen if you hit a frictionless wall.  That tends to be the sort of algorithm used in games.

I'll be off line for a few (2-3) hours.  If you can give me a better idea of what you have to work with, and what you want (if you want to loose momentum) I can get you the equations.
0

LVL 2

Author Comment

ID: 2726336
0

/\
270      ||       90
--
car at 0

180

Car is at 0 when faces the wall at 0 (straight up)

But the car is at 270 when it faces the wall at 90. i.e. the cars angle system is the reverse of the walls.

I didn't program it this way it was a friend, the two of us are doing the game.
It was the only way he could get the rotational matrices to work.

The cars velocity and angle is relative to itself.
The angle of the walls are relative to the world.

The cars velocity is calculated using a
float for speed               (fSpeed)
float for angular direction   (fYaw)
Combined these give a single directonal vector.

As I said before I do want a loss of momentum, and like you said, what look good rather than what is scientifically sound.
0

LVL 2

Author Comment

ID: 2726340
**** that came out crap. If you don't understand my crap diagram, copy it to notepad or to the comment box below, it should read, slightly better.
0

LVL 2

Author Comment

ID: 2726384
I see what you're saying about the perpendicular vectors, but I was trying to do it by calculating the force of the impact (fSpeed * sin(incident)).

Would it not be right in saying that the force of the collision has an effect on how the car reacts.

After all, if the car were to approach slowly then it would simply scrap along the wall and not deflect.
0

LVL 22

Expert Comment

ID: 2726428
I am not getting that.

For walls, Are you saying that 0 is straight up and left is 270, like the diagram shows?

but what about cars?   It sounds lie the car's angle is relative to the wall.  But that makes no sense.  which wall?

>> The cars velocity and angle is relative to itself.
It can't be.  the velocify will be absolute (or realtive to the walls) that is fine, but what about the angle?  It ha to be relative to something.  otherwise the  angle is always the same for any direction the car is traveling.  That makes no sense.

>> float for angular direction   (fYaw)
That is probably the figure I need to understand.  What is his measured from?
0

LVL 2

Author Comment

ID: 2726481
Sounds like I have you tearing your hair out (sorry).

Just forget I mentioned the reversed angle at all, its my own fault and I'll fix that, or at least try. I can always work around it anyways.
0

LVL 2

Author Comment

ID: 2726503
Yes I fixed that ****y problem! Does that help. Obviously my friend is thick in the head.
0

LVL 22

Expert Comment

ID: 2726508
huh?   are you going to post an answer to my question?

Do I understand the wall part?
how is the car angle measured?  (From what and what direction is positive?)
0

LVL 22

Expert Comment

ID: 2726612
Alright, here's what I have.  You might need to manipulate it for your situation or explain yours better.

I have both the wall's and the car's angle m,easured from the positive X axis.  That means that a wall that faces up is at an angle of 0 (it runs along the X axis)   A wall that faces left is at an angle of 90 (it runs along the Y axi a wall that fiaces down is at an angle of 180 (along the X axis, but facing down, etc...)  (obviously any angles between can be used, that was just for clarification.)

A car that is running to the right has an angle of 0 (along the x axis)  A car that is going straing up has an angle of 90 (along the y)  a car that is going down has an angle of 270. etc.

Now those are the simple angles the calculations may yield ugly angles but that should nto matter.  i.e the calculations might yield angles like 360, which is the same a 0 or -270 which is the same as 90.  However, those angles will work just as well, you just might not like them as much.

continues
0

LVL 22

Expert Comment

ID: 2726628
Given a vehicle  traveling at angle Av and a wall at angle Aw the collision angle will be

Av = Ac - Aw - 180

This is the angle of incident between the Wall and the vehicle.  (Again this might not yield the simplist angle, but it is correct--I hope.)  Using this angle you calculate the components of the velocity paralell to the wall and perpendicular to the wall.

Opps, I think I have a sign problem....
0

LVL 22

Expert Comment

ID: 2726664
Wow it has been to long--10+ years.  I made things a little too complex.
My math worked, but was overly complex,  For the easieast solution the collision angle will be just

Ac = Av - Aw

No -180 like above.   (Also I seem to have switched Av and Ac above too).

then the veclocity component of the vehicle parallel to the wall (Vx) is simply

Vx = V cos Ac

where V is the car's velocity.  Note that this is not necessarily in the X direction!  The velocity perpendicular to the wall is

Vy = V sin Ac

continues
0

LVL 22

Expert Comment

ID: 2726671
I have a meeting--unexpected.  I'll get back to you.
0

LVL 22

Expert Comment

ID: 2726858
I'm back--briefly

In a colission, the Vx will be unaltered.  (it could be reduced sligthly if there is friction with the wall, but games don't usually do that.)  Vx will be reversed in sign because of thebounce and it will be reduced in magnitude because of the loss of energy.  I would say your best bet is to just multiply it by a negative number that is between -1 and 0.  Like try multiplying by -.8.   this is probably not completely accurate, but shoudl give a reasonable feel.  (If you don't kuje ut we can look fo a better equation, it will probalby have to look at the kinetic entergy and mementym, so you would have to have some idea of the mass (well, maybe not....)

so anyways you get a new Vy like Vy = -.8Vy.

Then you need to calculate the new V, this will be the magnitiude of the vector given by the two new componenet vactors.   You use the Phythagorean theorem for this.

Have to go.
0

LVL 2

Author Comment

ID: 2726913
Nietod thanks for all the help.

I know that I may have not explained things perfectly, sorry for that I seem to have it in my head but cant get it to paper.
Although your answer does not instantly solve my problem it gives me a good basis for solution given a little work.

I think an A is deserved for all the effort you have put in.
0

LVL 22

Expert Comment

ID: 2726978
So the final velocity is the square root of the sum of the squares of the two components.  i.e

V = Sqrt(Vx*Vx + Vy*Vy)

to get the angle for the final velocify you can use the arc trig functions, like

A = arccos(Vy/V)

because of the cos is periodic the actual angle may be 180 more than that.  If Vy is negative, the actual angle should be 180 degrees more.

Now this angle is the angle relative to the wall, not the to the positive X axis, you need to add the wall angle onto to this angle to get the vehicle's angle, like

Av = arccos(Vy/V) + Aw

(plus 180 if the Vy is negative.)

Let me know if you have any questions.
0

LVL 22

Expert Comment

ID: 2726985
You were a bit premature, I was compltely done.  That should be what you need, assuming the input information is correct.  i.e. the angles.
0

LVL 2

Author Comment

ID: 2727054
I managed to fix the angle problem.
Now a car that is travelling at 0 degrees forward along the y axis will hit a wall at 0 degrees which is perpendicular to the x axis and so on.

So basically all I do is change yours to
Ac = Av - Aw - 90
which is basically what I had in the first place.

Makes you laugh huh.

Cheers.

0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a â€¦
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the bâ€¦
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relatâ€¦
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
###### Suggested Courses
Course of the Month9 days, 3 hours left to enroll