Як перетворити куб у кулю?


31

Я намагаюся створити чотирикутну сферу на основі статті , яка показує такі результати:

правильно

Я можу генерувати куб правильно:

раніше

Але коли я конвертую всі точки за цією формулою (зі сторінки, що пов’язана вище):

формула

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

Моя сфера виглядає так:

після

Як бачите, краї куба все ще висуваються занадто далеко. Куб коливається від -1до +1на всіх осях, як йдеться у статті.

Будь-які ідеї, що не так?


1
Чи ваша проблема також містить проблему "x = x ..." чи це просто тут?
змія5

8
Фантастичні наочні посібники. Дякую за включення до них.
doppelgreener

2
Щоб відповісти на запитання в заголовку, ви можете просто нормалізувати вершини куба, щоб зробити його сферою. Розподіл вершин, мабуть, буде відрізнятися від пов'язаного методу.
msell

Відповіді:


27

Ви неправильно написали формулу.

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

Ви змінюєте оригінал xі перезаписуєте його. Потім ви модифікуєте yне на оригіналі, xа на модифікованому x. Потім ви модифікуєте zна основі модифікованої версії обох цих.

Збережіть оригінали та обчисліть це:

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

Використовуйте dx, dy та dz з цього моменту.


Уопс. Не думав.
Том Даллінг

У вас є джерело зразка для вищевказаної програми?
Вамсі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.