Getting Linear Velocity to actually work in your Roblox projects
Linear Velocity is one of the newer physics constraints in Roblox, and honestly it replaces most of the old BodyVelocity stuff we used to rely on. The main difference is that it's built around attachments now instead of just targeting a part directly. That changes how you have to think about it. Here is the practical setup. You need an attachment on the moving part and another attachment on whatever you want it to move relative to. The constraint goes on the moving part. Then you set the VelocityReference property to match whatever direction you are actually interested in. Most people leave it at WorldSpace and wonder why their gun recoil pushes the wrong direction when the character rotates. Switching to RelativeToModel or using the attachment's local orientation usually fixes that.
What Linear Velocity Roblox actually does under the hood
It calculates a force every physics step to drive the part's velocity toward your target. The ForceLimit property caps how much force gets applied each frame. That matters a lot because if you leave it at the default Infinity, heavy objects will snap to your target velocity instantly and everything looks floaty and wrong. Setting a realistic force limit, usually in the range of your part's mass times your desired acceleration, makes the movement feel grounded instead of teleporting. The RelativeTo property controls whether the velocity is interpreted in world space or in the attachment's local space. Local space is almost always what you want for things like vehicle propulsion or projectile muzzle velocity. World space is fine for things like a wind effect or a platform that pushes everything in one direction regardless of rotation. I ran into a specific issue last year where I was building a rocket-propelled grenade that used Linear Velocity for its thrust phase. The problem was that when the rocket parented itself to the player's character during the homing phase, the constraint kept applying force in world space while the character was moving. The result was the rocket lurching sideways wildly every time the player turned. My workaround was to use a RemoteEvent to disable the Linear Velocity right before parent changing it, then re-enable it once the new parent setup was complete. It added about forty lines of cleanup code but stopped the lateral drift completely.
Common properties you need to know about
MaxForce is what I mentioned above, but people also miss Attachment0 and Attachment1. Attachment0 is on the part being moved. Attachment1 is the anchor point in space or on another object. If Attachment1 is missing, the velocity is purely world-space and the part just accelerates in that direction indefinitely unless you clamp it somehow. That is fine for some effects but terrible for anything you want controlled movement. VelocityReference has two modes: Velocity and Speed. Velocity sets both direction and magnitude. Speed sets only magnitude and uses the attachment axis as the direction. Speed mode is useful when you want an object to always move forward at a certain rate regardless of which way the attachment is currently facing. ApplyAtCenterOfMass is another one people skip. When enabled, the force applies through the center of mass instead of at the attachment point. For most projectile and vehicle applications you want this off so the force creates realistic torque and rotation. Turn it on if you want pure translation without any spin.
Get the Full Details

Where Linear Velocity falls apart
It is not a good choice for precise positional control. If you need a part to arrive exactly at a coordinate and stop, use TweenService or a Position constraint instead. Linear Velocity will overshoot every time because it is fighting inertia. It also struggles with very heavy objects unless you crank the ForceLimit up high, and even then the physics step can jitter if the required force exceeds what the solver can handle in a single tick. Another limitation: it does not integrate well with custom scripts that manually set CFrame. Every time something overwrites the part's position directly, the velocity constraint fights it the next frame and you get that stuttery resistance feeling. Keep all movement through the physics system or turn the constraint off before manual positioning. For a full breakdown of properties and how they interact with Roblox's physics engine, check the official documentation at https://developer.roblox.com/en-us/api-reference/class/LinearVelocity