Можно ли сделать рендеринг ленты mobius с помощью raytracer? - PullRequest
0 голосов
/ 19 января 2020

В моем raytracer все поверхности центрированы в начале координат и ориентированы по оси Y. Смещение, вращение и изменение размера получаются с помощью матрицы преобразования, примененной к лучам.

Недавно я отрисовал тор в моей трассировке лучей, используя ее декартовое уравнение:

(x ^ 2 + y ^ 2 + z ^ 2) ^ 2 - 2 * (r1 ^ 2 + r2 ^ 2) * (x ^ 2 + y ^ 2 + z ^ 2) + 4 * r1 ^ 2 * y ^ 2 + (r1 ^ 2 - r2 ^ 2) ^ 2

, для которого я заменил каждую точку уравнением луча:

ex: X = Ray.ori.x + T * Ray. dir.x;

Заменив компоненты луча в уравнении, я получил 5 коэффициентов моей функции кварти c, которую можно использовать для нахождения корней уравнения (пересечения Т) с Алгоритм полиномиального решения 4-й степени.

Мне было интересно, можно ли воспроизвести mobius strip таким же образом. Мои исследования не принесли много пользы, я нашел несколько кодов Raytracing, использующих уравнения cubi c, но копирование 4 коэффициентов привело меня к непонятным формам и артефактам.

Не могли бы вы помочь мне сделать это? Также приветствуется совет сделать его другим методом.

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Да, можно визуализировать мобиус-полосу с помощью трассировщика лучей.

mobius

0 голосов
/ 19 января 2020

Я взял (декартово) уравнение кубиуса c Мобиуса из: Матемор , затем я заменил x, y и z Мобиуса уравнением луча.

Однако результат такой: enter image description here

Вот код для расчета коэффициентов Мобиуса.

double x = ray.ori.x;
double y = ray.ori.y;
double z = ray.ori.z;
double i = ray.dir.x;
double j = ray.dir.y;
double k = ray.dir.z;
double c[4];
double R = 1.;
int solutions;

c[3] = (i * i) * j - 2. * (i * i) * k + (j * j * j) - 2. * (j * j) * k + j * (k * k);
c[2] = (i * i) * y - 2. * (i * i) * z + 2 * i * j * x - 2. * i * k * R - 4. * i * k * x + 3. * (j * j) * y - 2. * (j * j) * z - 4. * j * k * y + 2. * j * k * z + (k * k) * y;
c[1] = - 2. * i * R * z + 2 * i * x * y - 4. * i * x * z - j * (R * R) + j * (x * x) + 3. * j * (y * y) - 4. * j * y * z + j * (z * z) - 2. * k * R * x - 2 * k * (x * x) - 2. * k * (y * y) + 2. * k * y * z;
c[0] = - (R * R) * y - 2. * R * x * z + (x * x) * y - 2. * (x * x) * z + (y * y * y) - 2. * (y * y) * z + y * (z * z);

Может быть, я рендеринг всей поверхности, которая простирается до бесконечности? Как получить мобиус-полосу в этом случае?

...