openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)_第1页
openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)_第2页
openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)_第3页
openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)_第4页
openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)在我的MFC单文档项目中enableview.h和enableview.cpp负责上面的窗口建立,myopenglview.h和myopenglView.cpp主要是功能的实现1.三维网格建立:void GLGrid(float pt1x, float pt1y, float pt1z, float pt2x, float pt2y, float pt2z, int num) const float _xLen = (pt2x - pt1x) / num; const float _yLen = (pt2y -

2、pt1y) / num; const float _zLen = (pt2z - pt1z) / num; glLineWidth(2.f); glLineStipple(1, 0x0303);/线条样式 glBegin(GL_LINES); glEnable(GL_LINE_SMOOTH); int xi = 0; int yi = 0; int zi = 0; /绘制平行于X的直线 for (zi = 0; zi = num; zi+) float z = _zLen * zi + pt1z; for (yi = 0; yi = num; yi+) float y = _yLen * yi

3、 + pt1y; glVertex3f(pt1x, y, z); glVertex3f(pt2x, y, z); /绘制平行于Y的直线 for (zi = 0; zi = num; zi+) float z = _zLen * zi + pt1z; for (xi = 0; xi = num; xi+) float x = _xLen * xi + pt1x; glVertex3f(x, pt1y, z); glVertex3f(x, pt2y, z); /绘制平行于Z的直线 for (yi = 0; yi = num; yi+) float y = _yLen * yi + pt1y; fo

4、r (xi = 0; xi = num; xi+) float x = _xLen * xi + pt1x; glVertex3f(x, y, pt1z); glVertex3f(x, y, pt2z); glEnd();void CmyopenglView:ordination() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_POINT_SMOOTH); /设置反走样 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); /设置反走样 glEn

5、able(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable(GL_POLYGON_SMOOTH); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); glRotatef(-45, 0.0, 1.0, 0.0); /网格 glPushMatrix(); glColor3f(0.9f, 0.9f, 0.9f); glTranslatef(-4, -4, -4); GLGrid(0,0,0,8,0,8,20); glPopMatrix(); glPushMatrix(); glTra

6、nslated(-4,4, -4); glRotatef(90, 1.0, 0.0, 0.0); glColor3f(0.9f, 0.9f, 0.0f); GLGrid(0, 0, 0, 8, 0, 8, 20); glPopMatrix(); glPushMatrix(); glTranslatef(-4, -4, -4); glRotatef(90, 0.0, 0.0, 1.0); glColor3f(0.0f, 0.9f, 0.0f); GLGrid(0, 0, 0, 8, 0, 8, 20); glPopMatrix(); glDisable(GL_BLEND); glDisable(

7、GL_LINE_SMOOTH); glDisable(GL_POINT_SMOOTH); glDisable(GL_POLYGON_SMOOTH);我们在ordination()函数中增加绘制x,y,z坐标的代码void CmyopenglView:ordination() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_POINT_SMOOTH); /设置反走样 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); /设置反走样 glEnable(

8、GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glEnable(GL_POLYGON_SMOOTH); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); glRotatef(-45, 0.0, 1.0, 0.0); /网格 glPushMatrix(); glColor3f(0.9f, 0.9f, 0.9f); glTranslatef(-4, -4, -4); GLGrid(0,0,0,8,0,8,20); glPopMatrix(); glPushMatrix(); glTranslat

9、ed(-4,4, -4); glRotatef(90, 1.0, 0.0, 0.0); glColor3f(0.9f, 0.9f, 0.0f); GLGrid(0, 0, 0, 8, 0, 8, 20); glPopMatrix(); glPushMatrix(); glTranslatef(-4, -4, -4); glRotatef(90, 0.0, 0.0, 1.0); glColor3f(0.0f, 0.9f, 0.0f); GLGrid(0, 0, 0, 8, 0, 8, 20); glPopMatrix(); /x /glTranslatef(-2, -2, -2); glColo

