c - 沿任意轴对圆锥体进行光线追踪

标签 c raytracing

我正在开发 RayTracer,当我尝试计算与圆锥体的交点时,我无法弄清楚我做错了什么。我有光线 vector 和圆锥体及其轴的位置。我知道沿简单轴计算圆锥很容易,但我想用任意轴来计算。

我正在使用此链接 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/

相关文章:

c - 在c中传递一个指向char数组的指针

algorithm - 光子映射 - 几个问题

Java:旋转和 3D 扭曲

python - 快速体素遍历 2D

c++ - gcc 禁用 AMD64 推土机/打桩机指令

c - C 在编译过程中何时需要空格(或括号)?

c# - WPF 中的快速像素绘制

c++ - 无法实现光子映射

c - 我如何使用 sscanf 获取带有/分隔符的整数

c - 为什么这些构造使用增量前和增量后未定义的行为?