Comment transformer un cube en sphère?


31

J'essaie de créer une sphère quadruple basée sur un article , qui montre des résultats comme celui-ci:

correct

Je peux générer un cube correctement:

avant

Mais quand je convertis tous les points selon cette formule (à partir de la page liée ci-dessus):

formule

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

Ma sphère ressemble à ceci:

après

Comme vous pouvez le voir, les bords du cube poussent encore trop loin. Le cube s'étend de -1à +1sur tous les axes, comme le dit l'article.

Des idées ce qui ne va pas?


1
Votre implémentation contient-elle aussi un problème "x = x ..." ou est-ce juste ici?
— snake5

8
Aides visuelles fantastiques. Merci d' avoir inclus ceux-ci.
— doppelgreener

2
Pour répondre à la question dans le titre, vous pouvez simplement normaliser les sommets du cube pour en faire une sphère. Cependant, la distribution des sommets sera probablement différente de la méthode liée.
— msell

Réponses:


27

Vous avez mal écrit la formule.

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

Vous modifiez l'original xet le remplacez. Ensuite, vous modifiez en yfonction non pas de l'original xmais du modifié x. Ensuite, vous modifiez en zfonction de la version modifiée des deux .

Conservez les originaux et calculez ceci:

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

Utilisez ensuite dx, dy et dz.


Oups. Je ne pensais pas.
— Tom Dalling

avez-vous une source d'échantillon pour le programme ci-dessus?
— Vamsi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.