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?


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.


Aduh. Tidak berpikir.
Tom Dalling

apakah Anda punya sumber sampel untuk program di atas?
Vamsi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.