我的光线从(x0,y0,z0)开始,到屏幕上的一个像素结束。此外,我有一个A x B像素的屏幕。
如何在(i,j)像素处从起点到终点生成光线?
我知道公式,但我无法在c ++中实现它。谢谢你的帮助
答案 0 :(得分: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);
}