可以用光线追踪器渲染莫比乌斯带吗?
It is possible to render a mobius strip with a 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 个系数,可用于使用四次多项式求解器算法找到方程根(T 交点)。
我想知道 mobius strip 是否可以用相同的方式呈现。
我的研究并没有带来太多,我发现了一些使用三次方程的光线追踪代码,但复制 4 个系数导致我无法理解的形式和伪影。
你能帮我渲染一下吗?也欢迎建议用另一种方法渲染它。
谢谢!
我从以下位置获取莫比乌斯的(笛卡尔)三次方程:mathworld
然后我用射线方程替换了mobius的x,y和z。
然而结果是这样的:
这是计算莫比乌斯系数的代码。
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);
也许我正在渲染延伸到无穷远的整个表面?
这种情况下如何得到莫比乌斯带?
是的,可以使用光线追踪器渲染莫比乌斯带。
在我的光线追踪器中,所有表面都以原点为中心并在 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 个系数,可用于使用四次多项式求解器算法找到方程根(T 交点)。
我想知道 mobius strip 是否可以用相同的方式呈现。 我的研究并没有带来太多,我发现了一些使用三次方程的光线追踪代码,但复制 4 个系数导致我无法理解的形式和伪影。
你能帮我渲染一下吗?也欢迎建议用另一种方法渲染它。
谢谢!
我从以下位置获取莫比乌斯的(笛卡尔)三次方程:mathworld 然后我用射线方程替换了mobius的x,y和z。
然而结果是这样的:
这是计算莫比乌斯系数的代码。
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);
也许我正在渲染延伸到无穷远的整个表面? 这种情况下如何得到莫比乌斯带?
是的,可以使用光线追踪器渲染莫比乌斯带。