我正在写一个射线追踪器,我想要为它测试与隐式曲面的交点(在我的例子中是球面)。在不应用任何转换的情况下,它工作得很好,但是我想升级它,以测试针对非均匀缩放球的交叉点。为此,我计算了对象的局部到世界矩阵,以及世界到局部矩阵。
在交集测试中,我首先将光线的起源和方向转换为物体的局部空间:
Vector o = ray.getOrigin();
Vector l = ray.getDirection();
#ifdef _RT_TRANSFORM_RAY_TO_LOCAL_SPACE
o = worldToLocalMatrix * o;
l = worldToLocalMatrix * Vector(l.x, l.y, l.z, 0.0f);
l = l.Normalize();
#endif我执行测试,计算对象的局部空间中的交点,然后将其转换回世界空间:
Vector hitPoint(o + (l * distance));
Vector hitNormal((hitPoint - center) / radius);
hitNormal = hitNormal.Normalize();
#ifdef _RT_TRANSFORM_RAY_TO_LOCAL_SPACE
hitPoint = localToWorldMatrix * hitPoint;
hitNormal = localToWorldMatrix * Vector(hitNormal.x, hitNormal.y, hitNormal.z, 0.0f);
#endif
hitNormal = hitNormal.Normalize();如果我运行射线追踪仪,效果很好:

但是,从某些角度(并非全部),我从介质球(上述图像的中心)和完美的镜面(在上面的图像中正确)以及其中一个立方体中得到错误的呈现:

如果我只是在启动时将仿射变换应用于对象的顶点和法线(在球体中,我只应用平移,因为它是一个隐式曲面),渲染就会完美无缺,所以我猜想这个问题来自应用于光线的转换。
计算局部到世界矩阵:Model = rotation * translation * scale
将世界计算为局部矩阵:InvModel = inverse(scale) * inverse(translation) * inverse(rotation)
我想知道我是否正确地将转换应用于光线和输出
发布于 2018-03-17 16:22:03
我解决了问题。它与光线/点变换本身无关,而是与摄像机移动后的更新问题有关(向上向量没有被正确计算)。
如果有人有类似的问题,我会留下答案。
https://computergraphics.stackexchange.com/questions/6422
复制相似问题