どのようにして立方体を球体に変えますか?


31

次のような結果を示す記事に基づいて四角球を作成しようとしています:

正しい

キューブを正しく生成できます。

前

しかし、(上記のリンク先のページから)この式に従ってすべてのポイントを変換すると:

式

    x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
    y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
    z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

私の球体は次のようになります。

後

ご覧のとおり、立方体の端はまだ突き出しすぎています。キューブは、の範囲-1+1記事が言うように、すべての軸に。

何が間違っているのでしょうか?


1
実装にも「x = x ...」の問題が含まれていますか、それともここだけですか?
snake5

8
幻想的な視覚補助。それらを含めてくれてありがとう
doppelgreener

2
タイトルの質問に答えるために、立方体の頂点を正規化して球体にすることができます。ただし、頂点の分布はリンクされた方法とはおそらく異なるでしょう。
msell

回答:


27

数式を間違えています。

x = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
y = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
z = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

オリジナルxを変更して上書きします。次に、y元ではなく変更されたに基づいxて変更しxます。次に、これらz両方の修正バージョンに基づいて修正します。

オリジナルを保存し、これを計算します:

float dx = x * sqrtf(1.0 - (y*y/2.0) - (z*z/2.0) + (y*y*z*z/3.0));
float dy = y * sqrtf(1.0 - (z*z/2.0) - (x*x/2.0) + (z*z*x*x/3.0));
float dz = z * sqrtf(1.0 - (x*x/2.0) - (y*y/2.0) + (x*x*y*y/3.0));

それ以降はdx、dy、dzを使用します。


おっと。考えていませんでした。
トムダリング

上記のプログラムのサンプルソースはありますか?
Vamsi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.