Im haveing alot of trouble figureing out the math involved in calculating mouse position for a 3d Rts. It works if the camera is pointing straight down but once you change the angle(mouse3) or roteit(mouse3+right alt) the mouse is way off. If anyone knows how to get this working let me know.
The code is kinda messy
make matrix 1,1500,1500,70,70
randomize matrix 1,10
update matrix 1
sync on
sync rate 60
autocam off
Dim CameraX#(1)
Dim CameraZ#(1)
Dim CameraY#(1)
Dim CameraLookZ#(1)
Dim CameraLookX#(1)
Dim CameraRote(1)
Dim funcreturn#(5)
rem Setup Camera
CameraX#(1) = 750.0
CameraZ#(1) = 751.0
CameraY#(1) = 100.0
CameraLookZ#(1) = 746.0
CameraLookX#(1) = CameraX#(1)
CalcCirclePos(CameraX#(1),CameraZ#(1),CameraLookZ#(1) - CameraZ#(1),CameraRote(1))
CameraLookXcomp# = funcreturn#(1)
CameraLookZcomp# = funcreturn#(2)
position camera CameraX#(1),CameraY#(1),CameraZ#(1)
point camera CameraLookXcomp#,0,CameraLookZcomp#
make object sphere 1,1
rem Main Loop
do
MouseFunc()
set cursor 0,0
print Screen FPS()
CalcCirclePos(CameraX#(1),CameraZ#(1),CameraLookZ#(1) - CameraZ#(1),CameraRote(1))
CameraLookXcomp# = funcreturn#(1)
CameraLookZcomp# = funcreturn#(2)
position camera CameraX#(1),CameraY#(1),CameraZ#(1)
point camera CameraLookXcomp#,0,CameraLookZcomp#
sync
loop
function MouseFunc()
rem Camera Movement
MoveY = MouseMoveY()
MoveX = MouseMoveX()
If MouseX() = Screen width() - 1 or rightkey() = 1
X# = Sin(CameraRote(1)-90)
Y# = Cos(CameraRote(1)-90)
CameraX#(1) = CameraX#(1) + X#
CameraZ#(1) = CameraZ#(1) + Y#
CameraLookX#(1) = CameraLookX#(1) + X#
CameraLookZ#(1) = CameraLookZ#(1) + Y#
endif
If MouseY() = Screen height() - 1 or downkey() = 1
X# = Sin(CameraRote(1))
Y# = Cos(CameraRote(1))
CameraX#(1) = CameraX#(1) + X#
CameraZ#(1) = CameraZ#(1) + Y#
CameraLookX#(1) = CameraLookX#(1) + X#
CameraLookZ#(1) = CameraLookZ#(1) + Y#
endif
if MouseClick() = 4 and MoveY 0 and Keystate(184) = 0
If CameraY#(1) 15.0 then CameraLookZ#(1) = CameraLookZ#(1) + MoveY
CameraY#(1) = CameraY#(1) + MoveY
If CameraY#(1) 100.0 then CameraY#(1) = 100.0
If CameraY#(1) > 100.0 then CameraLookZ#(1) = CameraZ#(1) + 5.0
Endif
If MouseClick() = 4 and MoveX 0 and Keystate(184) = 1
Camerarote(1) = wrapvalue(Camerarote(1) + MoveX)
Endif
rem Calculate Mouse3D position
position object 1,CameraLookX#(1)-(MouseX()-(Screen width()/2)),0,CameraLookZ#(1)+(MouseY()-(Screen Height()/2))
X1# = MouseX()-(Screen width()/2)
X2# = Object Screen X(1)-(Screen width()/2)
Y1# = (MouseY()-(Screen Height()/2))*-1
Y2# = (Object Screen Y(1)-(Screen Height()/2))*-1
position object 1,CameraLookX#(1)-((MouseX()-(Screen width()/2)))*(X1#/X2#),0,CameraLookZ#(1)+((MouseY()-(Screen Height()/2))*(Y1#/Y2#))
endfunction
function CalcCirclePos(X#,Y#,R,T)
If R = 0 Then R = 1
A# = X# + (Sin(T)*R)
B# = y# + (Cos(T)*R)
funcreturn#(1) = A#
funcreturn#(2) = B#
endFunction