opengl鼠标点击选取模型
- map使用,定义然后插入
//使用model类生成model对象Model ourModel("D:/openGLResource/bin/nanosuit/nanosuit.obj");//定义map和插入两个模型map<string, pair<glm::vec3, Model>> _models;//下面是两种插入方式,第二种更为简单_models.insert(pair<string, pair<glm::vec3, Model>>("Zhang3", pair<glm::vec3, Model>(cubePositions[0], ourModel)));_models["Li4"] = pair<glm::vec3, Model>(cubePositions[2], ourModel);//生成map遍历迭代器map<string, pair<glm::vec3, Model>>::iterator _modelsIter;
- 注意Model类需要做一个声明函数不然第二个函数无法生成
/* 函数 */Model(){}
- 生成图像
//ourModel.Draw(cubeShader);for(_modelsIter=_models.begin();_modelsIter!=_models.end();_modelsIter++){model=glm::translate(trans,_modelsIter->second.first);glUniformMatrix4fv(glGetUniformLocation(cubeShader.ID,"model"),1,GL_FALSE,glm::value_ptr(model));_modelsIter->second.second.Draw(cubeShader);}
- 定义选择的全局变量以及点击选择,做了一个半径为7.5的包围球,注意模型中心并不是模型中间,所以要往上提一点
//选择点击的物体
string modelSelected = "NULL";
glfwPollEvents(); //立即处理已经到位的事件,如果没有这个就会一直渲染而不触发事件 if (pickingModelWorldPosition == true){glReadPixels((int)winX, 600 - (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ); //要取Z就要用到float x = (2.0f * winX) / 800.0f - 1.0f;//求到的Xfloat y = 1.0f - (2.0f * winY) / 600.0f;//求到的Yfloat z = winZ * 2.0 - 1.0f; //z的标准化pickingModelWorldPosition = false;if (winZ < 1.0f){//float w = (2.0 * near * far) / (far + near - z * (far - near));float w = near * far / (near * winZ - far * winZ + far);glm::vec4 wolrdPostion = glm::inverse(view) * glm::inverse(projection) * w * glm::vec4(x, y, z, 1);//cout << " x:" << wolrdPostion.r << " y:" << wolrdPostion.g << " z:" << wolrdPostion.b << " w:" << w << endl;//cout<<" x:"<<wolrdPostion.r<<" y:"<<wolrdPostion.g<<" z:"<<wolrdPostion.b<<" w:"<<w<<endl;for (_modelsIter = _models.begin(); _modelsIter != _models.end(); _modelsIter++){//distance函数用来计算,鼠标的世界坐标和模型的距离float _distance = glm::distance(_modelsIter->second.first + glm::vec3(0, 7.5, 0), glm::vec3(wolrdPostion));if (_distance < 7.5)cout << _modelsIter->first << "模型被选中..." << endl;modelSelected = _modelsIter->first;}}else {modelSelected = "NULL";cout << "没有点中模型...." << endl;}}
结果
opengl鼠标点击选取模型相关推荐
- Extjs之DateField控件的鼠标点击选取事件监控
Ext用的比较多的同志会发现一个问题,Extjs的DateField并没有提供'select'事件.而在我们的实际开发过程中,经常会需要去监控它,并进行后续的处理.在逼不得已的情况下,我们会用'cha ...
- OpenGL 鼠标拾取模型
1.简介 在我们的场景中,使用鼠标光标点击或"挑选"一个3d对象是很有用的.一种方法是从鼠标投射3d光线,通过相机,进入场景,然后检查光线是否与任何物体相交.这通常被称为光线投射. ...
- Unity通过鼠标点击生成网格模型
Unity通过鼠标点击生成网格模型 由于项目需要,制作了一个通过鼠标点击平面,根据点击的点首先生成一个面,再根据这个面生成一个背面,最后根据两个面来构成一个模型. 点击模型平面,划定外围轮廓 通过点击 ...
- Unity Shader 01 鼠标点击模型着色
更新1.0 我发现原来的解决方法好蠢...于是就来更新一下解决思路以及代码 思路: 不变 不变 在片元着色器中更改符合条件的片元颜色 实现效果: shader源码 fixed4 frag(v2f i) ...
- cesium常见操作:鼠标点击获取对象
目录 一.viewer.scene.pick(获取Cartesian2) 二. viewer.scene.pickPosition(获取Cartesian3) 三.viewer.scene.drill ...
- opengl载入多个3ds模型失败记
VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...
- Unity3d鼠标点击屏幕来控制人物的走动
今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能,通过鼠标点击屏幕来控制人物的走动.首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维坐标,然后我们从摄像机位 ...
- unity3d]鼠标点击地面人物自动走动(也包含按键wasdspace控制)
目录(?)[-] 一效果图 二大概步骤 创建一个plane设置层为Terrain因为后面要判断是否点击的是这个层 准备好人物模型并且将三个脚本拖放到人物上并且将动画文件也拖放好记得看前面提醒哦 Thi ...
- 学习swing鼠标点击事件心得体会_西门子COMOS软件开发定制学习8-查询列表间的数据交互...
本篇在西门子COMOS软件开发定制学习6-管理界面定制基础上定制,简单介绍两个查询列表之间的数据交互. 实现效果: 在左侧列表中选择某一设备,右侧列表自动根据所选设备,显示该设备相关的设计图纸(如P ...
最新文章
- Nucleus SE RTOS初始化和启动
- 女装、退学、离职谷歌,他活成了别人不敢想的样子
- 强大的SPGridView
- Oracle-表分析和索引分析解读
- Spring Cloud Config git版
- 【转载】DRuid 大数据分析之查询
- java集合转字符串,Java集合将字符串转换为字符列表
- python绘制时间轴_MatPlotLib动态时间轴
- 基于java mail实现简单的QQ邮箱发送邮件
- 老电脑慢得像蜗牛还有救吗?
- 类与对象- 课后作业1
- 操作键盘事件源码解析(常用的鼠标事件、 键盘事件对象之keyCode属性)
- ionic3 创建和启动
- 找不到所需的 Adobe Flash Player 调试器版本
- LR11安装报错:此计算机上缺少vc2005_sp1_with_atl_fix_redist,请安装所有缺少的必要组件,然后重新运行此安装。
- matlab中的方波信号图片_哈工大、哈工程MATLAB被禁用,这个国产软件号称可替代!...
- java手机连点脚本_自动点击连点器下载
- 论文笔记(显微图像拼接)——A fast algorithm for material image sequential stitching
- 在2016年,Linux是否还需要Windows的支持呢
- 宫崎骏魔幻动画电影《哈尔的移动城堡》高清720P,国粤日三语