我正在研究RayTracer,当我尝试计算与圆锥的交点时,我无法弄清楚我做错了什么。我有射线矢量和圆锥及其轴的位置。我知道沿简单轴计算圆锥很容易,但是我想对任意轴进行计算。

我将此链接http://mrl.nyu.edu/~dzorin/rend05/lecture2.pdf用于锥方程(第7-8页),这是我的代码:

alpha = cone->angle * (PI / 180);
axe.x = 0;
axe.y = 1;
axe.z = 0;

delt_p = vectorize(cone->position, ray.origin);
tmp1.x = ray.vector.x - (dot_product(ray.vector, axe) * axe.x);
tmp1.y = ray.vector.y - (dot_product(ray.vector, axe) * axe.y);
tmp1.z = ray.vector.z - (dot_product(ray.vector, axe) * axe.z);
tmp2.x = (delt_p.x) - (dot_product(delt_p, axe) * axe.x);
tmp2.y = (delt_p.y) - (dot_product(delt_p, axe) * axe.y);
tmp2.z = (delt_p.z) - (dot_product(delt_p, axe) * axe.z);

a = (pow(cos(alpha), 2) * dot_product(tmp1, tmp1)) - (pow(sin(alpha), 2) * dot_product(ray.vector, axe));
b = 2 * ((pow(cos(alpha), 2) * dot_product(tmp1, tmp2)) - (pow(sin(alpha), 2) * dot_product(ray.vector, axe) * dot_product(delt_p, axe)));
c = (pow(cos(alpha), 2) * dot_product(tmp2, tmp2)) - (pow(sin(alpha), 2) * dot_product(delt_p, axe));
delta = pow(b, 2) - (4 * a * c);

if (delta >= 0)
{
    t1 = (((-1) * b) + sqrt(delta)) / (2 * a);
    t2 = (((-1) * b) - sqrt(delta)) / (2 * a);
    t = (t1 < t2 ? t1 : t2);
    return (t);
}


我用y轴初始化了我的轴,以便可以旋转它。
这是我得到的:http://i.imgur.com/l3kaavc.png
我没有锥体,而是在右边有一个抛物线形的红色形状,并且我知道它与锥体几乎相同。

最佳答案

您可能需要使用同质矩阵对基元实现任意转换,而不是为每个基元支持任意方向。

例如,光线跟踪器仅支持以原点为基础且沿垂直轴指向该点的圆锥体并不少见。然后,您可以使用仿射变换将圆锥移动到正确的位置和方向。

我自己的光线跟踪器(到目前为止仅支持平面,盒子和球体)具有相同的问题,实现转换矩阵是我的下一个任务。

关于c - 沿任意轴射线跟踪圆锥,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21783235/

10-13 06:41