C++ 生成向量

C++ 生成向量,c++,math,C++,Math,我有一条射线,从x0,y0,z0开始,在屏幕上的一个像素处结束。此外,我有一个x B像素的单屏幕 如何在I,j像素处从起点到终点生成光线 我知道这个公式,但是我不能用C++实现它。感谢您的帮助您没有足够的信息 你需要知道: 视点,即相机所看的是什么点 视野 定义相机相对于世界坐标的方向的向上和向右向量。 以下是我自己的光线跟踪器中的一些相关代码: camera::camera(const point3& _eye, const point3& _center) : eye

我有一条射线,从x0,y0,z0开始,在屏幕上的一个像素处结束。此外,我有一个x B像素的单屏幕

如何在I,j像素处从起点到终点生成光线


我知道这个公式,但是我不能用C++实现它。感谢您的帮助

您没有足够的信息

你需要知道:

视点,即相机所看的是什么点 视野 定义相机相对于世界坐标的方向的向上和向右向量。 以下是我自己的光线跟踪器中的一些相关代码:

camera::camera(const point3& _eye, const point3& _center) :
    eye(_eye), center(_center)
{
    up.set(0, 1, 0);
    recalc();

    fov(30);
    m_aspect = 4.0 / 3;
}

camera::camera(const point3& _eye, const point3& _center, const vector3& _up) :
    eye(_eye), center(_center), up(_up)
{
    recalc();

    fov(30);
    m_aspect = 4.0 / 3;
}

void camera::recalc()
{
    // renormalise the up vector
    up.normalise();

    // calculate unit view direction vector
    view = vector3(eye, center);
    view.normalise();

    // and the right hand view vector
    right.cross(view, up);
    right.normalise();

    // and re-base the up vector (may not be normalised)
    up.cross(right, view);
}

void camera::fov(double fovy)
{
    m_fovy = math::deg2rad(fovy) / 2.0;
    m_tanf = tan(m_fovy);
}

void camera::aspect(double aspect)
{
    m_aspect = aspect;
}

void camera::aspect(int x, int y)
{
    m_aspect = (double)x / y;
}

ray camera::cast_ray(double x, double y) const
{
    vector3 dir(view);  
    dir.add_scaled(right, m_tanf * m_aspect * x);
    dir.add_scaled(up, m_tanf * y);
    dir.normalise();

    return ray(eye, dir, 0, 1.0);
}

公式是什么?你在哪里失败了?您尝试了什么?如果您只是想要光线跟踪渲染,请使用现有的光线跟踪库,如povray。如果您是为了好玩而进行自己的实现,请更具体地说明您的问题。你有什么意见?输出解释输出是如何计算的,以及您遇到的问题是什么?现在您已经发布了一些示例代码,您需要向我们展示来自raytracer=@paddy Nice one的示例图像。那是面板光源吗?全局照明?@paddy这是随机蒙特卡罗渲染。非常昂贵的计算,但提供了梦幻般的漫反射照明和漫反射材质、焦散等。请参阅我早期Java版本中的这一部分-