欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    课程实验指导5-投影参考模板.doc

    • 资源ID:15004415       资源大小:89KB        全文页数:8页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    课程实验指导5-投影参考模板.doc

    课程实验指导五实验5 投影1实验目的:了解透视图投影原理,利用VC+OpenGL实现立方体的一点、两点、三点透视图算法。2实验内容:(1) 理解投影原理;(2) 读懂示范代码;(3) 增加键盘控制,控制一点透视点产生正方体的移动、旋转效果;(4) 实现两点透图效果。3实验原理:本次实验内容为绘制立方体的一点透视图。透视投影按照主灭点的个数分为一点透视、二点透视和三点透视,如下图1所示。灭点灭点灭点灭点灭点灭点 图1 立方体的三类透视其中一点透视情况如图2所示,设z轴上有一观察点(即视点)V(0,0,d),从V点出发将物体上的点P( x, y, z)投影到XOY平面上得到P' (x',y',0),由相似三角形可知一点透视变换矩阵为:图2 一点透视示意1 / 8.(1)根据以上,可得一点透视变换的步骤如下:(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 <GL/glut.h>#include <stdio.h>#include <math.h>struct Matrix double p44; Matrix operator*(Matrix &); Matrix();/单位矩阵;Matrix:Matrix() for(long i=0;i<4;i+) for(long j=0;j<4;j+) if(i=j) pij = 1; else pij = 0; Matrix Multiply(Matrix& m1, Matrix& m2)Matrix m;for(int i=0;i<4;i+)for(int j=0;j<4;j+)for(int k=0;k<4;k+)m.pij+=(m1.pik*m2.pkj);return m;struct Pt2D int x, y;Pt2D()x = 0; y = 0;Pt2D(int px, int py)x = px; y = py;struct Pt3D float 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; idx4 = 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()/初始化参数mT.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);void Project(Pt3D pt, Pt2D &pt2D)/透视变换double ptH4;ptH0=pt.x;/ptH1=pt.y;ptH2=pt.z;ptH3=1;double res4;for(int i=0;i<4;i+)resi = 0;for(i=0;i<4;i+)for(int j=0;j<4;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, 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:idx = fInfo.idx4;break;default:break;return idx;void BoxProject()int ptIdx;Pt2D pt2D;for(int face=0;face<6;face+)int num=fInfoface.num;/面的总边数for(int i=0;i<num;i+)/边循环ptIdx = GetPtIdx(fInfoface, i);/面的顶点号Project(boxPtptIdx, pt2D);boxPt2dptIdx = pt2D;void DrawBox()int ptIdx4;for(int face=0;face<4;face+)int num =fInfoface.num;/面的总顶点数for(int i=0;i<num;i+)/循环ptIdxi = GetPtIdx(fInfoface, i+1);/面的顶点号for(int j=0; j<4; j+)int idx0 = ptIdxj;int idx1 = (j= 3) ? ptIdx0:ptIdxj+1);LineGL(boxPt2didx0, boxPt2didx1);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)glViewport(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/2);boxPt1 = Pt3D(-bl/2, bl/2, -bl/2);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);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);glutInitWindowSize(640, 480);glutCreateWindow("Hello World!");ReadPoint();ReadFace();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;5. 思考题:请修改上述代码,使之实现两点透视图。

    注意事项

    本文(课程实验指导5-投影参考模板.doc)为本站会员(doc321)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开