    rem Camera Functionality
    autocam on

    gosub _setupmatrix
    gosub _simplecamera
    gosub _freeflightcamera
    gosub _mouselookcamera
    gosub _modifycamera
    gosub _trackercamera
    gosub _followcamera
    gosub _usingvectors
    gosub _cameradata

    rem End of program
    autocam off
    end

    _setupmatrix:
     make matrix 1,1000,1000,100,100
     set matrix height 1,50,50,500
     update matrix 1
    return

    _simplecamera:

    while mouseclick()<>1
     set cursor 0,0 : print "SIMPLE CAMERA (EULER) (Left Mouse Button To Continue)"
     print "USE ARROW KEYS TO MOVE / A+Z XRotate / S+X ZRotate"
     print "SPACE/RETURN To Toggle Rotation Order"
     if upkey()=1 then move camera 5.0
     if downkey()=1 then move camera -5.0
     if leftkey()=1 then y#=y#-1
     if rightkey()=1 then y#=y#+1
     if inkey$()="a" then x#=x#-1
     if inkey$()="z" then x#=x#+1
     if inkey$()="s" then z#=z#-1
     if inkey$()="x" then z#=z#+1
     if spacekey()=1 then set camera rotation zyx
     if returnkey()=1 then set camera rotation xyz
     xrotate camera x#
     yrotate camera y#
     zrotate camera z#
    endwhile
    while mouseclick()=1 : endwhile

    return

    _freeflightcamera:

    while mouseclick()<>1
     set cursor 0,0 : print "FREE FLIGHT CAMERA (Left Mouse Button To Continue)"
     print "USE ARROW KEYS TO ROTATE / A+Z Roll Camera"
     if upkey()=1 then pitch camera up 1
     if downkey()=1 then pitch camera down 1
     if leftkey()=1 then turn camera left 1
     if rightkey()=1 then turn camera right 1
     if inkey$()="a" then roll camera left 1
     if inkey$()="z" then roll camera right 1
    endwhile
    while mouseclick()=1 : endwhile

    return

    _mouselookcamera:

    backdrop off
    point camera 0,0,0
    while mouseclick()<>1
     set cursor 0,0 : print "MOUSELOOK CAMERA (Left Mouse Button To Continue)"
     x#=x#+mousemovey() : y#=y#+mousemovex() : z#=z#+mousemovez()
     rotate camera x#,y#,z#
    endwhile
    while mouseclick()=1 : endwhile
    color backdrop rgb(128,0,0)
    backdrop on

    return

    _modifycamera:

    rem 22 Degrees Field of View
    set camera fov 22
    set camera range 1,750
    set camera view 10,10,640-10,480-130

    return

    _trackercamera:

    set camera rotation xyz
    position camera 0,100,-500
    while mouseclick()<>1
     center text 320,30,"TRACKER CAMERA (Left Mouse Button To Continue)"
     x#=cos(a#)*500 : z#=sin(a#)*500
     a#=a#+1.0 : if a#>359 then a#=a#-360
     position camera x#,100,z#
     point camera 500,0,500
    endwhile
    while mouseclick()=1 : endwhile

    return

    _followcamera:

    make object sphere 1,10
    set camera rotation xyz
    set camera range 1,3000
    while mouseclick()<>1
     center text 320,30,"FOLLOW CAMERA (Left Mouse Button To Continue)"
     a#=a#+1 : if a#>359 then a#=a#-360
     x#=500+(cos(a#)*100) : z#=500+(sin(a#)*500)
     distance#=200.0 : height#=100.0 : smooth#=25.0
     dx#=x#-camera position x()
     dz#=z#-camera position z()
     angle#=atanfull(dx#,dz#)
     set camera to follow x#,0,z#,angle#,distance#,height#,smooth#,0
     set camera to object orientation 1
    endwhile
    while mouseclick()=1 : endwhile

    return

    _usingvectors:

    VectorNumber=1 : CameraNumber=0
    result==make vector3(VectorNumber)
    set vector3 VectorNumber, 500, 10, 500
    position camera CameraNumber, VectorNumber
    set vector3 VectorNumber, 0, 45, 0
    rotate camera CameraNumber, VectorNumber
    set vector3 to camera position VectorNumber, CameraNumber
    set vector3 to camera rotation VectorNumber, CameraNumber
    x#=x vector3(VectorNumber)
    y#=y vector3(VectorNumber)
    result=delete vector3(VectorNumber)

    return

    _cameradata:

    while inkey$()<>"x"
     set cursor 0,0 : print : print "  CAMERA DATA (Press X to Exit)" : print
     print "  angle x:";camera angle x()
     print "  angle y:";camera angle y()
     print "  angle z:";camera angle z()
     print "  position x:";camera position x()
     print "  position y:";camera position y()
     print "  position z:";camera position z()
     x#=x#+mousemovey() : y#=y#+mousemovex() : rotate camera x#,y#,0
    endwhile

    return