我正在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();
})();