2013-04-09 4 views
1

Я работаю над проектом, где я хочу, чтобы модель .OBJ загружалась из OBJLoader.js, чтобы отбросить тень от прожектора. Свет будет отбрасывать тени от других обычных объектов, но .OBJ не будет бросать тени.Three.js OBJLoader .obj model not casting shadows

Возможный симптом проблемы заключается в следующем: Когда эти обычные объекты создаются при нажатии на пол, они вводятся в массив Objects [], что, в свою очередь, делает их доступными для добавления объектов поверх самих себя , В этот массив добавлена ​​также модель .OBJ, однако я не могу ее щелкнуть, чтобы добавить модели поверх нее; как будто ракастер не обнаруживает его.

Я включу весь код, так как проблема может быть где-то непредвиденной.

рабочая ссылка доступна HERE

http://www.powertrooper.com/3D/demos/issues/OBJShadows

Попробуйте щелкнуть на полу, чтобы увидеть, как другие объекты отбрасывают тени.

У кого-нибудь есть идеи? Mr.Doob? Вы там? :)

ps: Я понятия не имею, почему в моем браузере ссылка, которую я оставил, направлена ​​на вредоносный сайт под названием «4safe.in». Попробуйте скопировать и вставить ссылку, я думаю ...

На всякий случай - вот фрагмент кода, который включает в себя большую часть того, что может вызвать проблемы.

renderer.shadowMapEnabled = true;///////////////////////////////////////////// RENDERER /// <------------Renderer and lights set up to cast shadows 
    light.castShadow = true; 
    light.shadowDarkness = 1; 
    renderer.shadowMapSoft = true; 
    floor.receiveShadow = true; 

    var texture = new THREE.Texture(); 
    var loader = new THREE.ImageLoader(); 
    loader.addEventListener('load', function (event) { 

     texture.image = event.content; 
     texture.needsUpdate = true; 

    }); 
    loader.load('modeltest/ash_uvgrid01.jpg'); 

    // model 

    var loader = new THREE.OBJLoader(); 
    loader.addEventListener('load', function (event) { 

     var newModel = event.content; 

     newModel.traverse(function (child) { 

      if (child instanceof THREE.Mesh) { 

       child.material.map = texture; 

      } 

     }); 

     newModel.position.set (200,30,0); 
     newModel.castShadow = true;///////////////////////////// <------ This doesn't seem to be working. 
     scene.add(newModel); 
     objects.push(newModel);/////////////////////////////// <------ The other HINT: because of this, the raycaster SHOULD allow us to click the model and create a new block. But we can't. 


    }); 

    loader.load('modeltest/male02.obj'); 

ответ

10

Каждый ребенок сетку вашего объекта должен иметь castShadow набор для true.

newModel.traverse(function (child) { 

    if (child instanceof THREE.Mesh) { 

     child.material.map = texture; 
     child.castShadow = true; 

    } 

}); 

Чтобы получить raycaster.intersectObjects() для работы с объектом, вам необходимо установить рекурсивный флаг true.

var intersects = raycaster.intersectObjects(objects, true); 

Three.js R.57

+0

Большое спасибо! Это сработало отлично в первый раз после того, как я сидел прямо на экране. Очень признателен. (теперь мне просто нужно выяснить, что означают изменения!) –

Смежные вопросы