2013-05-09 4 views
6

私はraytracerをC++で書いています。屈折に関するいくつかの問題がありました。私は球と地面を描画しており、球は屈折するはずです。しかし、それは球の中の球のように見えます。「外側」の球は正しく陰に見えますが、屈折しないように見えますが、「内側の」球はセルフシャドーのように見えます。以下のようなリンクがあります:http://imgur.com/QVGkeBTRaytracer Refraction Bug

ここに関連コードがあります。

//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); 

球が悪く見えていたら、私はベクトルを正規化することを思い出しました。以前は、全体の内部球体のようにしか見えませんでした。メインのレイトレース機能の中で、私は反射と同じように屈折を行い、代わりに屈折した光線を使用します。また、シャドウイングのように自画像をチェックするために、イプシロンで交差点と光線の入った点を修正しようとしました。

任意の助けいただければ幸い:)

+0

訂正後、正解をお願いしますか? ありがとう –

答えて

3

私はあなたの屈折式をチェックしていないが、これは間違っているになります。

//into air out of obj 
if(dot(ray,normal) < 0){ 
    n1 = ior; 
    n2 = 1.0f; 
    *cos = dot(ray,-normal); 
} 

入射光線の内積と、通常よりも小さい場合オブジェクトの外向きの通常の点を仮定すると(これはおそらく)、この場合はair -> insideに対応しているので、屈折率を交換する必要があります。今のように、私は1/iorの球をレンダリングしています。その屈折率は1よりも小さいので、エッジの内部全反射を観察しています。

Here is one of my implementations何かが欠落しているかどうかを調べることができます(より多くの機能がありますが、興味のある部分を特定して計算が一致することを確認できる必要があります)。私にはそれは大丈夫だと私は屈折率を固定することがそれをしなければならないと思います。

球の中心にある非決定性パターンは、間違いなく自己交差のように見えます。反射の場合は、反射光を交差した表面の外側にわずかに押し込み、屈折の場合、自己交差を避けるために、屈折線をわずかに内側に押してください。

+0

if/elseブロック内で値を変更しましたが、何らかの理由でそれらを1つから他のブロックに移動するとは思えませんでした!私の数学の知識はちょっとだったと思います。ありがとう、あなたは苦労の多くの時間から私を救った:) –

+0

@BhargavBあなたは大歓迎です!あなたのraytracerとの幸運、それは本当に面白い経験を書いています:) – Thomas

+0

@トーマス私は似たような質問があり、私はあなたが私に答えることができると思います。 http://stackoverflow.com/questions/19548384/refraction-vector-ray-tracing?noredirect=1#comment29006102_19548384 –