C++ 如何在OpenGL中拾取圆内的点?

C++ 如何在OpenGL中拾取圆内的点?,c++,opengl,opengl-es-2.0,cgal,C++,Opengl,Opengl Es 2.0,Cgal,对于点云,我尝试在圆内拾取点(表示鼠标的位置),就像 目前,我通过以下方式完成这项工作: 从圆心投射光线 计算距离射线最近的点 计算最近点与该点云中其他点之间的距离,然后选择距离

对于点云,我尝试在圆内拾取点(表示鼠标的位置),就像

目前,我通过以下方式完成这项工作:

  • 从圆心投射光线
  • 计算距离射线最近的点
  • 计算最近点与该点云中其他点之间的距离,然后选择距离 但是我发现这个方法有些问题

  • 有时离射线最近的点不是我想要的,因为点云有两个面,正面和背面。就像下图一样,我期望的是蓝色的,但是离射线最近的点可能是红色的
  • 这个方法太慢了。

  • 有更好的方法吗?

    另一种方法是检查点是否在圆锥体内。圆锥体的尖端是相机的位置,需要根据到物体表面的距离计算角度。要想选择更近的点,必须计算到眼睛的距离。可以将找到的点投影到拾取光线上。(这通常是点积。)还应检查找到的点是否不在近剪裁平面的前面。否则,你的背部可能会受伤。顺便说一句,节省一些周期的一个机会是比较距离的平方。求向量长度(或两点之间的距离)通常需要的平方根可能是一个昂贵的运算。但它对比较两个长度(或距离)没有帮助。这种方法太慢了。使用这种算法处理点云的所有点可能会产生重大影响。你可以用你的算法做的不多。为了获得性能,您必须重新组织您的点云,应用某种可以在中使用的分区。