Here's a smooth 3rd person camera system I used some time ago...
Type SysCam Field cx#,cy#,cz#, yaw# Field cam End Type Global Camera.Syscam Function LoadCamera() DebugLog "Initializing Camera System" Camera.Syscam = New Syscam Camera\Cam = CreateCamera() CameraRange Camera\Cam, 1, 9000 CameraZoom Camera\Cam, 1 CameraClsMode Camera\Cam, 0, 1 End Function Function UnloadCamera() For Camera.Syscam = Each Syscam FreeEntity Camera\Cam Delete(Camera) Next End Function Function ChaseCam(entity, spd# = 0.1) TFormVector 0, 30.5 - (GraphicsHeight() / 2 - Camera\cy - MouseZ()) * 0.05, - 80 - MouseZ(), entity, 0 ex# = EntityX(entity, True) ey# = EntityY(entity, True) ez# = EntityZ(entity, True) nx# = ex + TFormedX() ny# = ey + TFormedY() nz# = ez + TFormedZ() dx# = nx - ex dy# = ny - ey dz# = nz - ez hit = LinePick(ex, ey, ez, dx, dy, dz, 1) If hit nx = PickedX() ny = PickedY() nz = PickedZ() EndIf Camera\cx = Camera\cx + (nx - Camera\cx) * spd Camera\cy = Camera\cy + (ny - Camera\cy) * spd Camera\cz = Camera\cz + (nz - Camera\cz) * spd Camera\yaw# = EntityYaw(Camera\cam) PositionEntity Camera\cam, Camera\cx, Camera\cy, Camera\cz PointEntity Camera\cam, entity, 0 End Function Function CurveValue#(newvalue#,oldvalue#,increments) If increments>1 oldvalue#=oldvalue#-(oldvalue#-newvalue#)/increments If increments<=1 oldvalue=newvalue Return oldvalue# End Function