.
I can see why my example from the other thread doesn't fit your request, as it's a follow camera rather than an orbit camera. Here's a revised version. It even includes some (basic) camera collision. It won't get you 100% of the way there but it should get you started.
+ Code Snippettype tPlayer
objId
moveSpeed as float
endtype
type tCamera
distance as float
currentPitch as float
pitchRange as float
targetHeightOffset as float
collisionRadius as float
mouseSensitivity as float
endtype
// mouse movement vars
global gMouseDeltaX as float
global gMouseDeltaY as float
// create player
Player as tPlayer
Player.objId = CreateObjectBox(0.5,2.0,0.4)
Player.moveSpeed = 4.0
SetObjectPosition(Player.objId, 0, 1.0, 0)
FixObjectPivot(Player.objId)
SetObjectCollisionMode(Player.objId, 0)
// create camera
Camera as tCamera
Camera.distance = 4.0
Camera.pitchRange = 80.0
Camera.targetHeightOffset = 1.8
Camera.collisionRadius = 0.25
Camera.mouseSensitivity = 0.2
// create ground
oGround = CreateObjectPlane(30, 30)
SetObjectColor(oGround, 64, 128, 64, 255)
RotateObjectGlobalX(oGround,90)
FixObjectPivot(oGround)
// create some random boxes to test camera collision
for i = 0 to 10
height# = random(1,2)
b = CreateObjectBox(1, height#, 1)
SetObjectColor(b, 128, 64, 64, 255)
SetObjectPosition(b, random(0,20) - 10, height# / 2, random(0, 20) - 10)
next i
// display
SetWindowSize(1280,720,0)
SetVirtualResolution(1280,720)
SetSyncRate(60,1)
UseNewDefaultFonts(1)
// other setup
SetRawMouseVisible(0)
SetCameraRange(1,0.01,1000)
// main loop
while not GetRawKeyState(27)
delta# = GetFrameTime()
// calculate mouse delta
gMouseDeltaX = GetRawMouseX() - gMouseDeltaX
gMouseDeltaY = GetRawMouseY() - gMouseDeltaY
HandlePlayerMovement(Player, delta#)
HandleCamera(Camera, Player.objId, delta#)
HandlePlayerRotation(Player, delta#)
// re-center the mouse
SetRawMousePosition(GetVirtualWidth()/2, GetVirtualHeight()/2)
gMouseDeltaX = GetRawMouseX()
gMouseDeltaY = GetRawMouseY()
print("Move with WASD")
print("Mouse controls the camera")
sync()
endwhile
function HandlePlayerMovement(player ref as tPlayer, delta as float)
moveV# = GetRawKeyState(87) - GetRawKeyState(83)
moveH# = GetRawKeyState(68) - GetRawKeyState(65)
// normalize the movement vector if needed,
// so that speed is consistent in all directions
mag# = sqrt(moveV# * moveV# + moveH# * moveH#)
if mag# > 1.0
moveV# = moveV# / mag#
moveH# = moveH# / mag#
endif
MoveObjectLocalZ(player.objId, moveV# * player.moveSpeed * delta)
MoveObjectLocalX(player.objId, moveH# * player.moveSpeed * delta)
endfunction
function HandlePlayerRotation(player ref as tPlayer, delta as float)
// get camera forward vector on XZ plane
cOldX# = GetCameraX(1)
cOldY# = GetCameraY(1)
cOldZ# = GetCameraZ(1)
MoveCameraLocalZ(1,1)
cForwardX# = GetCameraX(1) - cOldX#
cForwardZ# = GetCameraZ(1) - cOldZ#
SetCameraPosition(1, cOldX#, cOldY#, cOldZ#)
// rotate player to camera orientation
SetObjectLookAt(player.objId, GetObjectX(player.objId) + cForwardX#, GetObjectY(player.objId), GetObjectZ(player.objId) + cForwardZ#, 0)
endfunction
function HandleCamera(camera ref as tCamera, targetObject, delta as float)
// store the target position
tx# = GetObjectX(targetObject)
ty# = GetObjectY(targetObject) + camera.targetHeightOffset
tz# = GetObjectZ(targetObject)
// position camera at target
SetCameraPosition(1, tx#, ty#, tz#)
// rotate camera on Y axis with mouse X
SetCameraRotation(1, 0, GetCameraAngleY(1) + gMouseDeltaX * camera.mouseSensitivity, 0)
// rotate camera on X axis with mouse Y
camera.currentPitch = camera.currentPitch + gMouseDeltaY * camera.mouseSensitivity
camera.currentPitch = ClampFloat(camera.currentPitch, -camera.pitchRange, camera.pitchRange)
RotateCameraLocalX(1, camera.currentPitch)
// move camera back by distance
MoveCameraLocalZ(1, -camera.distance)
// detect camera collision and move camera forward if needed
hit = ObjectSphereCast(0, tx#, ty#, tz#, GetCameraX(1), GetCameraY(1), GetCameraZ(1), camera.collisionRadius)
if hit
SetCameraPosition(1, GetObjectRayCastX(0), GetObjectRayCastY(0), GetObjectRayCastZ(0))
endif
endfunction
function ClampFloat(in as float, min as float, max as float)
if in < min then exitfunction min
if in > max then exitfunction max
endfunction in