10、r3f(1.0f, 0.0f, 0.0f); glBegin(GL_LINES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(3.5, 0.0f, 0.0f); glEnd(); glPushMatrix(); glTranslatef(3.5, 0.0f, 0.0f); glRotatef(90.0f, 0.0f, 1.0f, 0.0f); glutWireCone(0.027, 0.09, 10, 10); glPopMatrix(); /y glColor3f(0.0f, 1.0f, 0.0f); glBegin(GL_LINES); glVert

11、ex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0, 3.5, 0.0f); glEnd(); glPushMatrix(); glTranslatef(0.0, 3.5, 0.0f); glRotatef(90.0f, -1.0f, 0.0f, 0.0f); glutWireCone(0.027, 0.09, 10, 10); glPopMatrix(); /z glColor3f(0.0f, 0.0f, 1.0f); glBegin(GL_LINES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.0, 0.0f, 3.5

12、); glEnd(); glPushMatrix(); glTranslatef(0.0, 0.0f, 3.5); glRotatef(90.0f, 0.0f, 0.0f, 1.0f); glutWireCone(0.027, 0.09, 10, 10); glPopMatrix(); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); glDisable(GL_POINT_SMOOTH); glDisable(GL_POLYGON_SMOOTH);、2.基本三维图形创建 点模型/线模型/面模型glColor3f(1.0f, 1.0f, 1.0f);

13、 if (model = 1) if (type = 1) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if (type = 2) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (type = 3) glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); auxSolidCube(4); if (model = 2) if (type = 1) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if (type = 2) glPolygon

14、Mode(GL_FRONT_AND_BACK, GL_FILL); if(type = 3) glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); auxSolidSphere(3.0); if (model = 3) glPushMatrix(); glRotatef(90, -1.0, 0.0, 0.0); if (type = 1) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if (type = 2) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (type = 3

15、) glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); glutSolidCone(3, 3, 100, 100); glPopMatrix(); if (model = 4) if (type = 1) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); if (type = 2) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); if (type = 3) glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); glutSolidTeapot(2.5);

16、3.鼠标相应旋转缩放BOOL enableview:OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) / TODO: 在此添加消息处理程序代码和/或调用默认值 double a = zDelta / 120; if (scale + a * 0.1) InvalidateRect(NULL, FALSE); return CView:OnMouseWheel(nFlags, zDelta, pt);void enableview:OnMouseMove(UINT nFlags, CPoint point) / TODO: 在此添加消息处理程序

