版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OpenGL由已知控制点绘制模拟曲面地形 转载请注明出处/zhouchanwen主要要点:1.将离散的数据点网格化曲面2.对3d模型的鼠标控制,如虚拟球的实现由已知控制点通过曲面拟合方法,将不规则的数据分布转换成规则的网格分布,然后绘制三维地形曲面图。即如图所示:数据规则网格化(简称网格化)。网格化实际是一种曲面拟合方法。关于曲面拟合算法有很多,下面我们采用曲面样条方法实现网格化。我们定义曲面样条函数:下面为c+/c代码:3D_MAP.cpp 1 #include 2 #include tools.h 3 #include Grids.h 4 #inc
2、lude 3dmap.h 5 6 using namespace std; 7 8 / 3D_MAP.cpp : 定义控制台应用程序的入口点。 9 10 int xFar=0.0f,yFar=0.0f,zFar=0.0f; 11 int wWidth=1300,wHeight=700; 12 int oldX,oldY; 13 bool gIsStartTrackBall = false; 14 bool gIsMoveMap=false; 15 TrackBall trackball; 16 _3dMap map; 17 18 void displayEvent() 19 20 glClea
3、rColor(0, 0, 0.1f, 1); 21 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 22 23 glMatrixMode(GL_MODELVIEW); 24 glLoadIdentity(); 25 glTranslatef(xFar, yFar,zFar); 26 27 trackball.makeRolate(); 28 map.drawMap(); 29 30 glFlush(); 31 glutSwapBuffers(); / 交换缓存 32 33 34 void mouseMoveEvent(int x, int y
4、) 35 36 if(gIsStartTrackBall) 37 38 trackball.MouseMove(x,y); 39 glutPostRedisplay(); 40 41 if(gIsMoveMap) 42 43 xFar-=oldX-x; 44 yFar+=oldY-y; 45 oldX=x; 46 oldY=y; 47 glutPostRedisplay(); 48 49 50 / 鼠标事件函数 51 void mouseEvent(int button, int state, int x, int y) 52 53 if(button = GLUT_LEFT_BUTTON)
5、54 55 if(state = GLUT_DOWN) 56 57 oldX=x; 58 oldY=y; 59 trackball.setXY(x,y); 60 gIsStartTrackBall = true; 61 62 else if(state = GLUT_UP) 63 64 oldX=x; 65 oldY=y; 66 gIsStartTrackBall = false; 67 68 glutPostRedisplay(); 69 else if(button = GLUT_RIGHT_BUTTON) 70 71 if(state = GLUT_DOWN) 72 73 oldX=x;
6、 74 oldY=y; 75 gIsMoveMap=true; 76 else if(state = GLUT_UP) 77 78 oldX=x; 79 oldY=y; 80 gIsMoveMap = false; 81 82 83 84 / 窗体尺寸变化事件 85 void resizeEvent(int w, int h) 86 87 wWidth=w; 88 wHeight=h; 89 zFar=0.0f; 90 xFar=0.0f; 91 yFar=0.0f; 92 glViewport(0,0, w, h); 93 glMatrixMode(GL_PROJECTION); 94 gl
7、LoadIdentity(); 95 h = h 0 ? h : 1; 96 float aspect = (float)w / (float)h; 97 gluPerspective(45,aspect,1.0,1500.0); 98 glTranslatef(0,0,-300.0f); 99 100 trackball.resize();101 102 103 glutPostRedisplay();104 105 void processSpecialKeys(int key, int x, int y) 106 if(key=101)107 108 zFar+=4;109 glutPo
8、stRedisplay();110 111 if(key=103)112 /113 zFar-=4;114 glutPostRedisplay();115 116 printf(key:%dn,key);117 118 119 void MenuFunc(int data)120 121 switch(data)122 123 case 1:124 map.setLineOrFill();break;125 default:break;126 127 glutPostRedisplay();128 129 void glInit()130 131 glShadeModel(GL_FLAT);/
9、SMOOTH/GL_FLAT132 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);133 glClearDepth(1.0f);134 135 glEnable(GL_NORMALIZE);136 137 glEnable ( GL_DEPTH_TEST );138 glAlphaFunc(GL_GREATER,0);139 glDepthFunc(GL_LEQUAL);140 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);141 142 glEnable( GL_BLEND); 143 glBlendFunc(
10、 GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);144 145 glEnable(GL_POINT_SMOOTH);146 glEnable(GL_LINE_SMOOTH);147 glEnable (GL_POLYGON_SMOOTH);148 149 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); / Make round points, not square points150 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); / Antialias the lines151 glHint (G
11、L_POLYGON_SMOOTH_HINT, GL_NICEST);152 153 154 /glClearColor(1.0,1.0,1.0,1.0); /窗口背景设置为白色155 glMatrixMode(GL_MODELVIEW); /设置投影参数156 157 glEnable( GL_COLOR_MATERIAL) ;158 glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);159 160 161 162 int main(int argc,char* argv)163 164 map.initMap();165 16
12、6 glutInit(&argc,argv); /初始化GLUT167 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH | GLUT_MULTISAMPLE); /设置显示模式168 glutInitWindowPosition(0,0); /设置显示窗口的左上角位置169 glutInitWindowSize(wWidth,wHeight); /设置窗口的长和高170 glutCreateWindow(3DMap ); /创造显示窗口171 172 glInit(); /开始初始化过程173 glutReshapeFunc(resi
13、zeEvent);174 glutDisplayFunc(displayEvent);175 glutMouseFunc(mouseEvent);176 glutSpecialFunc(processSpecialKeys);177 glutMotionFunc(mouseMoveEvent);178 glutCreateMenu(MenuFunc);179 glutAddMenuEntry(填充/网格,1);180 glutAttachMenu(GLUT_MIDDLE_BUTTON);181 182 glutMainLoop(); /显示所有并等候183 184 getchar();185
14、return 0;186 tools.htools.h中定义了TrackBall类,用于对3D模型进行鼠标的旋转,世界中心点的移动等控制 1 #include 2 #include 3 4 using namespace std; 5 6 struct GPoint3d 7 double mX, mY, mZ; 8 double x() return mX; 9 double y() return mY; 10 double z() return mZ; 11 void setX(double x) mX = x; 12 void setY(double y) mY = y; 13 void
15、setZ(double z) mZ = z; 14 void set(double x, double y, double z) mX = x; mY = y; mZ = z; 15 ; 16 17 class TrackBall 18 19 int OldX; 20 int OldY; 21 double mMatrix16; 22 public: 23 TrackBall() 24 / 向量的点积 25 double dotMult(GPoint3d v1, GPoint3d v2); 26 / 向量的叉积 27 GPoint3d crossMult(GPoint3d v1, GPoint
16、3d v2); 28 / 将鼠标二维点映射为球面向量(用于鼠标追踪球) 29 GPoint3d gMousePtToSphereVec(int x, int y, int w, int h); 30 void makeRolate(); 31 32 void MouseMove(int x, int y); 33 void resize() 34 35 glGetDoublev(GL_MODELVIEW_MATRIX, mMatrix); / 返回当前模型矩阵 36 37 void setXY(int x, int y)OldX = x;OldY = y; 38 void setP(doubl
17、e *v)/x1,y1,z1, x2,y2,z2, x3,y3,z3 39 40 GPoint3d v1,v2,v3; 41 v1.setX(v3-v0); 42 v1.setY(v4-v1); 43 v1.setZ(v5-v2); 44 45 v2.setX(v6-v0); 46 v2.setY(v7-v1); 47 v2.setZ(v8-v2); 48 49 v3=crossMult(v1,v2); 50 51 glNormal3f(v3.x(),v3.y(),v3.z(); 52 53 ; 54 55 double TrackBall:dotMult(GPoint3d v1, GPoin
18、t3d v2) 56 57 double angle; 58 angle = v1.x()*v2.x()+v1.y()*v2.y()+v1.z()*v2.z(); 59 return angle; 60 61 GPoint3d TrackBall:crossMult(GPoint3d v1, GPoint3d v2) 62 63 GPoint3d v; 64 v.setX(v1.y()*v2.z()-v1.z()*v2.y(); 65 v.setY(v1.z()*v2.x()-v1.x()*v2.z(); 66 v.setZ(v1.x()*v2.y()-v1.y()*v2.x(); 67 re
19、turn v; 68 69 70 / 将鼠标二维点映射为球面向量(用于鼠标追踪球) 71 GPoint3d TrackBall:gMousePtToSphereVec(int x, int y, int w, int h) 72 73 double x1,y1,z1,r,len; 74 GPoint3d vec; 75 x1 = (2.0*x - w) / w; 76 y1 = (h - 2.0*y) / h; 77 r=x1*x1+y1*y1; 78 if(r 1) r = 1; 79 z1 = sqrt(1 - r); 80 len = sqrt(x1*x1+y1*y1+z1*z1); 8
20、1 vec.setX(x1/len); 82 vec.setY(y1/len); 83 vec.setZ(z1/len); 84 return vec; 85 86 void TrackBall:makeRolate() 87 88 glMultMatrixd(mMatrix); 89 90 void TrackBall:MouseMove(int x, int y) 91 92 if(x != OldX | y != OldY) 93 94 int wWidth,wHeight; 95 wWidth = glutGet(GLUT_WINDOW_WIDTH); 96 wHeight = glu
21、tGet(GLUT_WINDOW_HEIGHT); 97 GPoint3d lastVec = gMousePtToSphereVec(OldX, OldY, wWidth, wHeight); 98 GPoint3d currentVec = gMousePtToSphereVec(x, y, wWidth, wHeight); 99 OldX = x; OldY = y;100 / 求旋转角度101 double rotAngle = acos(dotMult(lastVec,currentVec)*57.;102 / 求旋转向量轴103 GPoint3d axis = crossMult
22、(lastVec,currentVec);104 glMatrixMode(GL_MODELVIEW);105 glPushMatrix();106 glLoadIdentity();107 glRotated(rotAngle, axis.x(), axis.y(), axis.z(); / 旋转108 109 glMultMatrixd(mMatrix);110 glGetDoublev(GL_MODELVIEW_MATRIX, mMatrix); / 返回当前模型矩阵111 112 glPopMatrix();113 114 接下来是3dmap.h,其中定义了_3dMap类,主要用来完成
23、3d模型的主要绘制任务 1 class _3dMap 2 3 double *data; 4 int M,N; 5 int dip; 6 double scale; 7 bool showBaseLine; 8 double max,min; 9 bool LineMode; 10 public : 11 _3dMap() 12 13 M=320; 14 N=220; 15 showBaseLine=true; 16 LineMode=false; 17 scale=20.0; 18 dip=1; 19 max=-1000; 20 min=10000; 21 22 _3dMap() 23 vo
24、id initMap(); 24 void drawBaseLine(); 25 void drawMap(); 26 void _3dMap:setLineOrFill() 27 28 LineMode=!LineMode; 29 30 double getAver(double * arr) 31 32 double num=0; 33 int n=3;/(int)(sizeof(arr)/sizeof(double)/3; 34 for(int i=0;itemp) 46 47 r=(aver-temp)/(temp-min); 48 b=0; 49 else 50 r=0; 51 b=
25、(temp-aver)/(temp-min); 52 53 g=1-(abs(temp-aver)/(temp-min); 54 glColor3f(r,g,b); 55 56 ; 57 58 void _3dMap:initMap() 59 60 61 int temp= 62 229,219,199,216,235,255,266,285,272,241,246,281,284,275,261,273, 63 221,214,195,216,234,258,273,289,281,249,259,278,287,272,275,277, 64 213,203,196,206,221,232
26、,259,293,294,277,258,285,287,283,288,286, 65 204,195,200,201,209,218,231,259,288,306,286,291,301,311,319,298, 66 196,207,201,211,239,234,241,259,294,315,317,321,325,322,325,341, 67 208,218,204,214,235,260,239,268,298,291,331,313,281,280,280,280, 68 216,231,218,196,220,255,271,253,264,303,322,312,276
27、,243,238,239, 69 236,242,218,198,200,215,224,238,261,294,324,312,280,255,220,200, 70 255,241,219,211,206,225,252,275,284,285,305,316,271,237,208,191, 71 245,218,207,198,214,241,261,256,273,276,291,298,281,238,197,175, 72 225,215,205,195,208,221,235,252,262,271,301,275,245,212,181,171 73 ; 74 int len
28、=11*16; 75 int i,j; 76 double* src=new double*3; 77 for(i=0;i3;i+) 78 srci=new doublelen; 79 for(i=0;i11;i+) 80 /y 81 for(j=0;j16;j+) 82 /x 83 src0i*16+j=j*10; 84 src1i*16+j=i*10; 85 src2i*16+j=tempi*16+j; 86 87 88 Grids g1(3,len,src); 89 double* des=new double*2; 90 for(i=0;i2;i+) 91 desi=new doubl
29、eN*M; 92 for(i=0;iN;i+) 93 /y 94 for(j=0;jM;j+) 95 /x 96 des0i*M+j=j/2; 97 des1i*M+j=i/2; 98 99 100 Grids g2(2,N*M,des);101 data=g1.Surface_Fitting(&g1,&g2);102 103 for(i=0;iN;i+)104 /height105 for(int j=0;jM;j+)106 /width107 data0i*M+j*=2;108 data1i*M+j*=2;109 data2i*M+j/=5;110 111 if(maxdata2i*M+j
30、)114 min=data2i*M+j;115 116 117 printf(max=%lf,min=%lfn,max,min);118 119 void _3dMap:drawBaseLine()120 121 glBegin(GL_LINES); 122 glColor3f(1, 0, 0);123 glVertex2i(0,0);/x line124 glVertex2i(100,0);125 126 glColor3f(0, 1, 0);127 glVertex2i(0,0);/y line128 glVertex2i(0,100);129 130 glColor3f(0, 0, 1)
31、;131 glVertex3f(0,0,0);/132 glVertex3f(0,0,500);133 glEnd(); 134 135 void _3dMap:drawMap()136 137 138 if(showBaseLine)139 drawBaseLine();140 141 if(LineMode)142 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);143 else 144 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);145 146 glLineWidth(0.4f);147 for(int i=0;iN
32、-1;i+)148 /height22149 150 for(int j=0;jM-1;j+)151 /width32152 glBegin(GL_TRIANGLE_FAN);153 int t=i*M+j;154 setColor(data2t,data2t+1,data2t+1+M);155 156 glVertex3f(data0t,data1t,data2t);157 glVertex3f(data0t+1,data1t+1,data2t+1);158 glVertex3f(data0t+1+M,data1t+1+M,data2t+1+M);159 setColor(data2t+M,
33、data2t+1,data2t+1+M);160 glVertex3f(data0t+M,data1t+M,data2t+M);161 glEnd();162 163 164 下面是Grids.h文件,定义了Grids类,用于对控制点的数据进行网格化 1 #include 2 3 #include 4 5 using namespace std; 6 7 class Grids 8 9 int row; 10 int col; 11 double *mat; 12 public: 13 Grids(); 14 Grids(int r, int c); 15 Grids(int r, int c
34、, double *m); 16 Grids(); 17 void Mul_Mat(Grids* m1, Grids* m2, Grids* m3); 18 void Inv_Mat(Grids* m1, Grids* m2); 19 double* Surface_Fitting(Grids* m1, Grids* m2); 20 ; 21 22 Grids:Grids() 23 24 row = 0; 25 col = 0; 26 mat = 0; 27 28 29 Grids:Grids(int r, int c) 30 31 row = r; 32 col = c; 33 mat =
35、0; 34 35 36 Grids:Grids(int r, int c, double *m) 37 38 row = r; 39 col = c; 40 mat = m; 41 42 43 Grids:Grids() 44 45 mat=0; 46 row=0; 47 col=0; 48 49 50 void Grids:Mul_Mat(Grids* m1, Grids* m2, Grids* m3) 51 52 int i=0,j=0,p=0; 53 double sum=0; 54 if (m1-col != m2-row) 55 coutrow=m1-row; 59 m3-col=m
36、2-col; 60 m3-mat=new double*m1-row; 61 if (NULL=m3-mat) 62 coutERROR!n; 63 exit(0); 64 65 for (i=0;irow;i+) 66 m3-mati=new doublem3-col; 67 for (j=0;jcol;j+) 68 for (m3-matij=0,p=0;pcol;p+) 69 m3-matij+=m1-matip*m2-matpj; 70 71 72 73 74 75 void Grids:Inv_Mat(Grids* m1, Grids* m2) 76 77 int i,j,n,*is
37、,*js,k; 78 double d,p; 79 if(m1-row!=m1-col) 80 coutmat=new double*m1-row;/申请行指针数组 84 if(NULL=m2-mat) 85 coutERROR! 申请内存出错!n; 86 exit(1); 87 88 for (i=0;irow;i+) 89 m2-mati=new doublem1-col;/申请行 90 for (j=0;jcol;j+) 91 m2-matij=m1-matij; 92 93 n=m1-row; 94 m2-row=m1-row; 95 m2-col=m1-col; 96 is=new
38、intn; 97 js=new intn; 98 if (NULL=is | NULL=js) 99 coutERROR! 申请内存出错!n;100 exit(1);101 102 for (k=0;k=n-1;k+) /全选主元103 d=0.000;104 for (i=k;i=n-1;i+)105 for (j=k;jmatij);107 if (pd)108 d=p;109 isk=i;110 jsk=j;111 112 113 114 if(1.0=d+1.0)115 delete is;116 delete js;117 coutERROR ! 矩阵求逆出错!n;118 exit(1);119 120 if(isk!=k) /*行交换*/121 for (j=0;jmatkj;123 m2-matkj=m2-matiskj;124 m2-matiskj=p;125 126 127 if(jsk != k) /*列交换*/128 for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年职称评定复习题库金融领域
- 进一步规范完善考核制度
- 幼儿园领导小组考核制度
- 2025年浙江纺织服装职业技术学院马克思主义基本原理概论期末考试模拟题及答案解析(夺冠)
- 2025年兖州矿区职工大学马克思主义基本原理概论期末考试模拟题带答案解析(必刷)
- 2025年望都县招教考试备考题库带答案解析(必刷)
- 2024年霍邱县招教考试备考题库含答案解析(夺冠)
- 2024年重庆电力职工大学马克思主义基本原理概论期末考试题含答案解析(夺冠)
- 2025年湖南城市学院马克思主义基本原理概论期末考试模拟题带答案解析
- 2025年平武县幼儿园教师招教考试备考题库附答案解析
- 2025-2026学年北京市朝阳区高三(上期)期末考试英语试卷(含答案)
- 2026年离婚协议(标准版)
- 数学试卷江苏省南京市2025-2026学年12月七校联合学情调研(12.10-12.12)
- 上海医院招人面试题目及答案
- 【英语】【宾语从句】讲解疯狂动物城版本【课件】
- 警用无人机教学课件
- 2025年公务员与事业单位类公文写作与处理模拟试题
- 2025年及未来5年中国商用车车联网行业市场运营现状及投资规划研究建议报告
- 2025年村务监督委员会工作总结范文
- 企业反腐败与商业道德法律规范培训
- 地大水文地质学基础-课件
评论
0/150
提交评论