C++ Wierd光线跟踪伪影

C++ Wierd光线跟踪伪影,c++,qt,raytracing,raycasting,artifacts,C++,Qt,Raytracing,Raycasting,Artifacts,我正在尝试使用Qt创建一个光线跟踪器,但是我有一些非常奇怪的工件 在实现着色之前,我的场景中只有4个球体、3个三角形和2个有界平面。它们都如预期的那样出现,颜色也如预期的那样。然而,对于我的飞机,我会看到与背景颜色相同的点。这些点在我的观察位置会保持静止,所以如果我移动相机,这些点也会移动。然而,它们只影响平面和三角形,永远不会出现在球体上。 我实施的一项措施使问题变得更糟。点现在也出现在光源中的球体上,因此任何受漫反射影响的部分。 另外,我的一架纯蓝色飞机(RGB 0,0255)已经变成了黑色

我正在尝试使用Qt创建一个光线跟踪器,但是我有一些非常奇怪的工件

在实现着色之前,我的场景中只有4个球体、3个三角形和2个有界平面。它们都如预期的那样出现,颜色也如预期的那样。然而,对于我的飞机,我会看到与背景颜色相同的点。这些点在我的观察位置会保持静止,所以如果我移动相机,这些点也会移动。然而,它们只影响平面和三角形,永远不会出现在球体上。 我实施的一项措施使问题变得更糟。点现在也出现在光源中的球体上,因此任何受漫反射影响的部分。 另外,我的一架纯蓝色飞机(RGB 0,0255)已经变成了黑色。因为我有两个飞机,我换了颜色,蓝色的飞机又变黑了,所以这是颜色问题,而不是飞机问题

如果有人对问题可能是什么有任何建议,或者希望看到任何特定的代码,请告诉我

#包括“plane.h”
#包括“交叉点.h”
#包括
#包括
平面::平面(QVector3D底部左侧顶点、QVector3D顶部右侧顶点、QVector3D法线、QVector3D点、材质*材质)
{
minCoords_uuz.setX(qMin(bottomLeftVertex.x(),topRightVertex.x());
minCoords_uz.setY(qMin(bottomLeftVertex.y(),topRightVertex.y());
minCoords_uuz.setZ(qMin(bottomLeftVertex.z(),topRightVertex.z());
maxCoords_uz.setX(qMax(bottomLeftVertex.x(),topRightVertex.x());
maxCoords_u2;.setY(qMax(bottomLeftVertex.y(),topRightVertex.y());
maxCoords_uuz.setZ(qMax(bottomLeftVertex.z(),topRightVertex.z());
正常=正常;
normal.normalize();
点=点;
材料=材料;
}
平面::~Plane()
{
}
空心平面::相交(QVector3D光线原点、QVector3D光线方向、相交*结果)
{
if(normal_==QVector3D(0,0,0))//平面退化
{
cout maxCoords_uu.y()||
intersectPoint.z()maxCoords_uz())
{
返回;
}
//仅当最近的对象
如果(结果->距离>最小值)
{
结果->命中=真;
结果->相交点\=相交点;
结果->正常区间=正常区间;
结果->距离=分钟;
结果->材料=材料;
}

}
所以我解决了我的问题。这是因为浮点精度很差,任何对<0.0的检查都会由于浮点精度而间歇性失败。我必须在所有检查中添加一个偏移量,以便检查<0.001。

请显示一些代码。特别是对于平面。为平面和阴影添加了代码。