Projectile motion is a form of motion experienced by an object thrown into the air at some angle. Since it is a two-dimensional motion, it is characterized by two components:
Horizontal motion: The motion of the object along the x-axis is the horizontal motion which is given by the following equation:
where 
Vertical motion: The motion of the object along the y-axis is the vertical motion which is given by the following equation:
where 
We can simulate the projectile motion using the VPython library. To execute the provided code, you have to follow below mentioned steps:
The sample code is as follows:
from vpython import *
g = 9.8  # Acceleration due to gravity (m/s^2)
# Scene setup
scene = canvas(width=1200, height=600, center=vec(0, 10, 0), background=color.white)
ground = box(pos=vec(-10, 0, 0), size=vec(50, 0.2, 2), color=color.gray(0.7))
# Projectile properties
ball = sphere(pos=vec(-20, 0, 0), radius=1.0, color=color.blue)
velocity = 20.0  # Initial velocity (m/s)
angle = 65.0     # Launch angle (degrees)
angle_rad = radians(angle)
v0x = velocity * cos(angle_rad)
v0y = velocity * sin(angle_rad)
# Time step and total time
dt = 0.01
# Simulation loop
while ball.pos.y >= 0:
    # Limit the animation speed
    rate(100)  
    # Update position and velocity
    ball.pos.x += v0x * dt
    ball.pos.y += v0y * dt - 0.5 * g * dt**2
    # Update velocity components
    v0y -= g * dtLine 1: Importing the VPython library.
Line 2: Storing the gravitational acceleration in the variable g.
Line 6: The scene variable stores a canvas object, which creates a window of dimensions 
Line 7: The ground variable stores a box object, which creates a road-like structure the projectile will be launched from and land at.
Line 10: The ball variable stores a sphere object, creating a  blue three-dimensional object that takes off from the ground object.
Line 11–13: The initial velocity (velocity and angle variables respectively. The angle is then converted to the radians() method and stored in the angle_rad variable.
Line 14–15: The x and y components of the initial velocity are stored in the v0x and v0y variables respectively.
Line 18: The dt variable stores the instantaneous time of the projectile motion.
Line 21: The while loop here will keep executing until the vertical displacement gets zero i.e., the ball hits the ground.
Line 23: Sets frames per second.
Line 25–26: The horizontal and vertical position of the ball is getting updated with each iteration of the loop.
Line 29: The vertical velocity is getting updated because the speed decreases gradually in the projectile motion as the ball approaches the highest point in its trajectory. After that point, the speed increases until the ball hits the ground.
Note: Learn how to simulate a simple pendulum in VPython.
Free Resources