沿任意轴光线跟踪锥体

时间:2014-02-14 15:27:40

标签: c raytracing

我正在研究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 而不是锥形,我在右边有一个抛物面红色的形状,我知道它几乎与锥形相同。

1 个答案:

答案 0 :(得分:0)

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

例如,光线追踪器仅支持基于原点的锥体以及沿垂直轴的点的情况并不少见。然后,您将使用仿射变换将锥体移动到正确的位置和方向。

我自己的光线跟踪器(迄今为止只支持平面,方框和球体)具有相同的问题,实现转换矩阵是我的下一个任务。