Come si trasforma un cubo in una sfera?


31

Sto cercando di creare una sfera quadrupla basata su un articolo , che mostra risultati come questo:

corretta

Posso generare correttamente un cubo:

prima

Ma quando converto tutti i punti secondo questa formula (dalla pagina collegata sopra):

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

La mia sfera si presenta così:

dopo

Come puoi vedere, i bordi del cubo sporgono ancora troppo. Il cubo va da -1a +1tutti gli assi, come dice l'articolo.

Qualche idea di cosa non va?


1
La tua implementazione contiene anche il problema "x = x ..." o è qui?
snake5,

8
Fantastici aiuti visivi. Grazie per averli inclusi.
doppelgreener,

2
Per rispondere alla domanda nel titolo, puoi semplicemente normalizzare i vertici del cubo per renderlo una sfera. La distribuzione dei vertici sarà probabilmente diversa dal metodo collegato però.
msell

Risposte:


27

Hai sbagliato a scrivere la 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));

Modifichi l'originale xe lo sovrascrivi. Quindi si modifica ynon in base all'originale xma a quello modificato x. Quindi si modifica in zbase alla versione modificata di entrambi .

Conserva gli originali e calcola questo:

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

Usa dx, dy e dz da allora in poi.


Ops. Non stavo pensando.
Tom Dalling,

hai qualche sorgente di esempio per il programma sopra?
Vamsi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.