17、代码和/或调用默认值 if (nFlags & MK_LBUTTON = TRUE) /MessageBox(mouse move function triggered!, attentino, MB_OK); du += point.x - oldmx; /鼠标在窗口x轴方向上的增量加到视点绕y轴的角度上,这样就左右转了 h += 0.03f*(point.y - oldmy); /鼠标在窗口y轴方向上的改变加到视点的y坐标上,就上下转了 if (h15.0f) h = 15.0f; /视点y坐标作一些限制,不会使视点太奇怪 else if (hOnDraw(this-GetDC(); /重

18、绘界面 else if (nFlags & MK_RBUTTON = TRUE) oldmx += point.x - oldmx; oldmy += point.y - oldmy; glTranslatef(oldmx, oldmy, -0.1f); this-OnDraw(this-GetDC(); oldmx = point.x, oldmy = point.y; else oldmx = point.x, oldmy = point.y; /OutputDebugString(_T(mouse upn); /CView:OnMouseMove(nFlags, point);4.键盘相

19、应旋转缩放BOOL CmyopenglView:PreTranslateMessage(MSG* pMsg) if (pMsg-message = WM_KEYDOWN) / If a keydown message if (pMsg-wParam = _T(W) this-rotate_x += 6.0; if (this-rotate_x 360)this-rotate_x = -360; this-InvalidateRect(NULL, FALSE); if (pMsg-wParam = _T(X) this-rotate_x += 6.0; if (this-rotate_x rot

20、ate_x = 360; this-InvalidateRect(NULL, FALSE); if (pMsg-wParam = _T(A) this-rotate_y -= 6.0; if (this-rotate_y rotate_y = 360; this-InvalidateRect(NULL, FALSE); if (pMsg-wParam = _T(D) this-rotate_y += 6.0; if (this-rotate_y 360)this-rotate_y = -360; this-InvalidateRect(NULL, FALSE); if (pMsg-wParam

21、 = _T(Z) this-rotate_z -= 6.0; if (this-rotate_z rotate_z = 360; this-InvalidateRect(NULL, FALSE); if (pMsg-wParam = _T(E) this-rotate_z += 6.0; if (this-rotate_z 360)this-rotate_z = -360; this-InvalidateRect(NULL, FALSE); if (pMsg-wParam = _T(Q) if (scale + 2) InvalidateRect(NULL, FALSE); if (pMsg-

22、wParam = _T(R) scale -= 2; this-InvalidateRect(NULL, FALSE); return CView:PreTranslateMessage(pMsg);5.灯光设置: 单方位灯光/多方位光/多种类型光效果/ 设置材质颜色GLfloat mat_ambient = 0.6f, 0.6f, 0.6f, 1.0f ; / 蓝色的材质环境光GLfloat mat_diffuse = 0.6f, 0.6f, 0.9f, 1.0f ; / 蓝色的材质漫反射光GLfloat mat_specular = 1.0f, 1.0f, 1.0f, 1.0f ; / 全

23、白色的材质镜面反射光GLfloat mat_emission = 0.5f, 0.5f, 0.5f, 1.0f ; / 淡白色的材质辐射光GLfloat no_mat = 0.0f, 0.0f, 0.0f, 1.0f ; / 无光(黑色光),用于关闭某种属性光时应用GLfloat no_shininess = 0.0f ; / 无镜面反射GLfloat low_shininess = 5.0f ; / 低镜面反射指数GLfloat high_shininess = 70.0f ; / 高镜面反射指数void CmyopenglView:InitalLigt() GLfloat light_po

24、sition14 = -52, -16, -50, 0 ; GLfloat light_position24 = -26, -48, -50, 0 ; GLfloat light_position34 = 16, -52, -50, 0 ; GLfloat direction13 = 52, 16, 50 ; GLfloat direction23 = 26, 48, 50 ; GLfloat direction33 = -16, 52, 50 ; GLfloat light_position44 = 52, 16, 50, 0 ; GLfloat light_position54 = 26,

25、 48, 50, 0 ; GLfloat light_position64 = -16, 52, 50, 0 ; GLfloat direction43 = -52, -16, -50 ; GLfloat direction53 = -26, -48, -50 ; GLfloat direction63 = 16, -52, -50 ; GLfloat color14, color24, color34, color44, color54, color64; glClearColor(1, 1, 1, 0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LE

26、SS); if (color_type = 0) /彩色灯光 color10 = 1; color11 = 0; color12 = 0; color13 = 1; color20 = 0.5; color21 = 1; color22 = 0; color23 = 1; color30 = 0; color31 = 0; color32 = 1; color33 = 1; color40 = 1; color41 = 0; color42 = 0; color43 = 1; color50 = 0.5; color51 = 1; color52 = 0; color53 = 1; color

27、60 = 0; color61 = 0; color62 = 1; color63 = 1; GLfloat ambient4 = 0.3f, 0.3f, 0.3f, 1.0f ; GLfloat material_color4 = 1, 1, 1, 0.5f ; GLfloat material_specular4 = 0.5f, 0.5f, 0.5f, 0.5f ; GLfloat material_ambient4 = 0.0, 0.0, 0.0, 0.0 ; glLightfv(GL_LIGHT3, GL_POSITION, light_position4); glLightfv(GL

28、_LIGHT3, GL_SPOT_DIRECTION, direction4); glLightfv(GL_LIGHT3, GL_DIFFUSE, color4); glLightfv(GL_LIGHT3, GL_SPECULAR, color4); glLightfv(GL_LIGHT4, GL_POSITION, light_position5); glLightfv(GL_LIGHT4, GL_SPOT_DIRECTION, direction5); glLightfv(GL_LIGHT4, GL_DIFFUSE, color5); glLightfv(GL_LIGHT4, GL_SPE

29、CULAR, color5); glLightfv(GL_LIGHT5, GL_POSITION, light_position6); glLightfv(GL_LIGHT5, GL_SPOT_DIRECTION, direction6); glLightfv(GL_LIGHT5, GL_DIFFUSE, color6); glLightfv(GL_LIGHT5, GL_SPECULAR, color6); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,

30、material_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_color); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 128); glDisable(GL_LIGHT0); glDisable(GL_LIGHTING); glEnable(GL_LIGHTING); glEnable(GL_LIGHT3); glEnable(GL_LIG

31、HT4); glEnable(GL_LIGHT5); glDisable(GL_COLOR_MATERIAL); return; if (color_type = 1) /白色灯光 glDisable(GL_LIGHT3); glDisable(GL_LIGHT4); glDisable(GL_LIGHT5); glDisable(GL_LIGHTING); GLfloat m_LightPostion4 = 0.0f, 10.0f, 10.0f, 1.0f ; GLfloat ambientLight = 0.25f, 0.25f, 0.25f, 1.0f ; GLfloat diffuse

32、Light = 0.5, 0.5f, 0.5f, 1.0f ; GLfloat specularLight = 0.5f, 0.5f, 0.5f, 1.0f ; glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_SPECULAR, specularLigh

33、t); glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); else glDisable(GL_LIGHT3); glDisable(GL_LIGHT4); glDisable(GL_LIGHT5); glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); glColorMat

34、erial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); /glDisable(GL_LIGHTING); GLfloat no_ambientLight = 0.0f, 0.0f, 0.0f, 1.0f ; / 用于关掉默认的全局环境光 / 设置光源的颜色 GLfloat ambientLight = 0.8f, 0.8f, 0.8f, 1.0f ; / 白色环境光 GLfloat diffuseLight = 0.8f, 0.8f, 0.8f, 1.0f ; / 白色漫射光 GLfloat specularLight = 0.8f, 0.8f, 0

35、.8f, 1.0f ; / 白色镜面反射光 GLfloat m_LightPostion = 0.0f, 0.0f, 1.0f, 0.0f ; / 光源起始位置 / 1.仅漫射光 if (color_type = 12) glEnable(GL_LIGHTING); /glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); / 关掉默认的全局环境光 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientL

36、ight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); / 关闭材质的环境反射光颜色 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); / 设置mat_diffuse的材质漫反射光 glMaterialfv(

37、GL_FRONT, GL_SPECULAR, no_mat); / 关闭材质的镜面反射光颜色 glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess); / 设置材质的镜面反射指数为0 glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); / 关闭材质的辐射光 glEnable(GL_LIGHT0); / 2.仅镜面光 if (color_type = 13) glEnable(GL_LIGHTING); /glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight

38、); / 关掉默认的全局环境光 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion); glMaterialfv(GL_FRONT, GL_AMBIENT

39、, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, no_mat); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); glEnable(GL_LIGHT0); / 3.漫射光与低镜面光 if (color_type = 16) glEnable(GL_LIGHTING); glLightModelfv(GL_

40、LIGHT_MODEL_AMBIENT, no_ambientLight); / 关掉默认的全局环境光 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); glLightfv(GL_LIGHT0, GL_POSITION, m_LightPostion

41、); glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); glEnable(GL_LIGHT0); / 4.辐射光与低镜面光 if (color_type = 18) glEnable(GL_LIGHTING); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, no_ambientLight); / 关掉默认的全局环境光 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论