C语言 如何使用等轴测投影将三维坐标转换为二维坐标?

bxjv4tth  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(166)

编程语言:C级
我目前正在实施的过程中,三维线框模型表示通过等距投影。
我目前对该项目的理解是:
1.解析包含线框模型的x、y、z坐标的文本Map
1.使用等轴测投影将3D坐标转换为2D坐标
1.使用Bresenham线算法和我选择的图形库中的一些函数绘制线。
我已经完成了第1步,但在过去的几天里,我一直停留在第2步。
我知道等角投影是将一个2D平面以一个Angular 投影的过程,即使我们在画线的时候只使用x,y,这个Angular 看起来也像是3D的。这是定义。不是描述它的最好方式,如果我说错了,请纠正我。
文本Map示例:
0 0 0
0 5 0
0 0 0
我选择的数据结构(实现为结构数组)

typedef struct point
{
    float       x;
    float       y;
    float       z;
    bool        is_last;
    int     color; // Implemented after mandatory part
} t_point;

我基本上只是读出文本Map的行、列和值,并将它们分别存储在x、y、z值中。
现在我必须转换它们,我尝试了以下公式:
一个一个一个一个一个x一个一个二个一个x一个一个三个一个x一个一个x一个四个一个
它吐出各种各样的东西,这对我来说毫无意义。我可以只去一个,并试图实现线算法。从这里,并希望最好的,但我想了解我实际上在这里做什么。其次,我通过我的研究,我了解到,我需要设置我的相机在一定的方式来创建投影。
总而言之,我只是非常迷失,我的问题归结为这一点。
1.请帮助我理解等角投影的概念。
1.如何使用等轴测投影将三维坐标(x,y,z)转换为坐标。

bzzcjhmw

bzzcjhmw1#

我是这样看的:

// constants:
float deg = M_PI/180.0;
float ax = 30*deg;
float ay =150*deg;
vec2 X = vec2(cos(ax),-sin(ax)); // x axis
vec2 Y = vec2(cos(ay),-sin(ay)); // y axis
vec2 Z = vec2(    0.0,-    1.0); // z axis
vec2 O = vec2(0,0);              // position of point (0,0,0) on screen
// conversion:
vec3 p=vec3(?,?,?); // input point
vec2 q=O+(p.x*X)+(p.y*Y)+(p.z*Y); // output point

坐标形式:

float Xx =  cos(ax);
float Xy = -sin(ax);
float Yx =  cos(ay);
float Yy = -sin(ay);
float Zx =      0.0;
float Zy = -    1.0;
float Ox =        0;
float Oy =        0;
// conversion:
float px=?,py=?,pz=?; // input point
float qx=Ox+(px*Xx)+(py*Yx)+(pz*Yx); // output point
float qy=Oy+(px*Xy)+(py*Yy)+(pz*Yy); // output point

假设x轴向右,y轴向下... O通常设置为屏幕中心,而不是(0,0),除非您添加了等距世界的平移功能。
如果您想在“3D”XY平面内添加任意旋转,请参见:

因此,您只需计算椭圆上的X,Y向量(注意,它们不再是单位!!!),因此,如果我理解正确,则为:

float ax=?,ay=ax+90*deg;
float Xx =  cos(ax)    ;
float Xy = -sin(ax)*0.5;
float Yx =  cos(ay)    ;
float Yy = -sin(ay)*0.5;

其中ax是旋转角...

相关问题