您可以这样做的一种方法是从具有三角形边的柏拉图立体开始 - 例如octahedron。然后,取出每个三角形并递归地将其分解为更小的三角形,如下所示:
一旦你有足够数量的点,你就可以对它们的向量进行归一化,使它们都与实体中心保持恒定距离。这会导致两侧凸出成类似于球体的形状,随着点数的增加,平滑度也会增加。
这里的归一化是指移动一个点,使其相对于另一个点的角度相同,但它们之间的距离不同。
这是一个二维示例。
A 和 B 相距 6 个单位。但是假设我们想在 AB 线上找到一个距离 A 12 个单位的点。
我们可以说C是B关于A的归一化形式,距离为12。我们可以用这样的代码获得C:
#returns a point collinear to A and B, a given distance away from A.
function normalize(a, b, length):
#get the distance between a and b along the x and y axes
dx = b.x - a.x
dy = b.y - a.y
#right now, sqrt(dx^2 + dy^2) = distance(a,b).
#we want to modify them so that sqrt(dx^2 + dy^2) = the given length.
dx = dx * length / distance(a,b)
dy = dy * length / distance(a,b)
point c = new point
c.x = a.x + dx
c.y = a.y + dy
return c
如果我们对很多点进行这个归一化过程,所有点都相对于同一个点 A 并且具有相同的距离 R,那么归一化的点都将位于圆心 A 和半径 R 的圆弧上。
在这里,黑点从一条线上开始,然后“凸出”成一条弧线。
这个过程可以扩展到三个维度,在这种情况下,你会得到一个球体而不是一个圆。只需在 normalize 函数中添加一个 dz 组件即可。
如果您查看Epcot 的球体,您可以看到这种技术在起作用。它是一个带有凸面的十二面体,使它看起来更圆。