raytracing — C ++ Ray Tracing — плоскость всегда возвращает true для всего изображения

При попытке отобразить плоскость на моем изображении, все изображение затеняется фонгом. Я хотел бы просто увидеть самолет. Я передаю массив примитивов моей функции checkForIntersection. tmin первоначально установлен в 100, если пересечение найдено, это изменится. Если пересечение найдено и тмин меняется, я отбрасываю теневые лучи. Это отлично работает для моих сфер, но когда я пытаюсь реализовать плоскость, все изображение / фон становится затененным.

Почему весь фон затенен фонгом? Что-то не так с моей формулой пересечения плоскостей?

Когда строка tmin прокомментирована: http://imgur.com/k789DP4

Когда строка tmin не закомментирована: http://imgur.com/SbyxHEx

Не показывай мне мой самолет. Хотя, когда я установил плоскость, чтобы разрезать сферы пополам, он показывает разрез окружающим цветом.

// ********** Global Variables *********
RgbImage * myImage;
vec3 nEye(0.0,0.0,-5.0);
vec3 lightSource1(-2.0,-1.5,0.0);
vec3 lightSource2(0.0,-2.0,0.0);
float tmin=100.0;

struct Prim
{
vec3 origin;
double radius;
double underSquare;
vec3 ambient;
vec3 diffuse_albedo;
vec3 specular_albedo;
float specular_power;
vec3 light_intensity;
vec3 normal;
vec3 pt1;
vec3 pt2;
vec3 pt3;
};// *****************Check Intersection**************
Prim checkForIntersection(vec3 point, vec3 directionVector, Prim prims[4], bool printit){
Prim pickPrim;

float D = 0;
float denom = dot(prims[3].normal, directionVector);    //Is this the correct direction vector?
float numer = dot(prims[3].normal, nEye) + D;
//vec3 hitTemp;
//vec3 hitPoint;
if (denom!=0){
float t= -(numer) / denom;
//cout << t << endl;
if (t <= tmin && t>0.001 && t<6){
//tmin=t;
pickPrim = prims[3];
}
}
return pickPrim;
}// ***********************Calling Function**********************
Prim sphere1;
Prim sphere2;
Prim sphere3;
Prim pickPrim;
Ray shadowRay;
Ray shadowRay2;
tmin = 100;
vec3 pixelColor(0,0,1);

Prim squarePlane;
squarePlane.ambient=vec3(0.329412, 0.223529, 0.027451);
squarePlane.diffuse_albedo=vec3(0.780392, 0.568627, 0.113725);
squarePlane.specular_albedo = vec3(0.992157,0.941176,0.807843);
squarePlane.specular_power = 27.8974;
squarePlane.light_intensity = vec3(1,1,1);
squarePlane.normal = normalize(vec3(0,0,-0.1));

Prim prims[4] =     {   sphere1,
sphere2,
sphere3,
squarePlane
};

pickPrim = checkForIntersection(nEye, nVecDir, prims, false);  // last parameter is for print debugging

if (tmin != 100){ //if tmin has changed, we found and intersection, send shadow ray
vec3 hitTemp(nVecDir.x*tmin, nVecDir.y*tmin, nVecDir.z*tmin);
vec3 hitPoint = (nEye + hitTemp);
shadowRay.vecDir = (normalize(lightSource1 - (hitPoint)));
//shadowRay2.vecDir = (normalize(lightSource2 - (hitPoint)));
tmin = 100;  // Set tmin for a new ray trace.
Prim tminDummy = checkForIntersection(hitPoint, shadowRay.vecDir, prims, true);

if (tmin != 100){ //if tmin does not equal 100, we found an intersection, this point is in shadow, return ambient.
pixelColor = pickPrim.ambient;
return pixelColor;
}
else{
pickPrim.normal = hitPoint - pickPrim.origin;
pixelColor = implementPhong(pickPrim,nEye,hitPoint);
//pixelColor = vec3(0,1,0);
return pixelColor;
}
}
else{
return pixelColor;
}
}

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]