版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、最新资料推荐课程实验指导五实验 5 投影1实验目的:了解透视图投影原理,利用vc+opengl实现立方体的一点、两点、三点透视图算法。2实验内容:( 1) 理解投影原理;( 2) 读懂示范代码;( 3) 增加键盘控制,控制一点透视点产生正方体的移动、旋转效果;( 4) 实现两点透图效果。3实验原理:本次实验内容为绘制立方体的一点透视图。透视投影按照主灭点的个数分为一点透视、二点透视和三点透视,如下图1 所示。灭点灭点灭点灭点灭点灭点图 1 立方体的三类透视其中一点透视情况如图 2 所示,设 z 轴上有一观察点(即视点) v(0,0,d),从 v 点出发将物体上的点 p( x, y, z)投影到
2、 xoy平面上得到 p (x,y,0) ,由相似三角形可知一点透视变换矩阵为:yvp(x,y,z)oxzp (x, y, z)图 2 一点透视示意1最新资料推荐100001000001 .(1)d0001根据以上,可得一点透视变换的步骤如下:(1)将三维形体平移到适当位置lx、 ly、 lz;(2)令视点在z 轴 (0,0,d) ,利用上述公式(1)进行透视变换;4实验代码:/ projection.cpp : defines the entry point for the console application./#include stdafx.h#include #include #inc
3、lude struct matrixdouble p44;matrix operator*(matrix &);matrix();/ 单位矩阵;matrix:matrix()for(long i=0;i4;i+)for(long j=0;j4;j+)if(i=j) pij = 1;else pij = 0;matrix multiply(matrix& m1, matrix& m2)matrix m;for(int i=0;i4;i+)for(int j=0;j4;j+)for(int k=0;k4;k+)m.pij+=(m1.pik*m2.pkj);2最新资料推荐return m;struc
4、t pt2d int x, y;pt2d()x = 0; y = 0;pt2d(int px, int py)x = px; y = py;struct pt3dfloat x, y, z;pt3d()x = 0; y = 0; z = 0;pt3d(float px, float py, float pz)x = px; y = py; z = pz;struct faceinfo / 第一列为每个面的顶点数;其余列为面的顶点编号 int num, idx1, idx2, idx3, idx4;faceinfo()num = 0; idx1 = 0; idx2 = 0;idx3 = 0; i
5、dx4 = 0;faceinfo(int fnum, int fidx1, int fidx2, int fidx3, int fidx4)num = fnum; idx1 = fidx1; idx2 = fidx2;idx3 = fidx3;idx4 = fidx4;double lx = 480, ly = 460, lz = 240;double phi = 0;double d = -500;matrix mt, mr, mp, mtemp, ma;pt3d boxpt8;pt2d boxpt2d8;faceinfo finfo6;void initparameter()/初始化参数m
6、t.p30 = lx; mt.p31 = ly;mt.p32 = lz;mr.p00 = cos(phi); mr.p02 = -sin(phi);mr.p20 = sin(phi); mr.p22 = cos(phi);mp.p22 = 0;mp.p23 = -1/d;mtemp = multiply(mt, mr);ma = multiply(mtemp, mp);3最新资料推荐void project(pt3d pt, pt2d &pt2d)/透视变换double pth4;pth0=pt.x;/pth1=pt.y;pth2=pt.z;pth3=1;double res4;for(int
7、 i=0;i4;i+)resi = 0;for(i=0;i4;i+)for(int j=0;j4;j+)resi+=(pthj*ma.pji);pt2d = pt2d(res0/res3, res1/res3);void linegl(pt2d pt0, pt2d pt1)glbegin (gl_lines);glcolor3f (1.0f, 0.0f, 0.0f);glvertex2f (pt0.x,pt0.y);glcolor3f (0.0f, 1.0f, 0.0f);glvertex2f (pt1.x,pt1.y);glend ();int getptidx(faceinfo finfo
8、, int ptidx)int idx = 0;switch (ptidx)case 1:idx = finfo.idx1;break;case 2:idx = finfo.idx2;break;case 3:idx = finfo.idx3;break;case 4:4最新资料推荐idx = finfo.idx4;break;default:break;return idx;void boxproject()int ptidx;pt2d pt2d;for(int face=0;face6;face+)int num=finfoface.num;/面的总边数for(int i=0;inum;i
9、+)/边循环ptidx = getptidx(finfoface, i);/面的顶点号project(boxptptidx, pt2d);boxpt2dptidx = pt2d;void drawbox()int ptidx4;for(int face=0;face4;face+)int num =finfoface.num;/面的总顶点数for(int i=0;inum;i+)/循环ptidxi = getptidx(finfoface, i+1);/面的顶点号for(int j=0; j4; j+)int idx0 = ptidxj;int idx1 = (j= 3) ? ptidx0:p
10、tidxj+1);linegl(boxpt2didx0, boxpt2didx1);5最新资料推荐void mydisplay()glclear(gl_color_buffer_bit);glcolor3f (1.0f, 0.0f, 0.0f);initparameter();boxproject();drawbox();glutswapbuffers();void init()glclearcolor(0.0, 0.0, 0.0, 0.0);glshademodel(gl_flat);printf(hello cube!n);void reshape(int w, int h)glviewp
11、ort(0, 0, (glsizei) w,(glsizei) h);glmatrixmode(gl_projection);glloadidentity();gluortho2d(0.0, (gldouble) w, 0.0, (gldouble) h);void keyboard(unsigned char key, int x, int y)switch (key)case x:break;default:break;void readpoint()/ 读入 8 个顶点坐标float bl = 200;/box lengthboxpt0 = pt3d(-bl/2, -bl/2, -bl/
12、2);boxpt1 = pt3d(-bl/2, bl/2, -bl/2);6最新资料推荐boxpt2 = pt3d(-bl/2, bl/2, bl/2);boxpt3 = pt3d(-bl/2, -bl/2, bl/2);boxpt4 = pt3d(bl/2, -bl/2, -bl/2);boxpt5 = pt3d(bl/2, bl/2, -bl/2);boxpt6 = pt3d(bl/2, bl/2, bl/2);boxpt7 = pt3d(bl/2, -bl/2, bl/2);void readface()/ 读入 6 个面坐标finfo0 = faceinfo(4, 0, 1, 2, 3
13、);finfo1 = faceinfo(4, 0, 3, 7, 4);finfo2 = faceinfo(4, 4, 5, 6, 7);finfo3 = faceinfo(4, 5, 1, 2, 6);finfo4 = faceinfo(4, 7, 6, 2, 3);finfo5 = faceinfo(4, 4, 5, 1, 0);int main(int argc, char *argv)glutinit(&argc, argv);glutinitdisplaymode(glut_rgb | glut_double);glutinitwindowposition(100, 100);glutini
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 活动5 制作金属丝衣架教学设计小学劳动北师大版六年级-北师大版
- 人教新目标(Goforit)版七年级下册SectionA第1课时教学设计
- 高中生物下学期《生态系统的结构》教学设计
- 活动二:自制泡沫盆景(教学设计)五年级下册综合实践活动沪科黔科版
- 市政工程项目合作开发合同
- 2026年元阳县医疗事业单位人员招聘考试模拟试题及答案解析
- 2026年沈丘县社区工作者招聘笔试参考题库及答案解析
- 2026年肇源县带编教师招聘笔试备考题库及答案解析
- 高中一年级劳动课绿色食品检测与烹饪教学设计
- 高中一年级信息技术for循环的应用教学设计-运用循环结构描述问题求解过程
- 心肺运动试验(CPET)标准化质量控制全流程科室业务学习资料
- 烟花爆竹从业人员安全教育培训计划
- 网络科学导论
- 2026年中级群众文化馆员职称评审面试题及答案解析
- 2026综合版《安全员手册》
- 光伏项目材料报验模板
- 义务教育美术(2022版)新课程标准考试测试题及答案
- 2026科粤版九年级化学上学期期末复习知识清单(默写版+解析版)
- 2025年江西省九江市检察院书记员考试试题及答案
- GB/T 47054-2026森林草原防火无人机巡查技术规范
- 2026年北京市门头沟区社区工作者考试真题解析含答案
评论
0/150
提交评论