考虑一个中心位于坐标原点的球体和一个刻有二十面体的球体,其定向使得两个最远的顶点位于Z坐标轴上,并且从任何顶点出现的一个边缘位于XZ平面中。
考虑一个来自球体中心的给定向量x
。由此向量给出的方向在某一点刺穿二十面体的表面。
是否有一种优雅的方法可以找到穿孔的小平面(考虑所有小平面都被列举),然后在这个小平面上找到穿孔点?需要执行此任务以将穿透点投射到平展的(未展开的)二十面体表面。
答案 0 :(得分:3)
此解决方案特定于您的应用程序,其中向量从原点发出,而二十面体以原点为中心。
使用二十面体的12个顶点定义20个三角形。从二十面体外部观察时,对3进行排序以使它们处于逆时针顺序。因此,对于每个三角形,您将拥有3个顶点的列表。对于每个三角形构造一个3x3矩阵,其中列是三角形的顶点:
[ x1 x2 x3 ] T = [ y1 y2 y3 ] [ z1 z2 z3 ]
您需要使用此矩阵的反转(搜索SO或谷歌以您选择的语言快速3x3反转)。 现在,对于每个向量,您希望将它乘以所有20个matricies。所以对于每个三角形计算:
B = V * T(反向)
如果B的所有3个元素都是正数(负数?),则这是相交的三角形。
接下来,将B标准化 - 除以它的长度,使其具有单位长度。这将使B成为该三角形上交点的重心坐标。您还可以通过将重心坐标乘以原始点矩阵来计算实际交点I:
I = B * T
这也适用于在展开的三角形上找到交点的2D坐标。因此,使用2D坐标的2x3矩阵代替T。
最后一次优化。如果对每个三角形的3个顶点求和,这将为您提供该三角形的法线向量。如果使用每个法线计算向量的点积,则具有最大点积的三角形将是相交的三角形。这个事实特定于以原点为中心的正多面体,其中有关的光线来自原点。这比整个矩阵乘法更快以确定哪一个被击中。您仍然需要进行1次矩阵乘法才能找到重心坐标。
您还可以搜索光线三角形交叉点并阅读有关重心坐标的信息,但这些解决方案将比这个特定问题所需的更加通用。
答案 1 :(得分:1)
好吧,这不是真正的我的领域,但没有其他人回答,所以我会捅它。你可以将二十面体表示为12个顶点 - 10个赤道顶点,加上顶部和底部(没有固有的赤道,这只是一种为我们的坐标系分类的方法)。
反过来,那些顶点可以表示为段 - 一端是原点,另一端是顶点。鉴于此,您可以推导出赤道以上的高度。如果您知道向量的高度(同样,在赤道上方),您可以确定向量相交的二十面体的三个部分中的哪一个 - 北部,南部或赤道集。
从矢量中,您还可以确定方位角。如果从顶点矢量得到各自的导出方位角和高度,那么计算一组两个面(因而是四个顶点)就相当简单。计算给定矢量之间的角度间隔,每个顶点区段将告诉您它所在的两个面中的哪一个面 - 两个轴承总和中较小的一个将是该面。
那就是我被困住的地方......我看不出一种简单的方法来确定与脸部的交点。希望这对第一部分至少有帮助。