What BodyMover to use?

Hello. I’m making a helicopter and I wish to apply a straight forward force on a part no matter its orientation. The force has to go in a straight line in the same direction as the part faces, but on a level plan.

Some pictures to better explain.
The Part with the Arrow is there to simulate where I want the Force to be directed. It’s not going to be an actual part on the helicopter
Part moves Forward:

Part Faces Down:

Part Turns and moves Forward:

Part Turns and Faces Down:

So yea, the title says it all. What BodyMover to use?
(I already am using BodyGyro, I know its been deprecated :wink: )
EDIT 1: The arrow represents the force direction I want it to go, its not an actual part on the helicopter.

You should consider either Body Force or Body Velocity. Body Velocity is straightforward - for constant speed. Simply update the Velocity property to whatever desired.

Body Force is more complex but more ideal. It uses newtons and works via the formula FORCE = MASS X ACCELERATION. The frequent use of acceleration will increase the realism of your copter’s physics.

You can find out the copter’s mass using the function below:

function getMass(part)
    local mass = 0
    for i, v in pairs(part:GetDescendants()) do
        if v:IsA("BasePart") then mass += v.Mass end
    end
    return mass
end

Then, multiply it by the desired acceleration for precise control in speed. In Roblox, acceleration is measured in studs per second squared. And most importantly, remember to multiply it by the copter’s look vector to ensure the vehicle is always going where it’s facing!

local ACC = 20 --Change to whatever fits!
local copter = game.Workspace.MyHelicopter
local mass = getMass(copter)
local force = ACC*mass
Instance.new("BodyForce",copter.PrimaryPart).Force = copter.PrimaryPart.CFrame.LookVector*force

--You change the acceleration at anytime like this:
copter.PrimaryPart.BodyForce = copter.PrimaryPart.CFrame.LookVector*mass*NEW_ACC

Finally, use BodyAngularVelocity and BodyGyro to manipulate its orientation. Good luck!

2 Likes

Hello, thanks for the reply. Wouldn’t using LookVector make the force go in the direction that the part is facing? So if it was orientated downwards the force would be directed downwards. I didn’t really specify that in the question, but the whole helictoper will be facing the Mouse.Hit.Position, so all the parts will have the same orientation. Is there a way to bypass this by somehow keeping a part flag on a the planes of axis?

You could use mouse.Hit.p. Regularly send the property onto the server. Make sure the Primary Part of helicopter is the propeller (or the main part of the propeller), as this is a helicopter’s centre of mass.
Here’s my first attempt.

game.ReplicatedStorage.MyRemoteEvent:Connect(function(player,pos)
   local copter = game.Workspace[player.Name.."'s Helicopter"]
   local cf = copter:GetPrimaryPartCFrame()
   copter:SetPrimaryPartCFrame(CFrame.new(cf.Position,pos))
end)
1 Like

I’ll be using the Mouse.Hit and using BodyGyro.CFrame to orient the whole helicopter. But since I could be pointing the helicopter towards the ground, If I use

then the Force would be in the direction of the LookVector, which would be facing downwards. I want the force to be facing using only the X,Z Axis, keeping the Y axis locked, which will make the force go along the X,Z Axis, but not downwards(Y Axis).

1 Like

I’ve done a helicopter type vehicle before. On BodyVelocity’s MaxForce property, you could try setting the Y vector value to zero, so it is only applied on the X and Z axis. You might find yoruself using a combination of physics movers to get the best result. BodyForce is nice, but I don’t think you have the option of setting the MaxForce. Its a constant shove in a certain direction, while bodyVelocity you may have more speed and force control.

Fair enough. I’ve never used BodyGyros myself, so see if you can translate this code using normal CFrames to operate with Gyros. Most importantly, the code makes sure the helicopter always faces the same on the Y-Axis.

game.ReplicatedStorage.MyRemoteEvent:Connect(function(player,pos)
   local copter = game.Workspace[player.Name.."'s Helicopter"]
   local cf = copter:GetPrimaryPartCFrame()
   local newPos = Vector3.new(pos.X,cf.Position.Y,pos.Z)
   copter:SetPrimaryPartCFrame(CFrame.new(cf.Position,newPos))
end)