BBS: Inland Empire Archive
Date: 04-23-92 (02:50) Number: 141
From: RICH GELDREICH Refer#: NONE
To: RICK PEDLEY Recvd: NO
Subj: Re:fast 3-d Wireframe Conf: (2) Quik_Bas
> On 04-18-92 RICH GELDREICH wrote to Rick Pedley...
> RG> Well, here you go! The following 3 messages contain a FAST 3-D
> RG> program. See the last message for more details...
> This is excellent stuff! It really demonstrates to me what is
> possible in pure BASIC. I must have fooled around with it for
> about an hour last night. Now -- how about giving us a rundown
> on what the code does? Something this good shouldn't pass by
> undocumented. (BTW, the only glitch I found was the occasional
> overflow error when the object strays too far into
Ow ya, about that glich. It does hang up the compiled program once
in a while. I hate when that happens! Damn.
The program has its origons to June of
rotate a simple, mediocre 3-D cube. Well, logically, there must be 3
seperate coordinates, not two. I knew how to rotate 2-D coordinates
about the origon- with sine and cosine.
To rotate a X,Y point in 2-D space, the following formulus can be
Xnew= Xold * Cosine(Angle) + YOld * Sine(Angle)
Ynew= Xold * Sine(Angle) - YOld * Cosine(Angle)
(This formula may differ a bit from the program- I'm doing this off the
top of my head)
This will rotate any 2-D point around an origon of (0,0). Simple enough.
It gets a little hairy with 3-D. I came up with this solution...
Two identify any 3-D vector in the universe, you must have 3 angles, of
course. The first angle rotates about the X & Y axis. The second, the X
& Z and the third rotates about the Y & Z. (I've only implemented the X,
& Z and Y & Z in the program you got for speed). So, the new formulas
for rotating a 3-D point are:
Xnew= X * Cosine + Z * Sine
Ztemp= X * Sine - Z * Cosine
Ynew=Y * Cosine2 + Ztemp * Sine2
Znew=Y * Sine2 - Ztemp * Cosine2
Where Cosine and Sine are: cos(Angle1) & sin(Angle1)
Where Cosine2 and Sine2 are: cos(Angle2) & sin(Angle2)
(the above calculations will only rotate on 2 axis. The only axis left
is the X and Y)
After all that's done, it's time for perspective. It took me weeks to
derive that formula.
Here's a rundown on how the perspective formula works: Take the freshly
rotated, 3-D point and draw a line from it to where you are "standing".
Wherever this line crosses the "viewing screen" [which is always
directly in front of you] is where you have to plot the point on the
monitor. (Clear as mud, huh?)
To simplify things, I always assume that the user is "standing" directly
at the origon of the 3-D world, or (0,0,0).
Here's the formula:
Xnew=Xold+(-Xold*( (Spos - Zold) / (Mpos - Zold) ) )
Ynew=Yold+(-Yold*( (Spos - Zold) / (Mpos - Zold) ) )
Where Spos is the Z coordinate of the viewing screen and MPos is the
Z coordinate of the user. Interesting notes: If you make Mpos get
farther and farther away from the screen, you will be looking at
yourself! This is how flight simulators get an outside view of the
craft(or at least that's how they can...)
Most 3-D simulations use a much simple formula(which I forget offhand)
for placing their views in perspective. Ow ya, it's quicker than mine,
but it is only correct for points that are directly in front of the user
and that is not "cool" for a universe(if you see what I mean...).
To get the most speed, I only use integer math. In the very
begginning of the program, I calculate a big sine and cosine
table(that's why there's such a big delay). Remember: for maximum speed,
always use integer math over floating point ! !
If you liked that little program, then you'll love my first shareware
product, Warp Field Animator. It's written in QB and assembly- of
course. It rotates/warps/animates 2-D and 3-D fields from user selected
parameters. It can also load a .gif file and allow the user to warp,
rotate, "tornado", & destroy it as much as the user wants! It's awesome!
See ya around! Rich Geldreich
--- RBBSMAIL 17.2A
* Origin: Computer Co-Op RBBS HST, 609-784-9404 Voorhees
NJ (RBBS-PC 1:266/29)