生成一个向量

时间:2012-10-15 09:36:29

标签: c++ math

我的光线从(x0,y0,z0)开始,到屏幕上的一个像素结束。此外,我有一个A x B像素的屏幕。

如何在(i,j)像素处从起点到终点生成光线?

我知道公式,但我无法在c ++中实现它。谢谢你的帮助

1 个答案:

答案 0 :(得分:4)

您的信息不足。

你需要知道:

  1. 视点(即相机在哪一点上看)
  2. 视野
  3. 定义相机相对于世界坐标的方向的“向上”和“向右”矢量。
  4. 这是我自己的光线跟踪器中的一些相关代码:

    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);
    }