Here's my case for FOV zooming

It uses Ortu's click method, which I like a lot

It works well for something like this.
set display mode 1024,768,32
hide mouse
sync on
`make texture
ink 0,0
box 0,0,20,20
ink rgb(200,100,0),0
box 1,1,19,19
get image 1,0,0,21,21
for cube = 1 to 20
make object cube cube,1
rotate object cube,20,315,0
position object cube,cube*3,0,0
set object specular cube,rgb(128,128,128),2
texture object cube,1
make object cube cube+50,1
rotate object cube+50,20,315,0
position object cube+50,cube*3+1.5,0,-30
set object specular cube+50,rgb(128,128,128),1
texture object cube+50,1
next cube
NewFOV#=3.14/2.905
position camera 30,0,-40
point camera 30,0,0
`---------------------
` Main Loop
`---------------------
DO
if mouseclick()=2 and (timer()-waitbtn)>500
waitbtn=timer()
if NewFOV# > 0.2 then dec NewFOV#,0.2 else NewFOV#=3.14/2.905
endif
CamFOV# = curvevalue(NewFOV#,CamFOV#,5)
set camera FOV CamFOV#
sync
LOOP
And here's Bluestar's version in my world
set display mode 1024,768,32
hide mouse
sync on
`make texture
ink 0,0
box 0,0,20,20
ink rgb(200,100,0),0
box 1,1,19,19
get image 1,0,0,21,21
for cube = 1 to 20
make object cube cube,1
rotate object cube,20,315,0
position object cube,cube*3,0,0
set object specular cube,rgb(128,128,128),2
texture object cube,1
make object cube cube+50,1
rotate object cube+50,20,315,0
position object cube+50,cube*3+1.5,0,-30
set object specular cube+50,rgb(128,128,128),1
texture object cube+50,1
next cube
`assign z to the mousewheel plus desired height(zoom)
`assign nz to z to ensure accurate checking
z=mousemovez() : nz=z
NewZ#=-50
position camera 30,0,-40
point camera 30,0,0
`---------------------
` Main Loop
`---------------------
DO
`check to see if mousewheel has moved !
nz=mousemovez()
`if mousewheel has moved then reset zoom level
if nz<>z
if NewZ# < -10
inc NewZ#,10
z=mousemovez()
else
NewZ#=-50
endif
endif
CamZ# = curvevalue(NewZ#,CamZ#,5)
position camera 30,0,CamZ#
sync
LOOP