Three.js 非常远的点光源不';渲染不好

Three.js 非常远的点光源不';渲染不好,three.js,aframe,Three.js,Aframe,如果我尝试使用一个球体和点光源放大工作场景,使对象之间的距离非常大(>1E5),那么渲染的光源是不正确的-当我在Oculus Quest或Google硬纸板上显示时,它看起来像一个微小的狭缝,随着虚拟现实视点的变化而在对象上移动。在桌面上的非VR web浏览器中,场景看起来是正确的 这显然是一个与距离、精度和a-sphere对象有关的问题,以及a-sphere对象与远距离灯光和摄影机的反应。但我需要的是一个变通办法。我试图在真实的尺度上模拟太阳系(至少是行星之间的距离)。为了使月球离观测者足够远

如果我尝试使用一个球体和点光源放大工作场景,使对象之间的距离非常大(>1E5),那么渲染的光源是不正确的-当我在Oculus Quest或Google硬纸板上显示时,它看起来像一个微小的狭缝,随着虚拟现实视点的变化而在对象上移动。在桌面上的非VR web浏览器中,场景看起来是正确的

这显然是一个与距离、精度和a-sphere对象有关的问题,以及a-sphere对象与远距离灯光和摄影机的反应。但我需要的是一个变通办法。我试图在真实的尺度上模拟太阳系(至少是行星之间的距离)。为了使月球离观测者足够远,在我移动时不会移动,我需要缩放它,使月球距离相机至少2000米。这使得太阳在800000米之外,这就是阳光的来源。因此,其他行星无法正确渲染。 如果我向下缩放,一切都会起作用,但当我站起来或走动时,月亮相对于其他物体移动

这里有我可以使用的解决方法吗?是否有一个公开的限制来解释系统的哪一部分是问题所在-它显然比框架更可能处于较低的级别,但我不确定它是three.js还是oculus上的webgl实现还是什么

<a-scene background="color:black;">
  <a-sphere id="mars" position="0 500E3 -2000E3" radius="40E3" color="#FFBBBB"></a-sphere>
  <a-entity id="sunlightnear" light="color: #00FF00; type: point;" position="0 0 -1000"></a-entity>
  <a-entity id="sunlightfar" light="color: #FF0000; type: point;" position="0 0 -1000E3"></a-entity>
  <a-entity id="mainCamera" camera="far:1E10;" position="0 1.6 0"  look-controls></a-entity>
</a-scene>


这将在不同的距离使用两个灯光。我希望火星球体被均匀地照亮。取而代之的是,第一道光线总是可见的绿色,但第二道光线的红色显示为一条带,当我移动眼睛时,带着奇怪的瑕疵在球体上移动。

不要使用点光源。如果光源非常远或非常大,最好使用

和相应的


我还建议使用小数字。易于使用,不会遇到精度或溢出问题。最好将注意力集中在正确的距离和大小比例上

我已经完全在three.js上重新创建了描述的场景,但我看不到您描述的行为。我对a-frame的具体工作方式不太熟悉,但问题似乎并不在于three.js实现。嗨,谢谢你这么做。我已经试着在oculus上运行你的版本,但是我必须用它来让它进入虚拟现实模式,这样我才能看到发生了什么。但我注意到,您使用的是lambert材质,这可能解释了这种差异,因为a-frame并没有提供现成的材质(尽管可以创建一个使用它的自定义着色器)。我将尝试一些实验,并汇报。这可能会对你有所帮助,我没有一个虚拟现实可以实验:(顺便说一句,我用不同的材料进行了测试,结果是一样的。用
Phong
更新了示例,只是为了说明。我自己试了一下。在oculus上,除了MeshPhysicalMaterial之外,它可以与任何东西一起工作,而MeshPhysicalMaterial是内置在框架中的唯一非平面选择。我可以找到一种使用Lambert或Phong材料的方法。)通过编写一些样板,我想。但如果知道这是物理材料中的一个缺陷还是一个必要的限制,那就太好了。我知道平行光和小数字可以解决渲染问题,但我不能在太阳系模拟中使用它们,因为太阳来自相对于每个行星的不同方向。同样,我如果我将所有对象缩放到更小的大小,它将正确渲染,直到我在周围环境中移动,此时较近的对象将被置换。