Hi, I’ve been writing a hoverbike system for the past couple of days and it’s been going well, but I’ve hit a problem: I can’t figure out how to make it account for the ground’s surface normal. What I have so far just makes it suddenly turn 180 seemingly at random:
local cameraLevelledVector = Vector3.new(camera.CFrame.LookVector.X,0,camera.CFrame.LookVector.Z) local normal = sharedFunctions:GetSurfaceNormal() local normalisedCFrame = normal and CFrame.new(Vector3.new(),normal)*CFrame.Angles(0,math.rad(-90),math.rad(90)) or CFrame.new() bike.Chassis.BodyGyro.CFrame = normalisedCFrame*CFrame.new(Vector3.new(),cameraLevelledVector)*CFrame.Angles(0,math.rad(90),0)
Yes, I know it’s ugly. Don’t worry about
GetSurfaceNormal() - it basically returns a normal you’d get from a raycast, but it’s the mean average of 4 to smooth out the result. I already tried it with a single raycast to rule it out as a problem and the test yielded the same unpredictable results.
The extra set of angles on the end
(0,-90,90) is to account for the MeshPart’s weird orientation.
For reference, here’s the code without my attempt at accounting for ground normal, which works fine (albeit doesn’t adapt to the terrain):
local cameraLevelledVector = Vector3.new(camera.CFrame.LookVector.X,0,camera.CFrame.LookVector.Z) bike.Chassis.BodyGyro.CFrame = CFrame.new(Vector3.new(),cameraLevelledVector)*CFrame.Angles(0,math.rad(90),0)
What am I doing wrong? Why does my bike suddenly turn about the Y axis 180 degrees? I’m for all intents and purposes new to CFrames, as historically they’ve given me nothing but grief, so anything you all could tell me would help a lot. If I’ve missed anything out, please ask.