平行投影应该是最简单的,将三维点中的z坐标忽略掉就可以了
以下范例先定义了正方体的八个顶点
然后将正方体按x轴旋转20度,再按y轴旋转20度,然后平行投影显示到平面上
平行投影的效果不如透视的好,但是不用设置视点。有兴趣的可以和这个比较一下:
http://tieba.baidu.com/f?kz=888190791
上面的例子用的是单点透视投影,有动画效果,就是比较复杂
希望这个例子对大家学习图形学有一定的帮助
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define PI 3.1415926536
// 定义三维点
struct POINT3D
{
double x;
double y;
double z;
};
// 使三维点按 x 轴旋转指定角度
void RotateX(POINT3D &p, double angle)
{
double y = p.y;
p.y = p.y * cos(angle) + p.z * sin(-angle);
p.z = y * sin(angle) + p.z * cos(angle);
}
// 使三维点按 y 轴旋转指定角度
void RotateY(POINT3D &p, double angle)
{
double x = p.x;
p.x = p.x * cos(angle) + p.z * sin(-angle);
p.z = x * sin(angle) + p.z * cos(angle);
}
// 使三维点按 z 轴旋转指定角度
void RotateZ(POINT3D &p, double angle)
{
double x = p.x;
p.x = p.x * cos(angle) + p.y * sin(-angle);
p.y = x * sin(angle) + p.y * cos(angle);
}
// 主函数
void main()
{
// 初始化
initgraph(640, 480); // 建立绘图窗口
setorigin(320, 240); // 设置原点为屏幕中央
setaspectratio(1, -1); // 设置 y 轴向上为正
// 定义正方体八个顶点坐标
// x 向右为正,y 向上为正,z 向远方为正
POINT3D dots[8] = { {-100, -100, -100}, {-100, 100, -100}, {100, 100, -100}, {100, -100, -100}, {-100, -100, 100}, {-100, 100, 100}, {100, 100, 100}, {100, -100, 100} };
int i;
// 绕 x 轴旋转 20 度,即 PI/9
for (i=0; i<8; i++)
RotateX(dots[i], PI/18);
// 绕 y 轴旋转 20 度,即 PI/9
for (i=0; i<8; i++)
RotateY(dots[i], PI/18);
// 显示正方体。要画 12 条线,好麻烦
moveto((int)dots[0].x, (int)dots[0].y);
lineto((int)dots[1].x, (int)dots[1].y);
lineto((int)dots[2].x, (int)dots[2].y);
lineto((int)dots[3].x, (int)dots[3].y);
lineto((int)dots[0].x, (int)dots[0].y);
lineto((int)dots[4].x, (int)dots[4].y);
lineto((int)dots[5].x, (int)dots[5].y);
lineto((int)dots[6].x, (int)dots[6].y);
lineto((int)dots[7].x, (int)dots[7].y);
lineto((int)dots[4].x, (int)dots[4].y);
line((int)dots[1].x, (int)dots[1].y, (int)dots[5].x, (int)dots[5].y);
line((int)dots[2].x, (int)dots[2].y, (int)dots[6].x, (int)dots[6].y);
line((int)dots[3].x, (int)dots[3].y, (int)dots[7].x, (int)dots[7].y);
// 按任意键退出
getch();
closegraph();
}
以下范例先定义了正方体的八个顶点
然后将正方体按x轴旋转20度,再按y轴旋转20度,然后平行投影显示到平面上
平行投影的效果不如透视的好,但是不用设置视点。有兴趣的可以和这个比较一下:
http://tieba.baidu.com/f?kz=888190791
上面的例子用的是单点透视投影,有动画效果,就是比较复杂
希望这个例子对大家学习图形学有一定的帮助
#include <graphics.h>
#include <conio.h>
#include <math.h>
#define PI 3.1415926536
// 定义三维点
struct POINT3D
{
double x;
double y;
double z;
};
// 使三维点按 x 轴旋转指定角度
void RotateX(POINT3D &p, double angle)
{
double y = p.y;
p.y = p.y * cos(angle) + p.z * sin(-angle);
p.z = y * sin(angle) + p.z * cos(angle);
}
// 使三维点按 y 轴旋转指定角度
void RotateY(POINT3D &p, double angle)
{
double x = p.x;
p.x = p.x * cos(angle) + p.z * sin(-angle);
p.z = x * sin(angle) + p.z * cos(angle);
}
// 使三维点按 z 轴旋转指定角度
void RotateZ(POINT3D &p, double angle)
{
double x = p.x;
p.x = p.x * cos(angle) + p.y * sin(-angle);
p.y = x * sin(angle) + p.y * cos(angle);
}
// 主函数
void main()
{
// 初始化
initgraph(640, 480); // 建立绘图窗口
setorigin(320, 240); // 设置原点为屏幕中央
setaspectratio(1, -1); // 设置 y 轴向上为正
// 定义正方体八个顶点坐标
// x 向右为正,y 向上为正,z 向远方为正
POINT3D dots[8] = { {-100, -100, -100}, {-100, 100, -100}, {100, 100, -100}, {100, -100, -100}, {-100, -100, 100}, {-100, 100, 100}, {100, 100, 100}, {100, -100, 100} };
int i;
// 绕 x 轴旋转 20 度,即 PI/9
for (i=0; i<8; i++)
RotateX(dots[i], PI/18);
// 绕 y 轴旋转 20 度,即 PI/9
for (i=0; i<8; i++)
RotateY(dots[i], PI/18);
// 显示正方体。要画 12 条线,好麻烦
moveto((int)dots[0].x, (int)dots[0].y);
lineto((int)dots[1].x, (int)dots[1].y);
lineto((int)dots[2].x, (int)dots[2].y);
lineto((int)dots[3].x, (int)dots[3].y);
lineto((int)dots[0].x, (int)dots[0].y);
lineto((int)dots[4].x, (int)dots[4].y);
lineto((int)dots[5].x, (int)dots[5].y);
lineto((int)dots[6].x, (int)dots[6].y);
lineto((int)dots[7].x, (int)dots[7].y);
lineto((int)dots[4].x, (int)dots[4].y);
line((int)dots[1].x, (int)dots[1].y, (int)dots[5].x, (int)dots[5].y);
line((int)dots[2].x, (int)dots[2].y, (int)dots[6].x, (int)dots[6].y);
line((int)dots[3].x, (int)dots[3].y, (int)dots[7].x, (int)dots[7].y);
// 按任意键退出
getch();
closegraph();
}