我的基本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]的光线。
我当前的交叉方法是否正确?