我目前正在开展一个项目,我想在3D立方体上绘制不同的数学对象。它适用于作为矢量方程给出的点和线。现在我有一个作为参数方程给出的平面。此平面可以位于3D空间中的某个位置,并且可以在屏幕上显示,即此3D立方体。立方体充当AABB。
我需要知道的第一件事是飞机是否与立方体相交。为此,我创建了与此立方体边缘相同的线条,然后进行了12个线/平面交叉点,计算线条是否在作为AABB一部分的线段(边缘)内被击中。这样做我将得到一组点,用于定义我必须绘制的立方体中平面的可见部分。
我现在最多有6个点A,B,C,D,E和F定义我想绘制的多边形ABCDEF。为此,我想将多边形分成三角形,例如:ABC,ACD,ADE,AED。我会像描述here那样绘制这个三角形。我目前面临的问题是,我(相信我)需要对点进行排序以获得正确的三角形,然后是正确绘制的多边形。我发现了凸壳,发现QuickHull在三维空间中起作用。这个算法只有一个问题:开始时我需要创建一个三维单形,以便为算法提供一个起点。但由于我所有的点都在同一个平面上,它们只是形成一个二维平面。因此,我认为这种算法不起作用。
我现在的问题是:如何订购这些3D点,从而产生一个应该是这些点的2D凸包的多边形?如果这是一个限制:我需要在C中执行此操作。
感谢您的帮助!
答案 0 :(得分:1)
一种方法是表示平面空间中交叉点的坐标,即2D,而不是全局3D空间。根据您计算这些点的精确程度,您可能已经拥有这些(例如(U,V))坐标。如果不是,则计算属于平面的两个正交向量,并将点积与(X,Y,Z)交点相乘。然后你可以在2D中找到凸包。
立方体的8个角可以位于平面的两侧,当坐标插入平面的隐式方程(实际上是顶点的W坐标)时,它具有+或 - 符号。这形成了最多2 ^ 8 = 256个配置(其中并非所有配置都可能)。
为了提高效率,您可以一劳永逸地解决所有这些配置,并且对于每个案例列出以正确顺序形成多边形的交叉点。然后对于给定的情况,计算8个符号位,将它们打包成一个字节并查找多边形表。
更新:直接构建。
或者,您可以通过跟踪边缘到边缘的交叉点来继续。
从已知穿过飞机的立方体边缘开始。这条边属于两个面。任意选择一个。然后平面将这个面切成三角形和五边形,或两个四边形。转到另一个与脸部边缘相交的交叉点。采取与这个新边缘接壤的另一面。这张脸被切成三角形和五边形......
继续此过程,您将遍历一组面和定义截面多边形的相应线段。
在图中,您从边缘HD的交叉点开始,属于面部DCGH。然后移动到边缘GC,也在面部CGFB中。从那里,移动到边缘FG,也在面对EFGH。移动到边缘EH,同样在面部ADHE中。而你又回到了边缘HD。
完整的讨论必须考虑通过立方体的一个或多个顶点的平面的情况。 (但你可以通过稍微平移平面,构造交叉点多边形并去除可能以这种方式人工创建的细小边缘来作弊。)