C++ 'da bir raytracer yazıyorum ve kırılmalarla ilgili bir sorun yaşıyorum. Bir küre ve bir yer düzlemi oluşturuyorum ve küre kırılmalı. Bununla birlikte, bir kürenin içindeki bir küreye daha çok benziyor: "dış" küre düzgün bir şekilde gölgelenmiş görünüyor, ancak kırılma değil, "iç" küre ise kendinden gölgelenmiş gibi görünüyor. İşte neye benzediğine dair bir bağlantı: http://imgur.com/QVGkeBT.Raytracer Refraksiyon Hata
İşte ilgili kod.
//inside main raytrace function
if(refraction > 0.0f){ //the surface is refractive
//calculate refraction vector
Ray refract(intersection,
objList[bestObj]->refractedRay(
ray.dir,intersection,&cos_theta,&R0));
//recurse
refrColor = raytrace(refract);
}
else{ //no refraction
refrColor = background;
}
//refractedRay(vec3,vec3,float*,float*)
//...initialize variables, do geometric transforms
//into air out of obj
if(dot(ray,normal) < 0){
n1 = ior;
n2 = 1.0f;
*cos = dot(ray,-normal);
}
//into obj out of air
else{
n1 = 1.0f;
n2 = ior;
*cos = dot(ray,normal);
normal = -normal;
}
//check value under sqrt
float n = n1/n2;
float disc = 1-(pow(n,2)*(1-pow(*cos,2)));
if(disc < 0){ //total internal reflection
return ray - 2*-(*cos)*normal; //reflection vector
}
return (n*ray)+(((n*(*cos))-sqrt(disc))*normal);
kötü bakmak için kullanılan küre, sonra ben vektörleri normalleştirmek için hatırladı ve bu gibi görünüyor. Daha önce, tüm boyunca sadece iç küreye benziyordu. Ana raytrace fonksiyonunun içinde, refraksiyonu yansıma ile aynı şekilde yapıyorum, bunun yerine sadece kırılan ışını kullanıyorum. Ayrıca, gölgede alabileceğiniz gibi kendi kendine kırılmayı kontrol etmek için epsilon ile kavşak ve ışın noktasını değiştirmeyi de denedim.
Herhangi bir yardım senin kırılma formülleri kontrol etmedim
Düzeltdikten sonra bunun için doğru cevabı koyabilir misiniz? Teşekkürler –