PickScreen() funtion for DBC, AKA 3D Mouse by Relativity6th 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 |