2015-11-15 32 views
3

我正在Three.js的城市場景中工作,到目前爲止,我只是在單個建築物上進行照明和陰影試驗。該建築物採用3DS Max建模,然後導出到OBJ,然後使用命令行中的Python轉換器進行轉換。有沒有辦法阻止自我陰影中的臉部接受光線?

您會注意到建築物的模型是單個對象,而我正在使用自我陰影。然而,坐在投影內的建築物的下部仍然被黃白色定向光照亮。我猜這是因爲它的照度是根據它面對光源的多少來計算的,沒有考慮它和光源之間可能存在的任何事物。

我一直在尋找一種方法來「糾正」這種現象,並使其更加真實,即網格會阻擋光照後面的光線,即使在光線之內。我需要進入着色器還是常規地圖?還是其他什麼東西?

此外,這個問題可能是重複的,但沒有給出代碼或例子,所以我不知道:Light penetrating through meshes。如果這是個問題,請提前抱歉。

的jsfiddle是在這裏:http://jsfiddle.net/mrfolkblues/u01jwg53/

代碼的相關部分:

var T = THREE, 
    stats, 
    container, 
    camera = new T.PerspectiveCamera(40, window.innerWidth/window.innerHeight, 0.1, 200), 
    scene = new T.Scene(), 
    renderer = new T.WebGLRenderer({ 
     antialias: true 
    }), 
    radius = 35, theta = 0, thetaDelta = 0, camtarget, 
    boundingbox, cube, plane, poly, polyMesh, sphere, line, 
    clock = new T.Clock(); 

    renderer.shadowMap.enabled = true; 
    renderer.shadowMap.type = THREE.PCFShadowMap; 

// construct 
(function(){ 

    container = document.createElement('div'); 
    document.body.appendChild(container); 

    // set up renderer 
    renderer.setClearColor(0xf0f0f0); 
    renderer.setSize(window.innerWidth, window.innerHeight); 
    container.appendChild(renderer.domElement); 

    var light = new T.DirectionalLight(0xfff3cb, 1.25); 
    light.position.set(60, 25, 40); 

    var light2 = new T.DirectionalLight(0x204fae, 1.25); 
    light2.position.set(-30, 40, 0); 

    light.castShadow = true; 
    light.shadowDarkness = 0.33; 
    light.shadowCameraTop = 20; 
    light.shadowCameraRight = 20; 
    light.shadowCameraBottom = -20; 
    light.shadowCameraLeft = -20; 
    light.shadowCameraNear = 0; 
    light.shadowCameraFar = 200; 
    light.shadowMapWidth = 2048; 
    light.shadowMapHeight = 2048; 
    light.shadowBias = 0.0002; 

    scene.add(light); 
    scene.add(light2); 

    var cube = createCube([0.5, 0.5, 0.5], [1.5, 10, 0]); 

    // position camera 
    camera.position.x = 0; 
    camera.position.y = 20; // move camera position up 
    camera.position.z = radius; // move camera out 
    camtarget = cube.position; 
    camera.lookAt(camtarget); 

    createPlane(); 

    var loader = new T.JSONLoader(); 
    var parsed = loader.parse(window.buildingModel); 

    var material = new T.MeshLambertMaterial({ 
     color: 0xffffff 
    }); 

    var object = new THREE.Mesh(parsed.geometry, material); 
    object.castShadow = true; 
    object.receiveShadow = true; 
    scene.add(object); 

    object.position.x = 30; 
    object.position.y = 0; 
    object.position.z = 15; 

    // add event listeners 
    window.addEventListener('resize', onWindowResize, false); 

    render(); 
    animate(); 
})(); 

回答

0

你想要做的是不是由three.js所或其他任何「類似」基於WebGL的圖書館在那裏解決了什麼。你想要的是通過Global Illumination方法解決的,它不在three.js的範圍之內。

0

在three.js所r.73,陰影使用的是近似實現的:在陰影區域僅通過您設置的一個因素黑暗:

light.shadowDarkness = 0.33; 

所以,如果你設置shadowDarkness 1,你的問題消失了。當然,它看起來不太好。

更新小提琴:http://jsfiddle.net/u01jwg53/1/

鼓勵知道,陰影將在three.js所的未來版本中改進。

three.js r.73

相關問題