C ++ RayTracer:平面在+ y和-y坐标处创建两个交叉点

时间:2014-12-11 13:00:19

标签: c++ raytracing

我的基本Ray Tracer已启动并运行多个对象,颜色和阴影。

在实现平面时,我在平面上定义了一个点,并在表面上定义了法线。除了输出之外,所有输出似乎都很好:

如果我定义一个点的平面为(0,-10,0),当我创建一个超过-10和10的y坐标的形状时(例如,想象一个带有中心的球体(0,0) ,0)和半径15)我得到一个交点,球体在y的+10和y的-10都截止。

我会发布一张图片,但我没有足够的声誉:/我可以根据要求进行上传和链接。

现在我希望-y中的交点是定义平面的位置,但为什么它也在上面交叉?

交叉口检查代码是:

bool Plane::intersect(Ray ray){
double test = (ray.GetUnit().DotProduct(this->_NormalUnitVector));
if (test < 0)
    return true;
else if (test == 0 && (ray.GetPoint().GetVar()[2]) == this->_PointOnPlane.GetVar()[2])
    return true;
else
    return false;}

/*ray.GetPoint() returns point on ray.
ray.GetUnit() returns unit vector of ray direction.
GetVar functions returns array of {x,y,z} coords of a 3d vector. (so getVar()[2] returns z coord).*/

并且传递给此函数的对象是:

for (int p = 0; p < (int)_planelist.size(); p++){
            bool intersect_plane = _planelist[p].intersect(_viewplane.GetPixelRay(_camera, i, j));
            if (intersect_plane == true){
                Ray reflected = _planelist[p].reflected(_viewplane.GetPixelRay(_camera, i, j));
                _raylist.push_back(reflected);
                _indexlist.push_back(p);
                _objecttype.push_back(0);
            }
        }

其中_planelist是一个平面对象列表,'_viewplane.GetPixelRay(_camera,i,j)'返回穿过每个像素[i,j]的光线。

我当前的交叉方法是否正确?

0 个答案:

没有答案