2

私は、OBJLoader.js からロードされた .OBJ モデルがスポットライトから影を落とすことを許可したいプロジェクトに取り組んでいます。ライトは他の通常のオブジェクトから影を落としますが、.OBJ は影を落としないように見えます。

この問題の考えられる症状は次のとおりです。床をクリックしたときにこれらの通常のオブジェクトが作成されると、オブジェクトは配列 Objects[] に入力されます。これにより、オブジェクトがクリック可能になり、その上にオブジェクトが追加されます。.OBJ モデルもこの配列に追加されますが、クリックしてその上にモデルを追加することはできません。あたかもレイキャスターがそれを検出していないかのように。

問題は予期しない場所にある可能性があるため、すべてのコードを含めます。

作業リンクはこちらから入手できます

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

床をクリックして、他のオブジェクトがどのように影を落としているかを確認してください。

誰にもアイデアはありますか?ドゥーブさん?あなたはそこにいますか?:)

追伸: ブラウザに残したリンクが「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' );
4

1 に答える 1

13

オブジェクトの各子メッシュは に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

于 2013-04-09T19:46:08.310 に答える