c++ - 光线追踪 - 光线与平行四边形

标签 c++ raytracing

我正在为学校开发一个简单的光线追踪器,我正在尝试实现光线平行四边形相交。我的平行四边形以参数形式定义 (p = origin + u * A + v * B)。第一步类似于射线平面相交,我从中得到可能的交点 P。但是如何检查该点是否在平行四边形内?我查看了 stackoverflow,发现了这个 3D Ray-Quad intersection test in java但是尽管标题表明接受的答案似乎只适用于矩形?我没有通过一些 secret 测试(意思是我不知道为什么我没有通过测试,我只知道我没有通过 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();

最佳答案

您可以进行两次射线-三角形相交测试,但这样做的成本会更高,因为某些计算需要进行两次。

您可以使用三个 vector a_ 测试射线-平行四边形相交, b_ , 和 ray.d作为平行四边形局部空间的基础。使用 ray.d 的优势因为“正常”组件是当您表达 ray.o 时在此基础上,相交测试简化为检查局部x和y坐标是否在0和1之间,z坐标编码距离。

整个过程是:

  1. 构建矩阵B带列 a_ , b_ , 和 ray.d
  2. 反转它:B_inv = inverse(B)
  3. 计算 ray.o在本地空间:ol = B_inv * (ray.o - origin_)
  4. 距离 t-ol.z
  5. 相交测试:
    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/

相关文章:

simulation - 2D 光线追踪

c++ - 这种设计模式的名称是什么?门面、适配器、网桥、代理?

c++ - 引用 boost.fusion vector 中的元素

java - 使用 SWIG 将 Java Map<String, String> 传递给 C++ 方法

c++ - Qt中多个ui窗体的切换

c++ - 简单的光线追踪器,漫反射着色问题c++

java - 光线追踪三角形

c++ - 自动存储的析构函数

graphics - 光线追踪中的光泽反射

c++ - 内存泄漏问题