TGC Codebase Backup



PickScreen() funtion for DBC, AKA 3D Mouse by Relativity

6th Sep 2005 21:00
Summary

This Pick Screen function will produce a 3D point a certain distance away from the camera that corresponds to a 2D point on the screen. Also can be used as a 3D mouse.



Description

This will give the user 3D coordinates a certain distance away from the camera that corresponds to a 2D point on the screen. As far as I can tell, all aspect ratios work with it. It requires you to create an array VECTOR() and will store the results in VECTOR(0), VECTOR(1), and VECTOR(2). It is attatched to an example program.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    `====================
` PICK SCREEN EXAMPLE
`====================
`  By The SITHSPAWN
`--------------------

` SPECIAL THANKS TO SVEN B FOR HELPING ME UNDERSTAND THE CAMERA STRUCTURE

` THIS PROGRAM IS AN EXAMPLE OF MY PICKSCREEN FUNCTION.  THE FUNCTION WILL GIVE YOU A POINT
` IN 3D SPACE A CERTAIN DISTANCE AWAY FROM THE CAMERATHAT CORRESPONDS TO A 2D POINT ON YOUR SCREEN.
` THE FUNCTIONS ARE AT THE BOTTOM
` CREDIT ISN'T NECESSARY BUT WOULD BE NICE

HIDE MOUSE
SYNC ON
POSITION MOUSE 640,512
SHOW MOUSE

XVEC#=0
YVEC#=0

XPT#=400

POSITION CAMERA 0,0,0
AUTOCAM OFF

SET DISPLAY MODE 1280,1024,16

FOR Y=1 TO 20
   FOR SPHERE=1 TO 20
      MAKE OBJECT SPHERE (Y*20+SPHERE),15
      POSITION OBJECT (Y*20+SPHERE),0,Y*20,0
      YROTATE OBJECT (Y*20+SPHERE),(SPHERE*360/20)
   NEXT SPHERE
NEXT Y

MAKE OBJECT SPHERE 1000,1

R=RND(255)
G=RND(255)
B=RND(255)
R1=10
B1=10
G1=10

SPEED=1
T=1
SHOT=1
SPEEDF=0
SPEEDS=0
SPEEDU=0
DISTANCE=0

DIM HIT(20,20)
FOR Y=1 TO 20
   FOR SPHERE=1 TO 20
      HIT(Y,SPHERE)=0
   NEXT SPHERE
NEXT Y

COLOR BACKDROP RGB(255,75,0)

`  THE OBJECT THAT FOLLOWS YOUR MOUSE
   MAKE OBJECT SPHERE 4000,10
   POSITION OBJECT 4000,0,0,100

`  THE ARRAY THE RESULTS WILL BE STORED IN
   DIM VECTOR#(2)

DO

`  MAKE SOME FANCY EFFECTS FOR ENTERTAINMENT
   IF R>245 OR B<10 THEN R1=0-R1
   R=R+R1
   IF G>245 OR G<10 THEN G1=0-G1
   G=G+G1
   IF B>245 OR B<10 THEN B1=0-B1
   B=B+B1

   FOR Y=1 TO 20
      FOR SPHERE=1 TO 20
         IF HIT(Y,SPHERE)=1 THEN GOTO B
         MOVE OBJECT (Y*20+SPHERE),SPEED
         COLOR OBJECT (Y*20+SPHERE),RGB(R,G,B)
         B:
      NEXT SPHERE
   NEXT Y

   IF T=1
      SPEED=SPEED+1
      IF SPEED=10 THEN T=2
      GOTO A
   ENDIF

   IF T=2
      SPEED=SPEED-1
      IF SPEED=-10 THEN T=1
      GOTO A
   ENDIF

   A:
`  THE REAL STUFF

   IF UPKEY()=1 THEN MOVE OBJECT 1000,10
   IF DOWNKEY()=1 THEN MOVE OBJECT 1000,-10
   IF LEFTKEY()=1 THEN TURN OBJECT LEFT 1000,5
   IF RIGHTKEY()=1 THEN TURN OBJECT RIGHT 1000,5
   IF KEYSTATE(51)=1 THEN ROLL OBJECT LEFT 1000,5
   IF KEYSTATE(52)=1 THEN ROLL OBJECT RIGHT 1000,5
   IF CONTROLKEY()=1 THEN PITCH OBJECT DOWN 1000,5
   IF SHIFTKEY()=1 THEN PITCH OBJECT UP 1000,5



   ROTATE CAMERA OBJECT ANGLE X(1000),OBJECT ANGLE Y(1000),OBJECT ANGLE Z(1000)
   POSITION CAMERA OBJECT POSITION X(1000),OBJECT POSITION Y(1000),OBJECT POSITION Z(1000)

   IF INKEY$()="1"
      SET DISPLAY MODE 800,600,16
      COLOR BACKDROP RGB(255,75,0)
   ENDIF

   IF INKEY$()="2"
      SET DISPLAY MODE 1280,1024,16
      COLOR BACKDROP RGB(255,75,0)
   ENDIF

   PICKSCREEN(MOUSEX(),MOUSEY(),100.0)

   POSITION OBJECT 4000,VECTOR#(0),VECTOR#(1),VECTOR#(2)

   SET CURSOR 0,0
   PRINT "This program was created by The SITHSPAWN"
   PRINT
   PRINT "PRESS UPKEY AND DOWNKEY TO MOVE FORWARD AND BACKWARD.  PRESS LEFT AND RIGHTKEYS TO TURN."
   PRINT "PRESS < AND > TO ROLL.  PRESS SHIFT AND CONTROL TO PITCH UP AND DOWN."
   PRINT "PRESS 1 AND 2 TO SWITCH BETWEEN ASPECT RATIOS 800 BY 600 AND 1280 BY 1024."
   PRINT
   PRINT "CURRENCT ASPECT RATIO>",SCREEN WIDTH()," BY ",SCREEN HEIGHT()
   PRINT "VECTOR>",VECTOR#(0),",",VECTOR#(1),",",VECTOR#(2)
   PRINT "OBJ X>",OBJECT SCREEN X(4000)," OBJ Y>",OBJECT SCREEN Y(4000)
   PRINT "MS  X>",MOUSEX()," MS  Y>",MOUSEY()

   SYNC
