Thank you for the help and suggestions with this.  After playing with the 
suggested formulas I was able to figure out how they work...  The solution to 
this is probably somewhere but I ended up just doing it myself.

I realized that Thomas' formula 
var H1 = (Y - X) * 0.86602 + ScreenOrgin_H; var V1 = (X + Y) * 0.5 - Z + 
ScreenOrgin_V;
was multipying by the cosine of 30 degrees for H1 and the Sine of 30 degrees 
for V1.... 

and Gustavo's forumla was basically the same thing but multiplying by the 
cosine and sine of 45 degrees...  

so I realized that all I really want to do has nothing to do with camera 
angles, or projections or anythng else... I just strictly need do the 3D 
rotations then just display the resulting X, and Y coordinate and ignore Z.     
  My original 2D representaion showing only X and Y is as if I am looking 
perfectly straight down at it.. so I can't see the Z only lines, but after I 
perform the 3D rotations now I can see the Z component as they end up being 
represented on the X and Y axis.... but I still act like I am still looking 
straight down at it, so I only plot X and Y.
I checked the results of my formula against my CAD program everything looks 
EXACTLY the same no matter how I change the rotations,  so this must be what 
the CAD program is doing as well.

Here are the formula I came up with that allows me to adjust the 3 possible 
rotations,  A - rotating around the X axis, B rotating around the Y axis, and C 
rotating around the Z axis.

X1 - initial X coordinate
Y1 - initial Y coordinate
Z1 - initial Z coordinate
X2 - output  X coordinate
Y2 - output Y coordinate

//XY Rotation - only rotates X and Y around the Z axis (C Rotation)
  XC_Point := ((CoSine(C_Angle) * (X1-XC_Center)) - (Sine(C_Angle) * 
(Y1-YC_Center) )) + XC_Center;
  YC_Point := ((CoSine(C_Angle) * (Y1-YC_Center)) + (Sine(C_Angle) * 
(X1-XC_Center) )) + YC_Center;
  ZC_Point :=Z1;

//XZ Rotation - only rotates X and Z around the Y axis (B Rotation)
  XB_Point := ((CoSine(B_Angle) * (XC_Point-XB_Center)) + (Sine(B_Angle) * 
(ZC_Point-ZB_Center) )) + XB_Center;
  YB_Point := YC_Point;
  ZB_Point :=  ((CoSine(B_Angle) * (ZC_Point-ZB_Center)) - (Sine(B_Angle) * 
(XC_Point-XB_Center) )) + ZB_Center;

//YZ Rotation  - only rotates Y and Z around the X axis (A Rotation)
  XA_Point := XB_Point;
  YA_Point := ((CoSine(A_Angle) * (YB_Point-YA_Center)) - (Sine(A_Angle) * 
(ZB_Point-ZA_Center) )) +@YA_Center;
  ZA_Point := ((CoSine(A_Angle) * (XB_Point-XA_Center)) + (Sine(A_Angle) * 
(ZB_Point-ZA_Center) )) + XA_Center;     // useless to plot point, just for 
information
  
X2 := Scale * XA_Point+X_Offset;
Y2 := Scale * YA_Point+Y_Offset;

Notes:  

My fuctions CoSine and Sine convert the angle to radians from given degrees. 

I have my 0,0 located in the lower left hand corner, but PTC-Graph has it in 
the upper left corner.. I used the above formula before the section that takes 
care of getting it on the screen, I don't know if some adjustment would be 
nessecary for use on direct screen coordinates... things might end up upside 
down, or the rotations might need to be reversed by switching the + and - 
between CoSine and Sine because of this.. 


Thank you again for all the help and suggestions.  I also found the websites 
and books on the subject very interesting as well.

James


-----Original Message-----
From: fpc-pascal <fpc-pascal-boun...@lists.freepascal.org> On Behalf Of Thomas 
Young via fpc-pascal
Sent: Tuesday, September 17, 2019 5:00 PM
To: FPC-Pascal users discussions <fpc-pascal@lists.freepascal.org>
Cc: Thomas Young <tygraph...@icloud.com>
Subject: Re: [fpc-pascal] Calculating Pixels to represent 3D coordinates

This is an isometric projection I use:
var H1 = (Y - X) * 0.86602 + ScreenOrgin_H; var V1 = (X + Y) * 0.5 - Z + 
ScreenOrgin_V;

Thomas Young
330-256-7064
Sent from my iPhone

> On Sep 17, 2019, at 4:53 PM, Gustavo Enrique Jimenez <gejime...@gmail.com> 
> wrote:
> 
> A simple transformation is:
> 
> P3D=(X,Y,Z)
> P2D=(x,y)
> 
> x=X+Y*0.707
> y=Y*0.707+Z
> 
> I did not tried it, but I think that this is the transformation that 
> you are looking for.
> 
> 
> Gustavo
> 
> El mar., 17 sept. 2019 a las 17:37, James Richters
> (<ja...@productionautomation.net>) escribió:
>> 
>>> What exactly are you trying to do? Usually if you’re doing 3D this all 
>>> happens on the GPU and you get back a color/depth buffer. Maybe you need to 
>>> know where a 2D coordinate is in 3D space?
>> 
>> What I'm trying to do is much simpler than rendering a 3D object..  All I'm 
>> trying to do is display a 3D line drawing or wireframe on the screen.  I 
>> don't need it to dynamically rotate or anything, and it doesn't need to show 
>> any surfaces, textures, lighting, reflections, or shadows, just give a 
>> representation of the XYZ points and lines connecting 2 pair of XYZ 
>> coordinates on the screen.   The purpose of this is to show a 3D 
>> representation of a CNC tool path including the Z movements.
>> 
>> James
>> _______________________________________________
>> fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org 
>> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org 
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org 
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to