如何将光线追踪器中的光线从世界空间反向旋转到对象空间

Posted

技术标签:

【中文标题】如何将光线追踪器中的光线从世界空间反向旋转到对象空间【英文标题】:How to inverse rotate a ray in a ray tracer from world space to object space 【发布时间】:2020-12-08 12:11:18 【问题描述】:

我目前正在 c# 中实现光线追踪器,我正在尝试将我的光线反向旋转到 3Dobject 的旋转以进行 intersectionDetection,但我似乎在这里做错了很多事情......

我的代码:

static internal Ray TranformRay(Ray r, Vector3 objectLocation, Vector3 objectRotation, float objectScale)

         //reverse location tranformation
        Vector3 newOrigin = r.origin - objectLocation;

        //reverse rotation transformation
        objectRotation = -1* objectRotation;
        Matrix4x4 ReverseRotation = Matrix4x4.CreateFromYawPitchRoll(Computations.ToRadians(objectRotation.X), Computations.ToRadians(objectRotation.Y), Computations.ToRadians(objectRotation.Z));
        newOrigin = Vector3.Transform(newOrigin, ReverseRotation);
        Vector3 newDirection = Vector3.Normalize(Vector3.TransformNormal(r.direction, ReverseRotation));

        //reverse scale
        newDirection /= objectScale;

        return new Ray(newOrigin, newDirection);
    

my Ray r 是我当前需要转换的光线。 我的世界中的 3D 对象有位置、旋转、比例。

谁能告诉我我在这里做错了什么?

【问题讨论】:

【参考方案1】:

我假设你想将你的光线从世界空间转换到物体空间。然后你应该计算你的对象到世界变换并调用Matrix4x4.Invert 来产生逆变换。并非所有变换都是可逆的,但正常的仿射变换应该没问题。

编辑: 您通常会通过调用 Matrix4x4 Create Scale/rotation/translation 方法生成对象到世界的变换,并将变换相乘。我还建议您使用四元数而不是欧拉角进行旋转。四元数应该更容易应用多次连续旋转。

假设您的光线是原点和方向,您将使用Vector3.Transform 转换原点并使用Vector3.TransformNormal 转换方向。后者不应用矩阵的平移部分。

这假设您使用的是 System.Numerics 库,但大多数矢量库应该具有等效功能。

【讨论】:

以上是关于如何将光线追踪器中的光线从世界空间反向旋转到对象空间的主要内容,如果未能解决你的问题,请参考以下文章

在 CUDA 中,如何在内核函数中将屏幕空间坐标转换为世界空间坐标

在光线追踪中为对象着色

如何在现代 OpenGL 中进行光线追踪?

用于在世界中放置对象时的光线投射抖动

2 追踪光线=》2.7 透射光线

Three.js - 将光线从物体发送到相机