LOOP




`THIS FUNCTION WILL GIVE YOU A POINT IN 3D SPACE A CERTAIN DISTANCE AWAY FROM THE CAMERA
`THAT CORRESPONDS TO A 2D POINT ON YOUR SCREEN.
`SYNTAX: XPOINT# IS THE 2D X POINT ON YOUR SCREEN
`        YPOINT# IS THE 2D Y POINT ON YOUR SCREEN
`        DISTANCE# IS THE DISTANCE AWAY FROM THE CAMERA YOU WANT THE 3D POINT TO BE CALCULATED

`RESULTS WILL BE STORED IN THE ARRAY VECTOR#() AND WILL BE AS FOLLOWS: X=VECTOR#(0), Y=VECTOR#(1), AND Z=VECTOR#(2)
`THE RESULTS WILL BE RELATIVE TO STANDARD AXIS, NOT TO CAMERA

`W A R N I N G:  YOU MUST CREATE THE ARRAY OUTSIDE THE FUNCTION BEFORE YOU USE THE FUNCTION

FUNCTION PICKSCREEN(XPOINT,YPOINT,DISTANCE#)

`  CALCULATE HALF THE SCREEN WIDTH AND HEIGHT
`  SUBTRACT 1 BECAUSE POINTS START AT (0,0), NOT (1,1)
   HALFSW#=(SCREEN WIDTH()-1)
   HALFSW#=HALFSW#/2
   HALFSH#=(SCREEN HEIGHT()-1)
   HALFSH#=HALFSH#/2

`  CALCULATE THE RATIO CONSTANTS.  REMEMBER, HEIGHT CONSTANT IS ALWAYS .6
   SW#=SCREEN WIDTH()
   SH#=SCREEN HEIGHT()
   WIDTHCONSTANT#=SW#/SH#
   WIDTHCONSTANT#=.6*WIDTHCONSTANT#


`  CALCULATE 3D COORDINATE OF SCREEN POINT ASSUMING CAMERA ISN'T ROTATED AND IS AT POSITION 0,0,0
   XPOINT#=XPOINT
   YPOINT#=YPOINT
   XPOINT#=XPOINT-HALFSW#
   YPOINT#=HALFSH#-YPOINT
   XVEC#=WIDTHCONSTANT#*(XPOINT#/HALFSW#)
   YVEC#=.6*(YPOINT#/HALFSH#)
   ZVEC#=1

`  CALCULATE LENGTH FROM CAMERA POINT TO 3D SCREEN POINT
   LENGTH#=SQRT((XVEC#*XVEC#)+(YVEC#*YVEC#)+(ZVEC#*ZVEC#))

`  MAKE VECTOR A UNIT VECTOR
   XVEC#=(XVEC#/LENGTH#)
   YVEC#=(YVEC#/LENGTH#)
   ZVEC#=(ZVEC#/LENGTH#)

`  CALCULATE POINT ON VECTOR AT DESIRED DISTANCE FROM CAMERA
   XVEC#=DISTANCE#*XVEC#
   YVEC#=DISTANCE#*YVEC#
   ZVEC#=DISTANCE#*ZVEC#

`  CALULATE X-AXIS ROTATION RELATIVE TO CAMERA
   OLDY#=YVEC#
   OLDZ#=ZVEC#

   YVEC#=(OLDY#*COS(CAMERA ANGLE X()))-(OLDZ#*SIN(CAMERA ANGLE X()))
   ZVEC#=(OLDY#*SIN(CAMERA ANGLE X()))+(OLDZ#*COS(CAMERA ANGLE X()))

`  CALCULATE Y-AXIS ROTATION RELATIVE TO CAMERA
   OLDX#=XVEC#
   OLDZ#=ZVEC#

   XVEC#=(OLDX#*COS(CAMERA ANGLE Y()))+(OLDZ#*SIN(CAMERA ANGLE Y()))
   ZVEC#=(OLDZ#*COS(CAMERA ANGLE Y()))-(OLDX#*SIN(CAMERA ANGLE Y()))

`  CALCULATE Z-AXIS ROTATION RELATIVE TO CAMERA
   OLDX#=XVEC#
   OLDY#=YVEC#

   XVEC#=(OLDX#*COS(CAMERA ANGLE Z()))-(OLDY#*SIN(CAMERA ANGLE Z()))
   YVEC#=(OLDX#*SIN(CAMERA ANGLE Z()))+(OLDY#*COS(CAMERA ANGLE Z()))

`  CALCULATE THE VECTOR RELATIVE TO THE STANDARD AXIS RATHER THAN RELATIVE TO THE CAMERA
   VECTOR#(0)=XVEC#+CAMERA POSITION X()
   VECTOR#(1)=YVEC#+CAMERA POSITION Y()
   VECTOR#(2)=ZVEC#+CAMERA POSITION Z()

ENDFUNCTION