Bagaimana Anda mengubah kubus menjadi bola?

31

Saya mencoba membuat bola quad berdasarkan artikel , yang menunjukkan hasil seperti ini:

benar

Saya dapat membuat kubus dengan benar:

sebelum

Tetapi ketika saya mengonversi semua poin sesuai dengan rumus ini (dari halaman yang ditautkan di atas):

rumus

    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));

Sphere saya terlihat seperti ini:

setelah

Seperti yang Anda lihat, tepi kubus masih mencuat terlalu jauh. Kubus berkisar dari -1hingga +1semua sumbu, seperti kata artikel itu.

ada yang tahu apa yang salah?

Tom Dalling
sumber
1
Apakah implementasi Anda mengandung masalah "x = x ..." atau hanya ada di sini?
snake5
8
Alat bantu visual yang fantastis. Terima kasih sudah memasukkan itu.
doppelgreener
2
Untuk menjawab pertanyaan dalam judul, Anda bisa menormalkan simpul kubus untuk membuatnya menjadi bola. Distribusi simpul mungkin akan berbeda dari metode tertaut.
msell

Jawaban:

27

Anda salah menuliskan formula.

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));

Anda memodifikasi yang asli xdan menimpanya. Kemudian Anda memodifikasi yberdasarkan bukan pada yang asli xtetapi yang dimodifikasi x. Kemudian Anda memodifikasi zberdasarkan versi modifikasi dari keduanya .

Pertahankan yang asli, dan hitung ini:

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));

Gunakan dx, dy dan dz sejak saat itu.

doppelgreener
sumber
Aduh. Tidak berpikir.
Tom Dalling
apakah Anda punya sumber sampel untuk program di atas?
Vamsi