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
|