# How could I use distance to raise altitude

So if you know basics of aviation, further something is the higher the object needs to go up in the sky.
So I am trying to make a brick lerp to the objective which already works as I use bodymover in lookvector to speed it up and lerp to rotate it to the object but is there a way to calculate the distance between the objects and then calculate the desired angle or something?

I donâ€™t understand what youâ€™re asking, sorry. Could you clarify a bit?

1 Like

I need the brick to have the left sort of travel style rather than the left basically

1 Like

This is targeting coordinates btw but Iâ€™m not sure how to achieve this without elevating the brick higher than the destination coordinates

1 Like

Maybe Iâ€™m just dumb, but I donâ€™t understand what youâ€™re trying to say with those two pictures.

At a high level, what are you trying to do? Are you making a catapult and you want to figure out launch angle and speed or something?

1 Like

I need the brick to fly up in the air not go basically straight to the point when on similar height

1 Like

OK, so youâ€™re making a catapult?

You have some speed that you want the projectile to go, and you want to know the angle to launch it at, is that correct?

The speed is a set amount but the object will get the angle to look at in the air and then will slowly turn to the objectâ€™s position

This ended being kinda fun.

A bezier curve might work for this: BĂ©zier curve - Wikipedia

Itâ€™s this:

Where P0 is the starting point, P2 is the target, and P1 is just some value we choose thatâ€™s, say, ten studs above the midpoint between the start and end.

Stealing some equations from wikipedia for the equation of the tangentâ€¦ andâ€¦ done.

1. Put a Part in workspace and put this in a LocalScript in StarterPlayerScripts or something.

2. Test the game and click around.

local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
local part = workspace:WaitForChild("Part")

local Fire
do
local UP = Vector3.new(0, 1, 0)
local conn
function Fire(part, start, target, duration, heightControl)
-- default parameters
if not duration then duration = 1 end
if not heightControl then heightControl = 10 end

-- bezier calcs
local control = (start + target) / 2 + Vector3.new(0, heightControl, 0)
local ab = control - start
local bc = target - control

-- will move this from 0 to 1
local t = 0

-- kill any previous movement
if conn then conn:Disconnect() end

-- and start a new one
conn = game:GetService("RunService").Stepped:Connect(function(_, dt)
-- increment t by a bit
t += dt / duration

if t > 1 then
-- reached the end
t = 1
conn:Disconnect()
conn = nil
end

-- bezier equations from https://en.wikipedia.org/wiki/Bezier_curve
local pos = (1-t)*(1-t)*start + 2*(1-t)*t*control + t*t*target
local dir = (2*(1-t)*ab + 2*t*bc).Unit

-- compute CFrame based on right vector and direction vector
-- TODO handle the case where target is right above start
local right = (target-start).Unit:Cross(UP)

part.CFrame = CFrame.fromMatrix(pos, right, right:Cross(dir), -dir)
end)
end
end

mouse.Button1Down:Connect(function()
Fire(part, part.Position, mouse.Hit.p)
end)

The Fire function takes 3-5 parameters.

Caveats:

• This doesnâ€™t follow physics. If youâ€™re trying to use this to represent a projectile, there are more accurate ways. For visualization of like a plane (which Iâ€™m guessing is what youâ€™re doing) itâ€™s probably fine.
• The speed along the curve is not exactly consistent for reasons. But I think itâ€™s fine.
• It takes a â€śdurationâ€ť parameter rather than a â€śspeedâ€ť parameter. You can get closer to a â€śspeedâ€ť by setting duration = (target-start).Magnitude / studsPerSecond, but that wonâ€™t be exact. Computing the length of the curve itself is hard.