c++ - 光线追踪 vector

标签 c++ vector-graphics raytracing

所以前几天我决定写一个光线追踪器,但我被卡住了,因为我忘记了所有的 vector 数学。 我在屏幕后面有一个点(眼睛/相机,400,300,-1000),然后在屏幕上有一个点(一个平面,从 0,0,0 到 800,600,0),我刚刚得到使用我正在寻找的当前像素的 x 和 y 值(使用 SFML 进行渲染,所以它类似于 267,409,0)

问题是,我不知道如何正确转换光线。我用它来测试球体相交(C++):

bool SphereCheck(Ray& ray, Sphere& sphere, float& t)
{ //operator * between 2 vec3s is a dot product
    Vec3 dist = ray.start - sphere.pos; //both vec3s
    float B =  -1 * (ray.dir * dist);
    float D = B*B - dist * dist + sphere.radius * sphere.radius; //radius is float
    if(D < 0.0f)
        return false;
    float t0 = B - sqrtf(D);
    float t1 = B + sqrtf(D);
    bool ret = false;
    if((t0 > 0.1f) && (t0 < t))
    {
        t = t0;
        ret = true;
    }
    if((t1 > 0.1f) && (t1 < t))
    {
        t = t1;
        ret = true;
    }
    return ret;
}

所以我知道光线的起点是眼睛位置,但方向是什么?

或者,如果做不到这一点,是否有更好的方法来做到这一点?我听说有些人使用射线起点作为 (x, y, -1000),方向作为 (0,0,1),但我不知道那是如何工作的。

附带说明一下,您将如何进行转换?我假设要更改相机角度,您只需调整相机的 x 和 y(如果需要大幅改变,则调整屏幕)

最佳答案

函数中的参数“ray”,

bool SphereCheck(Ray& ray, Sphere& sphere, float& t)
{
    ...
}

应该已经包含了方向信息,对于这个方向,您需要检查射线是否与球体相交。 (传入的“射线”参数是相机点和发出射线的像素之间的 vector 。)

因此本地“dist”变量似乎已过时。

关于c++ - 光线追踪 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8880618/

相关文章:

svg - 以不同方式缩放 SVG 文件的不同部分

linux - Linux 上带有大矢量图像的 PDF 查看器?

c++ - 转换光线与投影顶点?

c++ - 正确声明指针,分配内存,并将它们作为参数发送 c++

javascript - raphaelJS 2.1 沿路径设置动画

c++ - 生成 token 并转换为 C++ 代码?

graphics - 为什么我们应该区分光线追踪和光栅化的概念?

c++ - 射线四边形相交代码的问题(看起来像撕裂)

c++ - 使用默认值或使用 setValue 创建构造函数

c++ - glVertexAttribPointer() 的索引应该是连续的吗?