それを行う1つの方法は、三角形の辺を持つ正多面体(たとえば、八面体)から始めることです。次に、各三角形を取得し、次のように再帰的に小さな三角形に分割します。
十分な数のポイントができたら、それらのベクトルを正規化して、それらがすべてソリッドの中心から一定の距離になるようにします。これにより、側面が球に似た形状に膨らみ、ポイントの数を増やすと滑らかさが増します。
ここでの正規化とは、別のポイントに対する角度が同じになるようにポイントを移動することを意味しますが、それらの間の距離は異なります。これが2次元の例です。
AとBは6ユニット離れています。しかし、Aから12単位離れた線AB上の点を見つけたいとします。
Cは、距離12のAに関してBの正規化された形式であると言えます。次のようなコードで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の円の円弧上にあります。
ここで、黒い点は線から始まり、弧に「膨らみ」ます。
このプロセスは3次元に拡張できます。その場合、円ではなく球を取得します。正規化関数にdzコンポーネントを追加するだけです。
エプコットの球体を見ると、このテクニックが機能していることがわかります。丸みを帯びたように顔が膨らんだ十二面体です。