Тени не отбрасываются прямо на импортированный OBJ

Я пытаюсь заставить этот объект отбрасывать тень. Но по краям странные тени. Я думаю, что объект отбрасывает тень на другой компонент «себя».

введите здесь описание изображения

Есть ли способ удалить это?

Вот скрипка: http://jsfiddle.net/paulocoelho/qMqH7/3/

Вот обязательный код, но просто проверьте скрипку.

var container, stats;
var camera, scene, renderer;
var cube, plane;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;

init();

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

    camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, .1, 10000 );
    camera.position.x=50;
    camera.position.y=50;
    camera.position.z=50;
    camera.lookAt(new THREE.Vector3(0,0,0));
    scene = new THREE.Scene();

    renderer = new THREE.WebGLRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight );
    renderer.shadowMapEnabled = true;
    renderer.shadowMapSoft = true;
    container.appendChild( renderer.domElement );

    //var ambientLight = new THREE.AmbientLight(0x000000);
    //scene.add(ambientLight);

    light = new THREE.SpotLight();
    light.position.set(337,400,313);
    light.castShadow = true;
    light.shadowMapWidth = 3000;
    light.shadowMapHeight = 3000;
    // light.shadowCameraVisible = true;
    scene.add(light);

    var geometry = new THREE.PlaneGeometry( 200, 200, 30, 30 );
    geometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );
    geometry.applyMatrix( new THREE.Matrix4().setPosition( new THREE.Vector3(0,0,0) ) );
    var material = new THREE.MeshLambertMaterial( { color: 0xEEEEEE } );
    plane = new THREE.Mesh( geometry, material );
    plane.receiveShadow = true;
    scene.add( plane );

    var loader = new THREE.OBJMTLLoader();
    loader.addEventListener("load", function (event) {
        cube = event.content;
        for(k in cube.children){
            cube.children[k].castShadow = true;
            cube.children[k].receiveShadow = true;
        }
        scene.add(cube);
        animate();
    }); 
    loader.load ("https://dl.dropboxusercontent.com/u/4334059/VM.obj", "https://dl.dropboxusercontent.com/u/4334059/VM.mtl");
}

function animate() {
    requestAnimationFrame( animate );
    render();
}

function render() {
    cube.rotation.y += 0.01;
    renderer.render( scene, camera );
}

person PCoelho    schedule 12.07.2013    source источник


Ответы (1)


Вам необходимо установить все параметры light в разумные значения. Погуглите каждый из них, если не понимаете, для чего они нужны.

light = new THREE.SpotLight( 0xffffff );
light.position.set( 200, 200, -200 );
light.castShadow = true;
light.shadowMapWidth = 1024;    // power of 2
light.shadowMapHeight = 1024;

light.shadowCameraNear = 200;   // keep near and far planes as tight as possible
light.shadowCameraFar = 500;    // shadows not cast past the far plane
light.shadowCameraFov = 20;
light.shadowBias = -0.00022;    // a parameter you can tweak if there are artifacts
light.shadowDarkness = 0.5;

light.shadowCameraVisible = true;
scene.add( light );

Держите свою теневую камеру как можно плотнее.

Кроме того, при настройке теневой камеры обязательно используйте OrbitControls или что-то подобное, чтобы вы могли отодвинуть камеру и посмотреть, что вы делаете.

P.S. Ваша камера рядом с самолетом была 0.1, а дальний самолет был 10000. Нехорошо. Держите ближнюю плоскость не ниже 1. Небольшие значения ближней плоскости могут привести к проблемам с точностью сортировки по глубине.

Скрипт: http://jsfiddle.net/qMqH7/4/

три.js р.58

person WestLangley    schedule 12.07.2013
comment
На самом деле мне нужен сам объект, чтобы отбрасывать тени. Не себе, а другим соседним элементам, которые есть у меня в реальной сцене. Но, видимо, возня с shadowCameraFar решает проблему для меня. И спасибо за подсказку Орбиты, это хорошо, я этого не знал. :) - person PCoelho; 12.07.2013