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中的光线追踪器,光线平面相交的主要内容,如果未能解决你的问题,请参考以下文章