2016-11-13 3 views
2

私の球体に適した照明モデルを得るにはいくつか問題があります。具体的には、球体の鏡面ハイライトを正しいものにすることはできません。これらの拡散球のために(私が理解したよう
Correct specular highlights球形レイトレーシング - 鏡面ハイライト

、照明モデル:
Wrong specular highlights

今、鏡面ハイライトはもう少しこれらのようになります。ここで私は球を光線追跡するとき、私は見ていますものです)次のようになります
Lighting model

C Rが球体の色である場合、C がambieありますリットル C光の塩基成分が、光の色である、nは球面上の交点に正常で、 Pが鏡面ハイライトの色がC lは、光の方向であり、e目/ Look From、rは、球の表面からの反射ベクトルであり、指数のpは、フォン定数/指数(光線がどれくらい強く/ゆるいか)を表します。この場合には、フォン用語のアイ成分は、および方向(1、0、0)であるから、カメラの外観は、であることを

public Color calculateIlluminationModel(Vector normal, Scene scene) 
{ 
    //c = cr * ca + cr * cl * max(0, n \dot l)) + cl * cp * max(0, e \dot r)^p 
    Vector lightSourceColor = getColorVector(scene.getLight().getLightColor()); //cl 
    Vector diffuseReflectanceColor = getColorVector(getMaterialColor()); //cr 
    Vector ambientColor = getColorVector(scene.getLight().getAmbientLightColor()); //ca 
    Vector specularHighlightColor = getColorVector(getSpecularHighlight()); //cp 
    Vector directionToLight = scene.getLight().getDirectionToLight(); //l 
    Vector reflectionVector = normal.multiply(2).multiply(normal.crossProduct(directionToLight)).subtract(directionToLight); //r = 2n(n \dot l) - l 

    Vector ambientTerm = diffuseReflectanceColor.multiply(ambientColor); 
    double angleBetweenLightAndNormal = directionToLight.dotProduct(normal); 
    Vector diffuseTerm = diffuseReflectanceColor.multiply(lightSourceColor).multiply(Math.max(0, angleBetweenLightAndNormal)); 
    Vector phongTerm = lightSourceColor.multiply(specularHighlightColor).multiply(Math.pow(Math.max(0, scene.getCameraSettings().getLookFrom().dotProduct(reflectionVector)), (double) getPhongConstant())); 
    return getVectorColor(ambientTerm.add(diffuseTerm).add(phongTerm)); 
} 

注:ここ

は私のプロセスであります光は(1,0,0)である。

私の鏡面ハイライトが光の方向に向かうのではなく、球の上にある理由はありますか?

私があなたを助けてくれるように重要な詳細を出してくれたら教えてください。

+0

はなぜ、あなたのカメラルックから常に(0、0、1)?現在描画しているピクセルに応じて異なるはずですか? –

+0

私の理解は、光線の目/起点は、光線の方向だけでは変わらないということでした。 –

答えて

1

問題は、この行を次のとおりです。代わりに光にノーマルと方向との内積を取るの

Vector reflectionVector = normal.multiply(2).multiply(normal.crossProduct(directionToLight)).subtract(directionToLight); //r = 2n(n \dot l) - l 

、あなたの代わりにあなたのベクトルを与えることになる、クロス生産をnormal.crossProduct(directionToLight)を取っていますあなたが望むものに垂直に、あなたが上に見ているエラーを与えます。だからではなく、

、あなたが持っている必要があり

Vector reflectionVector = normal.multiply(2).multiply(normal.dotProduct(directionToLight)).subtract(directionToLight); //r = 2n(n \dot l) - l 
1

反射率ベクトルは、表面法線と入射光線方向に基づいて計算する必要があります。

+0

それは物事をはるかに悪化させました。あなたはそれについて確かですか?私が見てきたことから、反射ベクトルは 'r = 2n(n \ dot l)-1'です。ここで' l'は光の方向です。 –

+0

ミラーについてのあなたの反射の形は、近くのライトの位置に依存しますか? –

+1

私はいくつかのことを周りに変えました。それはいくつかの問題を修正したようです。しかし、根本的な根本的な問題は、私がドットプロダクトを取ることを意味するときに私がクロスプロダクトを取っていたことでした。 –

関連する問題