详细记录下最近被老师和师兄掐着脖子撵着做的OPENGL显示和鼠标键盘交互,突然意识到软件著作权不会查重,并且最终的是MFC+OPENGL的模式,和单独opengl代码是不同的~那我就放心开源了~

(1)最终效果包含8w个点以及8w点依据读取顺序拟合成QUADS,这里解释下拟合,OPENGL是不自带拟合函数的,但是可以通过用顶点数组、序列数组来将四个四个点,以QUAD图元形式画出,这就算是拟合了~

(2)包含鼠标点击拖动,缩放(缩放好像去掉了)

(3)光照设置、材质设置、可以参考哦

(4)最特殊的是三维字体的显示,区别于点云的顶点数组显示模式,是显示列表的模式,可以跟随鼠标拖动而拖动

(5)批注:

深度测试解决遮挡问题

物体颜色由材质确定,由光照"显示",其他材质参数推荐百度,有一个百度知道写的很明确

(6)给大家解释下opengl+mfc最不容易出错的结合模式是  1.用setTimer刷新opengl  2 用子窗口显示opengl,并将子窗口嵌套在父窗口中。实现边输参数边显示的目的,具体界面和操作自己摸索吧,懒得写了~

#include<iostream>
#include <GL/freeglut.h>#include <math.h>
#include <vector>
#include<fstream>#include <windows.h>
#include <tchar.h>#define MAX_CHAR       256//遮挡问题是yz调换的结果 ,记得大改using namespace std;GLfloat roate = 0.0;// set rote of roate ying yu bu hao  bu zhuang le 设置旋转速率
GLfloat rote = 0.0;//shezhi旋转角度
GLfloat anglex = 0.0;//X 轴旋转
GLfloat angley = 0.0;//Y 轴旋转
GLfloat anglez = 0.0;//Z 轴旋转
GLint WinW = 800;
GLint WinH = 800;
GLfloat oldx;//当左键按下时记录鼠标坐标
GLfloat oldy;GLfloat rx, ry, rz;
vector<float> color_L;
float color_L_single;
vector<vector<GLfloat>>vec_all;void mouse(int button, int state, int x, int y)
{if (button == GLUT_LEFT_BUTTON){if (state == GLUT_DOWN){roate = 0;rote = 0;oldx = x;//当左键按下时记录鼠标坐标  oldy = y;}}}
void motion(int x, int y)
{GLint deltax = oldx - x;GLint deltay = oldy - y;anglex += 360 * (GLfloat)deltax / (GLfloat)WinW;//根据屏幕上鼠标滑动的距离来设置旋转的角度  angley += 360 * (GLfloat)deltay / (GLfloat)WinH;anglez += 360 * (GLfloat)deltay / (GLfloat)WinH;oldx = x;//记录此时的鼠标坐标,更新鼠标坐标  oldy = y;//若是没有这两句语句,滑动是旋转会变得不可控  glutPostRedisplay();glutPostRedisplay();
}//备注! y是朝天上的那个坐标轴static GLuint lists;
void create_text()
{//批注!只creat一次lists就行! 让calllist多次运行即可!lists = glGenLists(MAX_CHAR);   //编号分别是lists, lists + 1, lists + 2, lists + MAX_CHAR -1// 把每个字符的绘制命令都装到对应的显示列表中wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);  //从基数lists开始依次显示各个字符
}
void drawString_2d(const char* str)
{//这个放到display里面// 调用每个字符对应的显示列表,绘制每个字符for (; *str != '\0'; ++str)glCallList(lists + *str);}static GLfloat vertex_list[78961][3];
static GLint index_list[78400][4];
static GLfloat normal_list[78400][3];
static int j = 0;
void read_txt_all()
{ifstream temp_x;   ifstream temp_y; ifstream temp_z; ifstream temp_color;temp_x.open("C:\\xp(1).txt");temp_y.open("C:\\yp(1).txt");temp_z.open("C:\\zp(1).txt");temp_color.open("C:\\L.txt");for (int i = 0; i<78961; i++){float temp_xx;float temp_yy ;float temp_zz ;vector<GLfloat> xyz_vec(3);temp_x >> temp_xx; temp_y >> temp_yy;temp_z >> temp_zz;if (temp_xx != 0){xyz_vec[0] = temp_xx; vertex_list[i][0] = temp_xx;};if (temp_yy != 0){xyz_vec[1] = temp_yy; vertex_list[i][1] = temp_yy;};if (temp_zz != 0){ xyz_vec[2] = temp_zz; vertex_list[i][2] = temp_zz;};temp_color >> color_L_single;color_L.push_back(color_L_single);vec_all.push_back(xyz_vec);}for (int i = 0; i < vec_all.size(); i++){if ((i - 280) % 281 != 0 && i != 280 && i < 78680){index_list[j][0] = i;index_list[j][1] = i + 1;index_list[j][2] = i + 1 + 281;index_list[j][3] = i + 281;j++;}//傻逼!这里i有控制和跳跃~/*if ((i - 280) % 281 == 0 || i == 280){index_list[i][0] = i;index_list[i][1] = i - 1;index_list[i][2] = i - 1 + 281;index_list[i][3] = i + 281;j++;}if (i>=78680&&i<78960){index_list[i][0] = i;index_list[i][1] = i + 1;index_list[i][2] = i + 1 - 281;index_list[i][3] = i - 281;j++;}if(i==78960){index_list[i][0] = i;index_list[i][1] = i -1;index_list[i][2] = i - 1 - 281;index_list[i][3] = i - 281;j++;}}*/}cout << "jjjjjjjj" << j << endl;for (int i = 0; i < vec_all.size(); i++){if ((i - 280) % 281 != 0 && i != 280 && i < 78678){float x1 = vec_all.at(i + 1 + 281).at(0) - vec_all.at(i).at(0);float y1 = vec_all.at(i + 1 + 281).at(1) - vec_all.at(i).at(1);float z1 = vec_all.at(i + 1 + 281).at(2) - vec_all.at(i).at(2);float x2 = vec_all.at(i + 281).at(0) - vec_all.at(i + 1).at(0);float y2 = vec_all.at(i + 281).at(1) - vec_all.at(i + 1).at(1);float z2 = vec_all.at(i + 281).at(2) - vec_all.at(i + 1).at(2);normal_list[i][0] = y1*z2 - z1*y2;normal_list[i][1] = z1*x2 - x1*z2;normal_list[i][2] = x1*y2 - y1*x2;}}}void display_all(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(50, 50, 0, 0, 0, 0, 1, 0, 0);//void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);//gluLookAt是视点转换。第一组eyex, eyey,eyez 相机在世界坐标的位置  第二组centerx, centery, centerz 相机镜头对准的物体在世界坐标的位置      第三组upx, upy, upz 相机向上的方向在世界坐标中的方向       你把相机想象成为你自己的脑袋://第一组数据就是脑袋的位置        第二组数据就是眼睛看的物体的位置        第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)glPushMatrix();glRotatef(rote, 0.0f, 1.0f, 0.0f);//glRotatef(anglex, 1.0, 0.0, 0.0);glRotatef(angley, 0.0, 1.0, 0.0);glRotatef(anglez, 0.0, 0.0, 1.0);//glTranslatef(-rx, -ry , -rz);//这个位移可以改变旋转中心,也就是说把整体移动了,opengl旋转中心只能是0 0 0 /*****************************显示曲面模型*********************************/GLfloat mat_ambient[] = { 0.250000, 0.148000, 0.064750, 1.000000 };GLfloat mat_diffuse[] = { 0.400000, 0.236800, 0.103600, 1.000000 };GLfloat mat_specular[] = { 0.774597, 0.458561, 0.200621, 1.000000 };GLfloat mat_shininess = 76.800003;glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_NORMAL_ARRAY);glNormalPointer(GL_FLOAT, 0,normal_list);glEnable(GL_NORMALIZE);glVertexPointer(3, GL_FLOAT, 0, vertex_list);glDrawElements(GL_QUADS,j*4, GL_UNSIGNED_INT, index_list);//画曲面//批注,在这里,点并没有封口,说明还是序列的问题//glDrawArrays(GL_POINTS, 0, 78961);//画刀触电/*for (int j= 0; j <70000; j++){glBegin(GL_QUADS);glNormal3f(normal_list[j][0], normal_list[j][1], normal_list[j][2]);glVertex3f(vec_all.at(index_list[j][0]).at(0), vec_all.at(index_list[j][0]).at(1),vec_all.at(index_list[j][0]).at(2));glVertex3f(vec_all.at(index_list[j][1]).at(0), vec_all.at(index_list[j][1]).at(1), vec_all.at(index_list[j][1]).at(2));glVertex3f(vec_all.at(index_list[j][2]).at(0), vec_all.at(index_list[j][2]).at(1), vec_all.at(index_list[j][2]).at(2));glVertex3f(vec_all.at(index_list[j][3]).at(0), vec_all.at(index_list[j][3]).at(1), vec_all.at(index_list[j][3]).at(2));glEnd();}/*****************************显示坐标轴*********************************//*//x轴红色:glLineWidth(1.0f);glBegin(GL_LINE_STRIP);glColor3ub(178, 34, 34);glVertex3f(0, 0, 0);for (int i = 0; i < 300; i++){glVertex3f(0 + i, 0, 0);}glEnd();//y轴绿色:glLineWidth(1.0f);glBegin(GL_LINE_STRIP);glColor3ub(0, 255, 0);for (int i = 0; i < 300; i++){glVertex3f(0, 0 + i, 0);}glEnd();//z轴蓝色:glLineWidth(1.0f);glBegin(GL_LINE_STRIP);glColor3ub(0, 191, 255);for (int i = 0; i < 300; i++){glVertex3f(0, 0, 0 + i);}glEnd();/*****************************显示文字********************************drawString_2d("");glColor3f(1.0f, 0.0f, 0.0f);glRasterPos3f(0, 0, 150);drawString_2d("Z_COOR");glRasterPos3f(0, 150, 0);drawString_2d("Y_COOR");glRasterPos3f(150, 0, 0);drawString_2d("X_COOR");glPopMatrix();//push和pop之间是旋转平移矩阵的作用域。如果保持不动,就把画图函数放出去就行rote += roate;glutSwapBuffers();}void reshape_all(int w, int h){glViewport(0, 0, (GLsizei)w, (GLsizei)h);//改变显示区域,起始位置为客户端窗口左下角(非坐标原点)glMatrixMode(GL_PROJECTION);//修改投影矩阵glLoadIdentity();;//导入单位阵glOrtho(-100, 150, -130 * (GLfloat)h / (GLfloat)w, 120 * (GLfloat)h / (GLfloat)w, -300, 350);//glOrtho(left, right, bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他glMatrixMode(GL_MODELVIEW);glLoadIdentity();}vector<vector<GLfloat>>vec_2d;void init_guang()
{//GL_SPECULAR 表示光线照    射到该材质上,经过镜面反射后形成的光线强度(颜色)。通常, GL_AMBIENT 和      GL_DIFFUSE 都 取 相 同 的 值 , 可 以 达 到 比 较 真 实 的 效 果 。 使 用//   GL_AMBIENT_AND_DIFFUSE 可以同时设置 GL_AMBIENT 和 GL_DIFFUSE 属性// GL_SHININESS 属性。该属性只有一个值,称为“镜面指数”,取值范围是 0 到 128。//该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。//    该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点//灯光设置//GL_AMBIENT、 GL_DIFFUSE、 GL_SPECULAR 属性,每个属性由四个值表示,分别代表了颜色的 R, G, B, A 值GLfloat light_position[] = { 100,100,100, 0 };//光源位置,最后一个0是指定为平行光,而非位置光GLfloat light_diffuse[] = { 1.0,1.0,1.0, 1.0 };GLfloat light_ambient[] = { 0.6f, 0.0f, 0.0f, 1.0f };GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);//漫反射光glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);glEnable(GL_LIGHTING);   //开关:使用光glEnable(GL_LIGHT0);     //打开0#灯glEnable(GL_DEPTH_TEST); //打开深度测试}void init_all()
{glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);  // Antialias the linesglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);}
int main(int argc, char *argv[])
{//read_txt_all_qfz();read_txt_all();glutInit(&argc, argv);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowSize(800, 800);glutCreateWindow("test");init_guang();create_text();glutDisplayFunc(&display_all);glutReshapeFunc(reshape_all);glutMouseFunc(mouse);glutMotionFunc(motion);glutIdleFunc(&display_all);glutMainLoop();return 0;}

freeglut_光照设置_材质设置_笔记与心得相关推荐

  1. 【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )

    文章目录 一.模型准备 二.光照设置 1.启用光照设置 2.启用光源 3.设置光照参数 4.设置环境光 5.设置反射材质 三.光照法线设置 1.设置光源位置 2.设置法线 3.代码示例及运行效果 四. ...

  2. azkaban mysql参数_学习azkaban的笔记以及心得

    Azkaban是Linkedin开源的任务调度软件.致力于解决Hadoop job 问题. 主要解决ETL中有顺序的任务. 一.基本概念: 其中主要有三个组件组成: Relational Databa ...

  3. 设置电脑眼睛保护色_百度经验

    设置电脑眼睛保护色_百度经验 绿豆沙色能有效的减轻长时间用电脑的用眼疲劳! 色调:85,饱和度:123,亮度:205: RGB颜色红:199,绿:237,蓝:204: 十六进制颜色:#C7EDCC或用 ...

  4. python基础-PyCharm设置作者信息模板_修改解释器_设置软件UTF-8编码

    python基础-PyCharm设置作者信息模板_修改解释器_设置软件UTF-8编码 一.PyCharm 设置作者信息模板 1.File---Settings---在搜索框中搜索:File and C ...

  5. IP是如何代理的_怎么设置IP代理

    IP是如何代理的_怎么设置代理IP 方法: 打开菜单栏"工具" 下拉菜单"Internet选项" 选项"连接" 在"局域网设置&q ...

  6. JIRA-使用教程_项目设置

    博客概要 简单分享如何在JIRA中进行项目设置~ 文章目录 博客概要 <JIRA-使用教程>_总目录 项目设置 1.汇总 2.详情 3.重新索引项目 4.删除项目 5.问题类型 6.工作流 ...

  7. Linux挂载磁盘和磁盘分区及设置开机自动挂载_亲测成功

    Linux挂载磁盘和磁盘分区及设置开机自动挂载_亲测成功 Linux下磁盘分区命令主要由两个: fdisk :最大支持不超过2T,MBR分区: parted :支持GPT,适用于大容量分区: 如果挂载 ...

  8. 设置linearlayout最大高度_标识不得超过招牌总长2/3,这个城市出台招牌设置标准...

    上面是广告知识网视频号,每天分享1条实用广告心法,获取行业新知更轻松.更便捷,赶紧关注起来吧(进去之后点头像,再点击关注按钮). 近年来,户外广告和店铺招牌每每成为城市运营管理当中引人关注的焦点,从统 ...

  9. wear手表软件合集_如何设置,调整和使用Android Wear手表

    wear手表软件合集 Android Wear is a rather useful addition to your arsenal of technology, but getting to kn ...

最新文章

  1. 传感器实训心得体会_传感器实训心得
  2. sdwan能取代mpls吗?—Vecloud
  3. Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
  4. mac json格式化工具_简洁好用的工具都是相似的
  5. mysql 性能统计_MySql 的统计查询性能问题
  6. 去掉知乎/CSDN网页标题未读消息提示
  7. selenium问题记录
  8. MongoDB 3.2 On CentOS
  9. edittext 点击区域外隐藏输入法
  10. 电子工程专业用得最多的17种软件,你哪个用得好?
  11. 场景编辑器开发第五天,设计架构重回flash,很多问题不是出在技术上而是策划上
  12. php经纬度测距,PHP根据经纬度坐标计算距离
  13. 新会计准则 计算机管理系统,用友ERP供应链管理系统实验教程(新会计准则版)pdf...
  14. matlab中算术平方根,改进的平方根法matlab
  15. 普渡大学计算机工程专业提前毕业,Purdue的ECE「普渡大学西拉法叶分校电气与计算机工程学院」...
  16. 既是计算机高手,也是情书高手,原来王小波才是最会撩妹的程序员
  17. H3C交换机DHCP排查
  18. 相似度系列-5:语义方法:BERTSCORE: EVALUATING TEXT GENERATION WITH BERT
  19. windows不安装虚拟机如何使用Linux系统作为开发工具?
  20. 【工具使用】视频制作

热门文章

  1. netstat命令参数及用法详解
  2. 东方通中间件弱密码漏洞检测方法
  3. 关于word宏的使用
  4. 谷歌浏览器自动翻译问题
  5. 【大数据开发运维解决方案】超级详细的VMware16安装Redhat8挂载镜像配置本地yum源安装unixODBC教程
  6. 抽象工厂模式-Abstract Factory Pattern
  7. IIS管理器和文件流
  8. 安装visio后,EXCEL打开后滚动鼠标滑轮自动退出解决方法
  9. ExtJs6 路由有参无参使用方式
  10. JAVA毕业生就业信息管理系统计算机毕业设计Mybatis+系统+数据库+调试部署