我正在为学校设计一个简单的光线追踪器,并且正在尝试实现光线平行四边形的交点。我的Paralleogram以参数形式定义(p =原点+ u * A + v * B)。第一步与射线平面相交,我从中得到可能的交点P。但是,如何检查该点是否在平行四边形内?我看了一下stackoverflow并发现了这个3D Ray-Quad intersection test in java,但是尽管标题表明接受的答案似乎仅对矩形有效?我没有通过一些秘密测试(这意味着我不知道为什么我没有通过测试,我只知道我没有通过x))。也许我错过了一些前沿案例?

这是我的代码

const auto normal = cross(a_, b_);
const auto num = dot(origin_ - ray.o, normal);
const auto denom = dot(ray.d, normal);
if (-epsilon < denom && denom < epsilon)
{
    return false;
}
const auto t = num / denom;
const auto p = (ray.o + t * ray.d) - origin_;
const auto u = dot(p, a_);
const auto v = dot(p, b_);
return -epsilon < t && t < previous && 0.f < u  && u <= a_.length_squared() && 0.f < v && v <= b_.length_squared();

最佳答案

您可以进行两个射线-三角形相交测试,但由于某些计算需要进行两次,因此成本更高。

您可以使用三个向量a_b_ray.d作为平行四边形局部空间的基础来测试射线与平行四边形的交点。将ray.d用作“常规”组件的好处是,在此基础上表达ray.o时,对相交的测试会简化检查本地x和y坐标是否在0和1之间以及z坐标编码的情况距离。

整个过程是:


使用列Ba_b_构建矩阵ray.d
反转:B_inv = inverse(B)
在本地空间中计算ray.ool = B_inv * (ray.o - origin_)
距离t-ol.z
测试交叉点:
if (t >= 0 && t < previous && ol.x >= 0 && ol.x <= 1 && ol.y >= 0 && ol.y <= 1)

关于c++ - 光线追踪-光线与平行四边形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59128744/

10-11 23:05