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;//求到的X
            float y = 1.0f - (2.0f * winY) / 600.0f;//求到的Y
            float 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;
            }
                
        }

结果

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值