Source eat your heart out:
set display mode 800,600,32:ink 0,0:hide mouse:dim objpos#(3):dim cam#(4):cam#(3)=-0.6
sync on:do:cls rgb(255,255,255)
if upkey()=1 then cam#(1)=newxvalue(cam#(1),cam#(4),0.01):cam#(3)=newzvalue(cam#(3),cam#(4),0.01)
if downkey()=1 then cam#(1)=newxvalue(cam#(1),cam#(4),-0.01):cam#(3)=newzvalue(cam#(3),cam#(4),-0.01)
if leftkey()=1 then cam#(1)=newxvalue(cam#(1),cam#(4)-90,0.01):cam#(3)=newzvalue(cam#(3),cam#(4)-90,0.01)
if rightkey()=1 then cam#(1)=newxvalue(cam#(1),cam#(4)+90,0.01):cam#(3)=newzvalue(cam#(3),cam#(4)+90,0.01)
if mouseclick()=1 then cam#(4)=cam#(4)-1
if mouseclick()=2 then cam#(4)=cam#(4)+1
mx#=mousex():spin#=(mx#-400)/7:cam#(4)=cam#(4)+spin#:position mouse 400,300
for vx#= -0.05 to 0.05 step 0.05:for vy#= -0.05 to 0.05 step 0.05:for vz#= -0.05 to 0.05 step 0.05
x#=rgx(objpos#(1)+vx#,objpos#(3)+vz#):y#=objpos#(2)+vy#-cam#(2):z#=rgz(objpos#(1)+vx#,objpos#(3)+vz#)
gradx#=x#/z#:sx#=(gradx#/2)*1000+400:grady#=y#/z#:sy#=600-((grady#/2)*1000+300):circle sx#,sy#,1:next vz#:next vy#:next vx#
sync
loop
function rgx(x#,z#)
dx#=cam#(1)-x#:dz#=cam#(3)-z#:dist#=sqrt(dx#^2+dz#^2):a#=atan(dx#/dz#)-cam#(4):rx#=dist#*sin(a#)
endfunction rx#
function rgz(x#,z#)
dx#=cam#(1)-x#:dz#=cam#(3)-z#:dist#=sqrt(dx#^2+dz#^2):a#=atan(dx#/dz#)-cam#(4):rz#=dist#*cos(a#)
endfunction rz#
Arrows keys / mouse to move.
[url=blah]rtsp://rmv8.bbc.net.uk/news/olmedia/cta/sport/events2002/boat_race/2001_256k.rm[/url]
-= Out here in the fields, I fight for my meals =-