ObjectiveMain objective of this blog post to give you an idea about how to extrapolate position in unity.
Newton's first law of motion:
“An object at rest stays at rest and an object in motion stays in motion with the same speed and in the same direction unless acted upon by an unbalanced force.”
Step 1 Newton's First Law
Test Newton's first law of motion In Unity:
- Take two cubes and name them as CubeUnderUnityPhysics and ExtrapolatedCube.
- Add rigid body component to CubeUnderUnityPhysics.
- Create an empty game object named PhysicsTest and add script PhysicsTest to it and set both, cube reference and initial velocity of it.
No unbalanced force:
The only condition for this law is no unbalanced force should act upon it. Therefore set gravity and drag it to zero. Gravity can be changed from Edit->Project Settings->Physics.
Here, CubeUnderUnityPhysics acts under unity physics engine and position of ExtrapolatedCube is updated by the script and gives its position at any time after the initial velocity is given.
We know that,
Velocity = distance / time
dx=v0x* t dy=v0y* t dz=v0z* t
Under this circumstance the position of ExtrapolatedCube is defined by,
ExtrapolatedCube.position.x = initialVeiocity.x * Time.time; ExtrapolatedCube.position.y = initialVeiocity.y * Time.time; ExtrapolatedCube.position.z = initialVeiocity.z* Time.time;
Therefore, CubeUnderUnityPhysics and hence ExtrapolatedCube has constant velocity and no acceleration.
Step 2 Apply Gravity
But what if gravity is applied?
For constant acceleration motion,
d= vo t + a t2/2
We know that the gravity of earth is -9.8 m/s2.It means that at every second the velocity is increased by 9.8 in the downward direction.
Gravity is in the downward direction. So, only the y component changes.
dx=v0x * t dy=v0y * t - 9.81 * t2 / 2 dz=v0z * t
For position of ExtrapolatedCube,
ExtrapolatedCube.position.x = initialVeiocity.x * Time.time; ExtrapolatedCube.position.y = initialVeiocity.y * Time.time +9.81f * Time.time * Time.time / 2 ; ExtrapolatedCube.position.z = initialVeiocity.z* Time.time;
Note: Make sure that the gravity on Edit->Project Settings->Physics is (0,-9.81,0).
Step 3 Change in Gravity
What if the gravity is other than (0,-9.81, 0)?
Suppose we have a game in which the gravity is other than (0,-9.81, 0).
We need to rewrite the above equation as given below,
ExtrapolatedCube.position.x = initialVeiocity.x * Time.time+Physics.gravity.x* Time.time * Time.time / 2; ExtrapolatedCube.position.y = initialVeiocity.y * Time.time +Physics.gravity.y * Time.time*Time.time / 2; ExtrapolatedCube.position.z = initialVeiocity.z* Time.time+Physics.gravity.z* Time.time * Time.time / 2;
Step 4 Initial Position is different
What if the initial position of the object is not (0, 0, 0)?
In this case the equation should be,
ExtrapolatedCube.position.x =initialPosition.x+ initialVeiocity.x * Time.time; ExtrapolatedCube.position.y=initialPosition.y+initialVeiocity.y*Time.time +9.81f * Time.time * Time.time / 2; ExtrapolatedCube.position.z =initialPosition.z + initialVeiocity.z* Time.time;
Step 5 Extrapolate position after the particular time
Until now we’ve used time.time as time because we were interested in comparing both the cube positions.
Now, if we want to know the position of CubeUnderUnityPhysics after any particular time for example after 2 s, then use the following equations:
ExtrapolatedCube.position.x = initialPosition.x+ currentVeiocity.x * 2; ExtrapolatedCube.position.y=initialPosition.y+ currentVeiocity.y*2 + 9.81f * 2 * 2 / 2; ExtrapolatedCube.position.z = initialPosition.z + currentVeiocity.z* 2;
I hope you find this blog post very helpful while working on Extrapolate Position in Unity. Let me know in comment if you have any questions regarding unity. I will reply you ASAP.
I am Professional Game Developer, I love to develop a Game and also i love play a game, And i am always ready to helping you in Game Development.
How to Create Water Reflection Effect in Photoshop
Indirect Lights in Computer Graphics