Well, there are at least 2 ways of doing this Pyromaniac, you can do it in an object and sprite intensive way - or in a maths intensive way - there may be more. One way of doing it is to create a grid of plains or other such objects and for each object create a sprite that covers about 32x32 on the screen at 640x480 resolution or 64x64 on 800x600 positioned over each object, and hide the lot.
Then just use a mouse controlled sprite in conjunction with these to work out which sprite is being clicked on, then use that sprite number to work out which object its over, the you can use the 'object position' commands to work out where the object is in 3D to get your co'ords.
Or you can do it the maths way, I'm not sure who wrote this code, but it shows the maths way of getting a 3D position from a 2D mouse position - If you created this code please tell me!
sync on : sync rate 0 : set display mode 1024,768,32
matx=64 : matz=64 : tilesize=128
creatematrix(1,matx,matz,tilesize)
ax#=45 : ay#=0 : ox#=matx/2*tilesize : oy#=0 : oz#=matz/2*tilesize : r#=1000 : FOV#=60 : set camera fov FOV#
make object sphere 1,50 : make object sphere 2,75
DO
gosub camera
if mouseclick()=1 and mouseclick()<>3 then gosub mmcoord
gosub stats
sync
LOOP
function creatematrix(n,x,z,ts):
make matrix n,x*ts,z*ts,x,z
endfunction
camera:
if mouseclick()=2
ax#=ax#+(my-mousey())
ay#=wrapvalue(ay#+(mx-mousex()))
if ax#>85 then ax#=85
if ax#<5 then ax#=5
endif
mx=mousex()
my=mousey()
if upkey()=1 or (mouseclick()=0 and mousey()=0)
ox#=ox#-5*sin(ay#)
oz#=oz#-5*cos(ay#)
endif
if downkey()=1 or (mouseclick()=0 and mousey()=screen height()-1)
ox#=ox#+5*sin(ay#)
oz#=oz#+5*cos(ay#)
endif
if leftkey()=1 or (mouseclick()=0 and mousex()=0)
ox#=ox#+5*cos(ay#)
oz#=oz#-5*sin(ay#)
endif
if rightkey()=1 or (mouseclick()=0 and mousex()=screen width()-1)
ox#=ox#-5*cos(ay#)
oz#=oz#+5*sin(ay#)
endif
if mouseclick()=3
r#=r#+mousemovey()
if r#<100 then r#=100
if r#>2500 then r#=2500
endif
if inkey$()="+" and FOV#<360
FOV#=FOV#+0.5
set camera fov FOV#
endif
if inkey$()="-" and FOV#>0
FOV#=FOV#-0.5
set camera fov FOV#
endif
x#=ox#+r#*sin(ay#)*cos(ax#)
y#=oy#+r#*sin(ax#)
z#=oz#+r#*cos(ay#)*cos(ax#)
position camera x#,y#,z#
point camera ox#,oy#,oz#
position object 2,ox#,oy#,oz#
return
mmcoord:
scrw# = screen width()
scrh# = screen height()
smax# = r#*tan(FOV#/2)
sh# = (((scrh#/2-mousey())*2)/scrh#)*smax#
l# = (sh#*sin(90+atan(sh#/r#)))/sin(ax#-atan(sh#/r#))
smax2# = r#*scrw#/scrh#*tan(FOV#/2)
sw# = (((mousex()-scrw#/2)*2)/scrw#)*smax2#
rsh# = sqrt(r#^2+sh#^2)
rl# = sqrt((camera position x()-(ox#-l#*sin(ay#)))^2+(camera position y()-oy#)^2+(camera position z()-(oz#-l#*cos(ay#)))^2)
w# = (sw#*rl#)/rsh#
x# = ox#-l#*sin(ay#)-w#*cos(ay#)
y# = oy#
z# = oz#-l#*cos(ay#)+w#*sin(ay#)
position object 1,x#,y#,z#
return
stats:
text 0,0,"Rotation coordinates: "+str$(ox#)+","+str$(oy#)+","+str$(oz#)
text 0,20,"Camera angle y = "+str$(ay#)
text 0,40,"Camera angle x = "+str$(ax#)
text 0,60,"Camera radius = "+str$(r#)
text 0,80,"Camera fov = "+str$(FOV#)
return