js9b+@andrew.cmu.edu (Jon C. Slenk) (11/17/88)
Ok - I have been working on this for some time (few days) and have a book which isn't helping much, nor are the others. So: How does one do 3D to 2D transformations ie (x,y,z) -> screen (x,y). Email, please, as I am sure most everyone knows all about all this... thanks. Jon Slenk / js9b CMU.
josef@ugun21.UUCP (11/21/88)
Subject: How does one do 3D to 2D transformations ie (x,y,z) -> screen (x,y).
I know that
> "most everyone knows all about all this..."
but I DON'T, and I would be interested as well ...
Josef Moellers
paper mail: e-mail:
c/o Nixdorf Computer AG USA: uunet!linus!nixbur!nixpbe!mollers.pad
Abt. EG-3 !USA: mcvax!unido!nixpbe!mollers.pad
Unterer Frankfurter Weg
D-4790 Paderborn
tel.: (+49) 5251 104691
Standard disclaimer: Blablabla opinion blablabla employer blablabla!
cheng@galaxy.ee.rochester.edu (Bruce Cheng (396 Account)) (11/21/88)
In article <wXUS8hy00V4IE1Fl1r@andrew.cmu.edu> js9b+@andrew.cmu.edu (Jon C. Slenk) writes: >Ok - I have been working on this for some time (few days) and have a book which >isn't helping much, nor are the others. So: > >How does one do 3D to 2D transformations ie (x,y,z) -> screen (x,y). > >Email, please, as I am sure most everyone knows all about all this... > >thanks. > >Jon Slenk / js9b CMU. Can any one send me imformatino about this also? Thanks in advance. Bruce Cheng cheng@cs.rochester.edu
scott@applix.UUCP (Scott Evernden) (11/26/88)
In article <16400001@ugun21> josef@ugun21.UUCP writes: > > >Subject: How does one do 3D to 2D transformations ie (x,y,z) -> screen (x,y). > >I know that >> "most everyone knows all about all this..." >but I DON'T, and I would be interested as well ... You can get a good introduction to this topic as well as some functioning Pascal code with hidden-line handling in the March and April 1981 issues of BYTE mag. Look for the 2-part article "Three-Dimensional Computer Graphics" by Franklin Crow. All you need to know to get started... -scott
gates@nsc.nsc.com (Tim Gates) (11/26/88)
To convert from 3D (x,y,z) to 2D (h,v): Address your screen via two variables h (horiz) and v (vert). On this flat screen you have three lines: 1) a vertical line (represents z axis) 2) a diagonal line higher on left than right (represents y axis) 3) a diagonal line lower on left than right (represents x axis) Phi is the angle of line 2 from horizontal. Theta is the angle of line 3 from horizontal. Phi and Theta determine the "tilt" of the projection. Small angles make the x-y plane appear to be perpendicular to your screen. Larger angles tilt the x-y plane. I like 30 degrees (0.52 radians) for both phi and theta. Next Calculate 4 constants: sin_y = -sin(phi); cos_y = cos(phi); sin_x = -sin(theta); cos_x = cos(theta); The conversion from 3D to 2D is: v = z + (y * sin_y) + (x * sin_x); /* double flat_v(x,y,z); */ h = (y * cos_y) - (x * cos_x); /* double flat_h(x,y); */ I suggest doing the conversion as a macro: #define flat_v(x,y,z) ((z) + ((y) * sin_y) + ((x) * sin_x)) #define flat_h(x,y) (((y) * cos_y) - ((x) * cos_x)) Notice that h and v are floating point values; they should be scaled to convert them to screen pixel cooridinates: Assume that max_x, max_y, max_z, min_x, min_y, min_z are the limits of 3-Space you will be dealing with. Now to calculate the limits of 2-space: double max_x, max_y, min_x, min_y; max_v = flat_v(min_x,min_y,max_z); min_v = flat_v(max_x,max_y,min_z); max_h = flat_h(max_x,min_y); min_h = flat_h(min_x,max_y); Determine the scaling amounts: Assume that max_c is the number of horizontal pixels (columns) on the screen. Assume that max_r is the number of vertical pixels (rows) on the screen. Lower left corner of screen is 0,0. double max_c = 799.0; /* screen is 800x600 */ double max_r = 599.0; double scl_c, scl_r, off_c, off_r; /* scaling parameters */ off_c = min_h; scl_c = (max_c + 1.0) / (max_h - min_h); off_r = min_v; scl_r = (max_r + 1.0) / (max_v - min_v); The Scaling functions are: int scale_c(horz) double horz; { int c; double t; t = (horz - off_c) * scl_c; if(t < 0.0) t = 0.0; if(t > max_c) t = max_c; c = t + 0.5; /* round off */ return(c); } int scale_r(vert) double vert; { int r; double t; t = (vert - off_r) * scl_cr if(t < 0.0) t = 0.0; if(t > max_r) t = max_r; r = t + 0.5; /* round off */ return(r); } To plot a pixel: Assume that the function set_pix(c,r,color) sets the pixel in row r, column c to color. The 3-space pixel plotting is: void set_pix3(x,y,z,c) double x,y,z; int c; /* color */ { set_pix( scale_c( flat_h(x,y)), scale_r( flat_v(x,y,z)), c); } Speedups: In the scaling routines: Convert to int, then bounds check. Convert set_pix3 to a macro. I hope you have fun with this... Standard discalmer: Use at your own risk. I entered this from memory. -- Tim Gates National Semiconductor {amdahl|decwrl|hplabs|nscpdc|pyramid|sun|voder}!nsc!gates "Where the men are men, and the computers run scared."
chem4m@jetson.uh.edu (08/04/90)
I am looking for generic routines to convert 3d coordinates into 2d ( I am actually writing the prog. In TP pascal. Any help in this matter would be appreciated. Thanks in advance Avijit Ghosh