考虑给定一个向量x,起始于球体中心。由该向量给出的方向,在二十面体表面穿过某一点。
是否有一种优雅的方法来找到被穿过的面(考虑到所有面都已编号),然后找到该面上的穿孔点?这个任务需要将穿孔点投影到平铺的二十面体表面。
这个解决方案是针对你的应用程序而设计的,其中向量从原点发出,二十面体位于原点中心。
使用二十面体的12个顶点定义20个三角形。为了使每个三角形在从二十面体外部查看时呈逆时针顺序排序,请按顺序列出3个顶点。因此,对于每个三角形,您将得到一个由3个顶点组成的列表。对于每个三角形,构建一个3x3矩阵,其中列是该三角形的顶点:
[ x1 x2 x3 ] T = [ y1 y2 y3 ] [ z1 z2 z3 ]
您需要该矩阵的逆矩阵(请搜索SO或谷歌以获取所选语言的快速3x3逆)。 现在,对于每个向量,您需要将其乘以所有20个矩阵。因此,对于每个三角形,计算:
B = V*T(inverse)
如果B的所有3个元素都为正数(负数?),则为相交的三角形。
接下来,规范化B-将其除以其长度,使其具有单位长度。这将使B成为该三角形上交点的重心坐标。您还可以通过将交点的重心坐标乘以原始点矩阵来计算实际交点I:
I = B*T
这也适用于查找展开三角形上交点的2D坐标。因此,请使用2x3的2D坐标矩阵,而不是T。
最后一个优化。如果将每个三角形的3个顶点相加,则会得到该三角形的法向量。如果计算矢量与每个法向量的点积,则具有最大点积的三角形将被相交。此事实特定于以原点为中心且所讨论的射线从原点发出的正多面体。这比执行整个矩阵乘法更快,以确定哪个被命中。您仍需要进行1次矩阵乘法以查找重心坐标。
您还可以搜索光线三角形相交并阅读重心坐标,但这些解决方案将比此特定问题要求的更为一般化。
好的,这不是我的专业领域,但是没有其他人回答,所以我会试着回答一下。你可以将一个二十面体表示为12个顶点 - 10个赤道顶点,加上顶部和底部(它们本质上与赤道无关,这只是一种为我们的坐标系分类的方式)。
这些顶点又可以表示为线段 - 一端是原点,另一端是顶点。在此基础上,您可以推导出相对于赤道的高度。如果您知道向量的高度(再次强调,相对于赤道),则可以确定向量与二十面体的哪三个部分相交 - 北部、南部或赤道集合。
从您的向量中,您还可以确定方位角。如果您有来自顶点向量的相应派生方位角和高度,则可以进行一组两个面(因此四个顶点)的简单计算。计算给定向量与每个顶点线段之间的角度差将告诉您它位于哪个面 - 较小的两个方位角之和的面就是那个面。
这就是我卡住的地方...我看不到确定与面相交点的简单方法。希望至少对第一部分有所帮助。
phkahler
在下面提供了解决方案。看起来非常好。 - mbaitoff