Wie macht man einen Würfel zu einer Kugel?

31

Ich versuche, eine Quad-Kugel basierend auf einem Artikel zu erstellen , der folgende Ergebnisse zeigt:

richtig

Ich kann einen Würfel richtig generieren:

Vor

Aber wenn ich alle Punkte nach dieser Formel konvertiere (von der oben verlinkten Seite):

Formel

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

Meine Kugel sieht so aus:

nach

Wie Sie sehen, ragen die Kanten des Würfels immer noch zu weit heraus. Der Würfel reicht von -1bis +1auf allen Achsen, wie der Artikel sagt.

Irgendwelche Ideen, was ist los?

Tom Dalling
quelle
1
Enthält Ihre Implementierung auch das Problem "x = x ..." oder ist es nur hier?
Snake5
8
Fantastische Sehhilfen. Vielen Dank, dass Sie diese aufgenommen haben.
Doppelgreener
2
Um die Frage im Titel zu beantworten, können Sie einfach die Scheitelpunkte des Würfels normalisieren, um ihn zu einer Kugel zu machen. Die Verteilung der Eckpunkte wird sich jedoch wahrscheinlich von der verknüpften Methode unterscheiden.
msell

Antworten:

27

Sie haben die Formel falsch geschrieben.

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

Sie ändern das Original xund überschreiben es. Dann modifizierst du ybasierend nicht auf dem Original xsondern dem Modifizierten x. Dann ändern Sie zbasierend auf der geänderten Version von beiden .

Bewahren Sie die Originale auf und berechnen Sie diese:

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

Verwenden Sie ab dann dx, dy und dz.

doppelgreener
quelle
Hoppla. Dachte nicht.
Tom Dalling
Hast du eine Beispielquelle für das obige Programm?
Vamsi