2016-02-01 57 views
0

我正尝试在太阳系的规模上创建与物体的场景。THREE.js:由远处光源投射的阴影

的我想要的是一些例子:

-When a small (on the order of 10m in diameter) object, crosses behind 
a large object (earth sized), which blocks the light source 
(THREE.DirectionalLight), the smaller object is shadowed by the larger 
object. 

-When a moon crosses between the light source and a planet, 
a shadow is cast on the planet. 

-All objects must cast, and receive shadows (except stars, which only cast). 

我知道我应该拍摄到“煎饼”我的影子相机尽可能,但我需要的规模可变的性质,这变得非常困难。

在如此可变的比例尺上创建阴影场景时,可以使用哪些技巧或技巧?

是否有某种对数深度缓冲区用于阴影(就像渲染一样)?

或者我能以某种方式利用相机/轨迹球控制事件来动态调整阴影相机的平截头体? (随着相机(场景)距离越来越远,请使用更粗糙的缓冲区/扩大阴影相机的平截头体)

请查看此JSfiddle以获取相关但不同的问题示例。这是两个小物体,靠近在一起,有一个非常遥远的光源。

http://jsfiddle.net/mtcq070x/6/

注意阴影是如何闪烁开启和关闭,并有阴影的球(这不应该有)的前面。

编辑:我改变了jsfiddle使用适当的偏见,球现在收到并投下阴影。注意阴影如何增加自我阴影的恶化。降低阴影黑暗不是一种选择,因为投射到飞机上的阴影消失了。

这里也正是我工作的样子(规模太阳能系统)

enter image description here

回答

1

您在的jsfiddle看到什么是什么的影子痤疮知道。这可以通过使用非零,小的正影子偏差值来解决。设置light.shadowBias = 0.01;似乎可以解决您的小提琴中的问题:http://jsfiddle.net/mtcq070x/4/。另见https://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx

+0

这有助于不接受阴影的东西,也可以铸造它们。我意识到小提琴并不完全符合我的想法,因为飞机前面的球体也必须得到阴影。这里是更新的小提琴,它接收并投射阴影:http://jsfiddle.net/mtcq070x/6/当它接受阴影时,我认为它是自我阴影。 – Boogiechillin

+0

@Boogiechillin我不太明白新的小提琴什么是错的。但编辑中的图片可能是由于阴影贴图相对于您的场景而言太大,所以您只能有效地使用阴影贴图中的几个像素。你需要使用较小的shadowleft值,等等(尽可能小到适合场景)。是的,这意味着您可能需要动态计算只能捕获您感兴趣的对象的阴影。 –

+0

jsfiddle的问题实际上与我的照片中出现的问题相同:球体正面有阴影。如果你在阴影中陷入阴影黑暗,前面的阴影消失了,但是球体投射到阴影上的阴影也消失了。我尽可能多地煎出平截体,仍然得到上面显示的内容。此外,将球体的材料切换为Phong(它是Lambert)似乎可以平滑前部阴影的锐利边缘。 – Boogiechillin