C中的光线追踪器,光线平面相交

Posted

技术标签:

【中文标题】C中的光线追踪器,光线平面相交【英文标题】:Ray-tracer in C, Ray-plane intersection 【发布时间】:2013-02-20 04:49:42 【问题描述】:

我正在使用 C 语言开发光线追踪器。我正在尝试找出光线平面交叉点的数学运算。我有

d = ((Po-Lo) (点) N) / (L (点) N)

现在如果我是对的......

n - the planes normal ray
Po = single point on the plane
L = the vector that represents the ray I am shooting
Lo = a point on the line

我对它的工作原理感到困惑。如果我逐个像素地进行,线(Lo)上的点是否需要降落在平面上?如果这是真的,我不能只用我投射的光线 (L) 的方向向量来表示那个点吗?

我觉得我完全把这个复杂化了,但是我完全不知道如何在我的代码中让它工作。

编辑:

d = a scalar in the real world domain.

所以 d 需要等于 0 才能使平面和射线(在我看到的点)相交?我可以用方向向量坐标来表示线上的那个点吗>

【问题讨论】:

d 似乎是一个标量。它代表什么? 如果您想在交叉路口时避免一些麻烦,您可以将所有基元存储在局部坐标中(即在具有单位大小的原点)并保持与每个基元相关联的仿射变换(用于旋转、缩放和平移)。当您执行相交逻辑时,您可以对射线进行 inverse 变换并解决简化的相交问题,其中 P0 = 0,L0 = 变换后的射线的原点,N 只是您的向上向量坐标系。然后您可以将生成的交点转换回世界坐标。 这个关于线平面相交的答案应该会有所帮助(它与射线平面相交几乎相同),它也引用了 C 代码,***.com/a/18543221/432509(并参考确切的功能developer.blender.org/diffusion/B/browse/master/source/blender/…) 【参考方案1】:

对于平面上的任意点p,这个等式成立:

dot(Po-p,N) = 0

对于线上的任意点p,这个等式成立:

p = Lo+L*d

如果该点既在平面上又在直线上(交点),那么它们都必须为真。因此我们可以替换:

dot(Po-(Lo+L*d),N) = 0

通过代数,我们可以解出 d:

dot((Po-Lo)-L*d),N) = 0
dot(Po-Lo,N) - dot(L*d,N) = 0
dot(Po-Lo,N) - d*dot(L,N) = 0
dot(Po-Lo,N) = d*dot(L,N)
d = dot(Po-Lo,N)/dot(L,N)

【讨论】:

以上是关于C中的光线追踪器,光线平面相交的主要内容,如果未能解决你的问题,请参考以下文章

减少光线追踪时的计算

实现光线追踪

在光线追踪中为对象着色

光线追踪(RayTracing)算法理论与实践入门

光线追踪:带有区域光的水平伪影

如何将光线追踪器中的光线从世界空间反向旋转到对象空间