我正在尝试从半径为r
的球体生成网格。我的目标是创建一个UV球体,使得多面体上的每个点与球体的距离都小于tol
。
以下代码在球体上创建点网格。如何计算parallels_count
和meridians_count
,以便网格的所有点都在公差范围内?
for j in parallels_count:
parallel = PI * (j+1) / parallels_count
for i in meridians_count:
meridian = 2.0 * PI * i / meridians_count
return spherical_to_cartesian(meridian, parallel)
代码来自here,这是UV球的图片:
网格的每个面与球体之间的距离将围绕面部的中心最大。
因此,对于面部与球体之间的距离小于tol
,面部边缘与相应圆周之间的距离小于tol
是不够的。
这张照片已脱离背景,但有助于我解释我的意思。
答案 0 :(得分:1)
点之间的最大距离是在赤道上,所以如果我没有弄错的话应该使用圆周来获得角度步长...
dangle = tol/r; //[rad]
其中r
是与tol
相同单位的球半径,您可以使用较小的步骤来确保dangle*=0.75;
对parallel
和{{1}都使用此步骤}角度。
如果您想要计数,请尝试:
meridian
现在还在这里,所以我希望我没有犯任何愚蠢的数学错误(最简单的东西是最糟糕的愚蠢错误)。
另请参阅我的一些相关 QA :
[Edit1]以及meridians_count = (2.0*PI*r/tol)+1; // ceil or +1 just to be sure
parallels_count = 0.5*meridians_count;
的新定义会改变所有内容
我这样看:
tol
如果转换为sphericalsurface而不是最大差异在uv网格单元的中心,代表sin(da/2) = (r-tol)/r
da = 2.0*asin((r-tol)/r)
对角线,请尝试使用:
sqrt(2)*da
所以你的角度步应该比那个小......