Quote: "would you have any example of the camera rotating around the 3d model without doing some "Work around"?"
You're a game developer,
embrace workarounds.
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.
type 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