Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在OpenGL中检测鼠标在某个对象上的位置?_C++_C_Opengl_Graphics - Fatal编程技术网

C++ 如何在OpenGL中检测鼠标在某个对象上的位置?

C++ 如何在OpenGL中检测鼠标在某个对象上的位置?,c++,c,opengl,graphics,C++,C,Opengl,Graphics,我正在制作简单的3D游戏。在3D场景中检测鼠标悬停对象的最佳方法是什么?实际上,我会避免使用这些拾取方法,而只是从数学上进行。创建一条直线,从鼠标光标位置一直延伸到场景中,并与场景中每个对象的边界球体相交。对于它相交的每个边界球体,只需检查哪个顶点最靠近眼睛位置 可以使用此算法创建z分别设置为0和1的直线 math::Vec3f windowToObjectf(const math::Vec3f& windowCoord) { math::Matrix4f modelViewMatr

我正在制作简单的3D游戏。在3D场景中检测鼠标悬停对象的最佳方法是什么?

实际上,我会避免使用这些拾取方法,而只是从数学上进行。创建一条直线,从鼠标光标位置一直延伸到场景中,并与场景中每个对象的边界球体相交。对于它相交的每个边界球体,只需检查哪个顶点最靠近眼睛位置

可以使用此算法创建z分别设置为0和1的直线

math::Vec3f windowToObjectf(const math::Vec3f& windowCoord) {
  math::Matrix4f modelViewMatrix;
  math::Matrix4f projectionMatrix;
  std::array <GLint, 4> viewport;
  glGetFloatv( GL_MODELVIEW_MATRIX, modelViewMatrix.data() );
  glGetFloatv( GL_PROJECTION_MATRIX, projectionMatrix.data() );
  glGetIntegerv( GL_VIEWPORT, &viewport.front() );
  math::Vec3f ret(0, 0, 0);
  auto succes = gluUnProject( windowCoord.x , windowCoord.y, windowCoord.z, modelViewMatrix.data(), projectionMatrix.data(), &viewport.front(), &ret.x, &ret.y, &ret.z );
  RASSERT(succes == GL_TRUE);
  GL_RASSERT();
  return ret;
}
math::Vec3f windowToObjectf(常量math::Vec3f&windowCoord){
math::Matrix4f modelViewMatrix;
Mathx4f投影矩阵;
std::数组视口;
glGetFloatv(GL_MODELVIEW_MATRIX,modelViewMatrix.data());
glGetFloatv(GL_PROJECTION_矩阵,projectionMatrix.data());
glGetIntegerv(GL_VIEWPORT和VIEWPORT.front());
数学:Vec3f-ret(0,0,0);
自动成功=gluUnProject(windowCoord.x、windowCoord.y、windowCoord.z、modelViewMatrix.data()、projectionMatrix.data()、&viewport.front()、&ret.x、&ret.y、&ret.z);
RASSERT(成功==GL_真);
GL_rasert();
返回ret;
}

阅读有关openGL选择缓冲区的内容。它可能与用颜色编码实体ID之类的东西相比有什么好处?@BartekBanachewicz:你的意思是,除了明显的不必重新渲染整个场景之外?而不是引导GPU->CPU读回?我们最多读取4个字节,这真的很重要吗?不过我得测量一下。这是主观的,伊姆霍。我不是说这个代码/方法是错误的!我在这个周末为我的项目写了类似的文章。:)我只是认为颜色编码更容易理解,通过一些优化(比如只渲染一个像素)可以非常轻松地获得惊人的结果。这里给出的代码只是“更容易”,因为它忽略了生成的光线与场景实际相交的重要部分。渲染单个像素并将其读回的代码并不复杂或“难以处理”。这两种技术都有优缺点,但“代码复杂性”几乎不值得关注。