参考博文:
http://blog.sina.com.cn/s/articlelist_1287275024_9_1.html
正交投影能精确表达物体的某个侧面尺寸,但仅从一个视图很难想象出该物体的三维形状,将多个视图结合在一起,则能综合表达物体的空间形状。通过三视图的投影变换显示物体与3个投影平面(H、V和W)相对位置关系如图例所示。
三维图形几何变换:
类似二维变换,三维变换引入了齐次坐标技术,在思维空间(x,y,z,w)内进行讨论,三维图形几何变换就可以表示为物体顶点集合的规范化齐次坐标矩阵与某一变换矩阵相乘的形式。
变换矩阵通常如下图:
基础的变换有平移,比例,旋转,反射,错切,这里不在叙述。
本文要讲的三视图的实现是基于平行投影,是因为显示器只能用二维图形表示三维物体,所以三维物体要靠投影来降低维数得到二维平行图形。投影就是从投影中心发出射线,经过三维物体的每一个点后,与投影面相交所形成的交点集合。
投影的分类如下:
下面用一个程序来简单实现三视图投影:
运行所需环境:eazyx图形库,下载地址:https://easyx.cn/
,安装十分简单,仅需一分钟
编译器:VS2017
运行结果:
#include <easyx.h>
#include <conio.h>
#define N 8
float p[N][4] = {//点的坐标
{0,0,0,1},
{2,0,0,1},
{2,1,0,1},
{0,1,0,1},
{0,0,3,1},
{2,0,3,1},
{2,1,3,1},
{0,1,3,1}
};
int tp[] = { -1,0,1,2,3,0,1,5,4,0,3,7,4,0,-100};//画线顺序拓扑数组
void matrix(float t[][4]);//矩阵变换函数
void draw(float z[][4], float xt0, float yt0, float ts0);//画图函数
void matrix(float t[][4])
{
float z[N][4];
int i, j, k;
for (i = 0; i < N; i++)
for (j = 0; j < 4; j++)
{
z[i][j] = 0;
for (k = 0; k < 4; k++)
z[i][j] = z[i][j] + p[i][k] * t[k][j];
}
draw(z, 200,200,30);//调用画图函数
}
void draw(float z[][4], float xt0, float yt0, float ts0)
{
float x[N], y[N];
int i;
for (i = 0; i < N; i++)//在这个循环中把三维点变为二维点
{
x[i] = xt0 - z[i][0] * ts0;
y[i] = yt0 - z[i][2] * ts0;
}
for (i = 0; i < 1000; i++)//根据拓扑顺序画点描线
{
if (tp[i] == -100) break;
if (tp[i] == -1)
{
i++;
moveto(x[tp[i]], y[tp[i]]);
}
if (tp[i] >= 0)
lineto(x[tp[i]], y[tp[i]]);
}
}
void zuobiaoxi()
{
line(0,300,800,300);
line(350,0,350,600);
outtextxy(750,310,"x");
outtextxy(30, 310, "y");
outtextxy(330,20, "z");
outtextxy(330,580, "x");
}
int main()
{
initgraph(800,600); // 创建绘图窗口,大小为 800x600 像素
static float tv[4][4], th[4][4], tw[4][4];//设置三个变换矩阵
tv[0][0] = 1; tv[2][2] = 1; tv[3][3] = 1;
th[0][0] = 1; th[1][2] = -1; th[3][2] = -10; th[3][3] = 1;
tw[1][0] = -1; tw[2][2] = 1; tw[3][0] = -10; tw[3][3] = 1;
matrix(tv);
matrix(th);
matrix(tw);
zuobiaoxi();
_getch(); // 按任意键继续
closegraph();
return 0;
}
最后,希望我和大家都能扎扎实实的打好基础,理解掌握图形学这些基础知识。