2016-04-19 13 views
0

私は、固定された太陽と月と太陽を周回する移動する地球を含むjsfiddleを持っています。three.js r75 point間違った場所に暗い影があります

ここでは、2つのLights(AmbientおよびPoint)オブジェクトとサンプルオブジェクトのコードを示します。

 var light2 = new THREE.AmbientLight(0x444444);//... for lighting the Sun and other MeshBasicMaterial meshes. 
     scene.add(light2); 

     //... PointLight 
     // http://threejs.org/docs/#Reference/Lights/PointLight 
     var light3 = new THREE.PointLight(0xffffff, 10, 150000,1); 
     light3.castShadow = true; 
     light3.shadow.camera.near = 1; 
     light3.shadow.camera.far = 5000; 
     light3.shadow.camera.fov = 90; 
     // light3.shadowCameraVisible = true; 
     light3.shadow.bias = 0.001; 
     scene.add(light3);    

     // SPHERES 

     var sphereGeom = new THREE.SphereGeometry(40, 32, 16); 
var SunMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 }); 
     this.Sun01 = new THREE.Mesh(sphereGeom.clone(), SunMaterial); 
     Sun01.position.set(-500, 0, 220);   
     scene.add(Sun01); 
     //Sun01.castShadow = false; 
     //Sun01.receiveShadow = false; 

     light3.position.set(Sun01.position.x, Sun01.position.y , Sun01.position.z); 

var moonMaterial = new THREE.MeshPhongMaterial({ color: 0xaa00aa }); 
     var Moon02 = new THREE.Mesh(sphereGeom.clone(), moonMaterial);     
     Moon02.scale.set(0.5,0.5,0.5); 
     Moon02.position.set(-200, 0, 220); 
     scene.add(Moon02); 
     Moon02.castShadow = true; 
     Moon02.receiveShadow = false; 

2つの問題があります。

まず、離れた固定された月は、範囲内であっても、PointLightによって照らされません。

2番目に遠い月からの影は、地球が太陽よりも近くにあるにもかかわらず、太陽の軌道上に現れます。

内部の固定された月(Moon02、色のマゼンタ)は、PointLightによって照らされ、地球上に影を投じることに注意してください。

renderer = new THREE.WebGLRenderer(); 
       renderer.setClearColor(0x000022); 
       renderer.setPixelRatio(window.devicePixelRatio); 
       renderer.setSize(window.innerWidth, window.innerHeight); 

       //... Enable Shadows 
     renderer.shadowMap.enabled = true;//.shadowMapEnabled = true; 
     //renderer.shadowMap.type = THREE.BasicShadowMap;// 
       //renderer.shadowMap.type = THREE.PCFShadowMap 
      renderer.shadowMap.type = THREE.PCFSoftShadowMap; 

私の質問=(a)は、外側の衛星を照らすと、(b)は表示されません外衛星の影を確実にするために何をすべきか - :ここで

はレンダラのセットアップコードであります(地球に近い、地球に近い)惑星地球上で。

答えて

3

簡単に言えば、あまりにも遠くに配置することです。

点光源からの影の計算は非常に高価です。実際には、THREE.jsには機能が追加されましたa few months ago。私はまだドキュメントで何かを見つけることができませんが、シャドウがポイントライトからどれだけ遠くに計算されるかについては、ハードコーディングされた制限があるようです。

解決策は簡単です。オブジェクト間のスペースを減らします。 1ダースで十分であれば、オブジェクトが数千単位離れている必要があるという理由は全くありません。私はあなたの問題の両方を解決しましたjust by reducing all distances and scales by a factor of 10.私はPointLightの強度を微調整しました。

// color, intensity, falloff radius, falloff amount 
// if falloff radius is 0 then there is no falloff 
var light3 = new THREE.PointLight(0xffffff, 1, 0, 0); 
+0

はなく、私のアプリは芸術の作品ではありません「オブジェクトはダースで十分な時に互いに離れる千台をする必要がない理由は絶対にありません」 - それは、科学と人工距離単位を導入している望ましくありません。 「すべての距離とスケールを10分の1に減らす」というのは大きな問題です。私はなぜthree.jsが大きな距離で問題を起こすべきかを見ることができません。しかし、(うまくいけば一時的な)回避策のおかげで:-)。 – steveOw

+0

@steveOw距離は任意です。たとえあなたのアプリが科学的であっても、THREE.jsの中であなたが舞台裏で望むどのようなユニットであれ、それらを変換するのは簡単ではないので使用できます。それが実際の距離の精神モデルを維持するのに役立つならば、1000のようなすてきなクリーンナンバーで割って、何百万キロメートル(何でも)の代わりに何百万ものメートルで考える。 – jered

+0

また、通常はTHREE.jsには大きな距離の大きな問題はありませんが、ここで問題を起こすのはPointLightだけだと思います。投射された「光線」は距離の2乗として広がるので、あらゆる方向の光と影を投影するのは難しいので、遠くまでしか行けません。比較したDirectionalLightは広がらず、その光線は永遠に平行であり、計算がずっと簡単です。あなたが他のすべてを変えるのではなく微調整することができる、文書化されていない "スケールファクタ"のようなものがあるかもしれませんが、私はそれを知らないのです。 – jered

関連する問題