生成一个向量

generate a vector

本文关键字:一个 向量      更新时间:2023-10-16

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

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

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

您没有足够的信息。

您需要知道:

  1. 视点(即摄像机在看哪个点)
  2. 视野
  3. 定义相机相对于世界坐标的方向的"向上"和"向右"矢量。

以下是我自己的光线追踪器中的一些相关代码:

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