THREE.js:遥远光源投射的阴影

时间:2016-02-01 20:23:29

标签: javascript 3d three.js webgl

我正在尝试用太阳系规模的物体创建一个场景。

我想要的一些例子是:

-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 个答案:

答案 0 :(得分: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