将矢量捕捉到球体上的网格点(二十面体)

时间:2018-01-31 23:46:43

标签: algorithm unity3d vector 3d

这是一个会让你的大脑内外的问题,我已经尝试处理它已经有一段时间了。

假设您的球体位于3d空间的原点。球体被分割成等距点的网格。形成网格的过程并不重要但对我来说似乎很简单的是使用常规的3d计算机图形球体生成程序(形成下图所示的球体的算法)

现在,在我拥有这样的球体(即某种程度的二十面体)之后,我需要一个计算上很简单的程序,它能够将随机单位矢量捕捉(一个角度)到它最接近的二十面体边缘点。如果矢量将被捕捉到矢量相交的三角形的中心点,也是可以接受的。

我想强调的是,程序在计算上应该是微不足道的。这意味着在内存中实际创建一个球体然后在球体中的每个三角形之间进行搜索的过程不是一个好主意,因为这样的搜索将需要访问全局堆和ram这很慢,因为我需要执行这个过程数百万次在低端移动硬件上。

程序应该通过一组基于两个值的数学方程得到它的结果,二十面体的矢量和程度(即球体)

有什么想法?提前谢谢!

============

修改

我突然意识到,在下面的图表中,步骤3(即将每个新顶点投射到单位球体)似乎根本不重要,因为在二分之后,每个顶点到球体的投影将保留我们试图捕捉的二分形状的所有角度特征。因此,该任务简化了识别被矢量穿透的二分三角坐标。

This is icosahedron

2 个答案:

答案 0 :(得分:2)

制作一个包含20个顶级二十面体面部坐标的表格 - 例如,从wiki coordinate set构建它们

  

二十面体的顶点以原点为中心   边长为2,外接球半径为2 sin(2π/ 5)   通过循环排列描述:

 V[] = (0, ±1, ±ϕ)
 where ϕ = (1 + √5)/2
 is the golden ratio (also written τ).

并计算相应的中心向量C [](每个面的顶点的三个向量的总和)。

使用矢量P的最大点积(DP)和所有C []找到最接近的中心矢量。也许,可以减少考虑P分量的检查次数(例如,如果P的点积和某些V [i]是负的,则认为面是V [i]的邻居是没有意义的)。不确定这种消除比直接完全比较DP与中心的时间要短。

当确定大三角形面时,该面的project P onto the plane并在u-v中得到P'的坐标(通过AB和AC分解AP',其中A,B,C是面顶点)。

乘以u,v乘2 ^ N(细分程度)。

 u' = u * 2^N
 v' = v * 2^N
 iu = Floor(u')
 iv = Floor(v')
 fu = Frac(u')
 fv = Frac(v')

u'的整数部分是小三角形的“行”,v'的整数部分是“列”。小数部分是小三角形面内的三线坐标,因此我们可以选择fu, fv, 1-fu-fv的最小值来获得最接近的顶点。如果需要,计算这个最近的顶点并标准化矢量。

答案 1 :(得分:0)

它不是等距的,你可以看看你是否研究this版本: enter image description here

这是geodesic dome frequency的一个问题,有些人花时间研究所有已知的方法来做几何:http://geo-dome.co.uk/article.asp?uname=domefreq,看看那个人是一个自我标记的geodesizer:)

一页告诉我,进展如下:2 + 10·4N(12,42,162 ...)

您可以将其简化为一个简单的平面分形三角形,其中每个三角形分成4个较小的三角形,每次细分围绕一个球体旋转12次。

逻辑上,只有一个三角形旋转了12次,如果你解决了那边的代码,那么你就拥有了测地球的最低计算版本。

如果您不想将12个边保留为一系列阵列,并且您想要较低的内存版本,那么您可以阅读中点细分代码,有很多版本的中点细分。

我可能完全错过了什么。只是没有一个真正的等距测地圆顶,因为三角形不会映射到球体,仅用于icos。