2012-10-16 55 views
0

我試圖在three.js中使用內置陰影貼圖插件。最初的困難後,我有或多或少的可接受的形象與最後一個小故障。那個影子出現在頂部的一些(所有?)表面上,正常的0,0,1。下面是同一個模型的圖片。出現在錯誤位置的陰影貼圖

three.js所 Three.js

Preview.app(蘋果機)

Preview.app

,並用於設置陰影代碼:

var shadowLight = new THREE.DirectionalLight(0xFFFFFF); 
    shadowLight.position.x = cx + dmax/2; 
    shadowLight.position.y = cy - dmax/2; 
    shadowLight.position.z = dmax*1.5; 
    shadowLight.lookAt(new THREE.Vector3(cx, cy, 0)); 
    shadowLight.target.position.set(cx, cy, 0); 
    shadowLight.castShadow = true; 
    shadowLight.onlyShadow = true; 
    shadowLight.shadowCameraNear = dmax; 
    shadowLight.shadowCameraFar  = dmax*2; 
    shadowLight.shadowCameraLeft = -dmax/2; 
    shadowLight.shadowCameraRight = dmax/2; 
    shadowLight.shadowCameraBottom = -dmax/2; 
    shadowLight.shadowCameraTop  = dmax/2; 
    shadowLight.shadowBias   = 0.005; 
    shadowLight.shadowDarkness  = 0.3; 
    shadowLight.shadowMapWidth  = 2048; 
    shadowLight.shadowMapHeight  = 2048; 
    // shadowLight.shadowCameraVisible = true; 
    scene.add(shadowLight); 

UPDATE:而一個活生生的例子了這裏:http://jsbin.com/okobum/1/edit

+0

你能提供一個現場(和簡單)的例子嗎? – WestLangley

+0

我剛做了一個小演示,儘管降低了陰影分辨率,因爲場景包含單個模型和一個用於比較的多維數據集。現在我該如何讓這看起來很漂亮? :) – skrat

回答

0

你的代碼看起來不錯。你只需要玩shadowLight.shadowBias參數。這總是有點棘手。 (請注意,偏置參數可以是負值。)

編輯:收緊你的陰影相機近和遠的飛機。這將有助於減少陰影痤瘡和平移。例如,您的實時鏈接設置爲shadowLight.shadowCameraNear = 3*dmax;。這對我有效。

您還可以嘗試向桌面添加深度,如果它尚未存在。

您可以嘗試設置renderer.shadowMapCullFrontFaces = false。這將剔除面部而不是前面的面部。

+0

這是不行的,痤瘡消失的絕對值較低,但隨後開始出現在較大的物體上。我認爲整個技術並不適合幾何尺寸變化很大的場景,比如當你有幾個非常細節的物體,有些很大很簡單時。你怎麼看? – skrat

+0

我認爲陰影映射工件必須根據具體情況進行處理。我不太確定你的假設。順便說一下,好的演示。 – WestLangley

+0

你能否考慮這個問題「回答」? – WestLangley