首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >光线追踪:将光线转换为物体的局部空间进行交叉测试

光线追踪:将光线转换为物体的局部空间进行交叉测试
EN

Computer Graphics用户
提问于 2018-03-17 13:07:21
回答 1查看 2.6K关注 0票数 3

我正在写一个射线追踪器,我想要为它测试与隐式曲面的交点(在我的例子中是球面)。在不应用任何转换的情况下,它工作得很好,但是我想升级它,以测试针对非均匀缩放球的交叉点。为此,我计算了对象的局部到世界矩阵,以及世界到局部矩阵。

在交集测试中,我首先将光线的起源和方向转换为物体的局部空间:

代码语言:javascript
复制
    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

我执行测试,计算对象的局部空间中的交点,然后将其转换回世界空间:

代码语言:javascript
复制
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)

我想知道我是否正确地将转换应用于光线和输出

EN

回答 1

Computer Graphics用户

发布于 2018-03-17 16:22:03

我解决了问题。它与光线/点变换本身无关,而是与摄像机移动后的更新问题有关(向上向量没有被正确计算)。

如果有人有类似的问题,我会留下答案。

票数 1
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/6422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档