Graphics 将线段投影到多边形网格上

Graphics 将线段投影到多边形网格上,graphics,3d,geometry,computational-geometry,projection,Graphics,3d,Geometry,Computational Geometry,Projection,我正在开发一个3d应用程序,目前正在寻找一种将屏幕空间中两点定义的线段投影到三维多边形网格(在我的例子中是三角形网格)上的方法。目标是在线段的世界空间中找到与网格边的交点 我只能想到两种方法,但都不理想。第一种方法是以较小的间隔对线段(在屏幕空间中)进行采样,并以这些间隔对光线进行跟踪,以找到光线照射网格的世界空间坐标,但这并不容易给出线段与网格边的交点 我能想到的另一种方法是以某种方式将网格反向投影到屏幕空间,在那里找到交点(在2d中),然后将这些交点投影回3d。问题在于,屏幕空间坐标系可能会

我正在开发一个3d应用程序,目前正在寻找一种将屏幕空间中两点定义的线段投影到三维多边形网格(在我的例子中是三角形网格)上的方法。目标是在线段的世界空间中找到与网格边的交点

我只能想到两种方法,但都不理想。第一种方法是以较小的间隔对线段(在屏幕空间中)进行采样,并以这些间隔对光线进行跟踪,以找到光线照射网格的世界空间坐标,但这并不容易给出线段与网格边的交点

我能想到的另一种方法是以某种方式将网格反向投影到屏幕空间,在那里找到交点(在2d中),然后将这些交点投影回3d。问题在于,屏幕空间坐标系可能会在选择线段的第一个端点和第二个端点之间发生变化(由于移动相机)

如果有任何一个问题让人困惑,那么这里有一张图片大致显示了我正在尝试做的事情(白点表示我想要找到的点)。然而,在我的例子中,黄色曲线只是一条线段

[Yunjin Lee,et al.《具有最小规则和部分显著性的网格剪切》,2005年]

非常感谢您的帮助。

以下是我的建议:

  • 将屏幕线投影到世界空间(在世界空间中获得一个平面)

  • 将平面与网格中的三角形相交,获得一组边

  • 将边添加到仅保留最靠近摄影机平面的边部分的数据结构中(请参见下图,其中红色线段及其端点是我们要保留的)。这类似于通过Z缓冲区构建图像,只是因为我们知道该集合是分段线性的,所以不必对其进行光栅化,我们只需维护端点的排序列表

  • 以下是我的建议:

  • 将屏幕线投影到世界空间(在世界空间中获得一个平面)

  • 将平面与网格中的三角形相交,获得一组边

  • 将边添加到仅保留最靠近摄影机平面的边部分的数据结构中(请参见下图,其中红色线段及其端点是我们要保留的)。这类似于通过Z缓冲区构建图像,只是因为我们知道该集合是分段线性的,所以不必对其进行光栅化,我们只需维护端点的排序列表


  • 你能将屏幕线投影到世界空间的一个平面上,然后与网格相交吗?@GarethRees是的,这应该是可能的,但我想避免与网格“另一侧”的边相交。使用类似Z缓冲区的方法只保留最前面的交点。嗯,你能详细说明一下吗?我是否需要在每个像素处存储网格的两个交点,然后丢弃最后面的交点,然后丢弃不在边上的最前面的交点?无需光栅化它。最前面的一组交点是分段线性的,因此您可以将其表示为点的排序序列(事实上,您正试图计算的点)以及每个点的Z值。您能否将屏幕线投影到世界空间中的一个平面,然后与网格相交?@GarethRees是的,这应该是可能的,但我想避免与网格“另一边”的边相交。使用类似Z缓冲区的方法只保留最前面的交点。嗯,你能详细说明一下吗?我是否需要在每个像素处存储网格的两个交点,然后丢弃最后面的交点,然后丢弃不在边上的最前面的交点?无需光栅化它。最前面的交点集是分段线性的,因此您可以将其表示为点(实际上,您正试图计算的点)的排序序列以及每个点的Z值。