gpt4 book ai didi

javascript - Three.js 对象 'shimmering' 远距离

转载 作者:行者123 更新时间:2023-12-04 01:33:30 27 4
gpt4 key购买 nike

我目前正在开展一个项目,该项目涉及在对象大小从 10 到 1000000 不等的场景中工作。我一直遇到一个问题,当我处于这些尺寸的大范围内时,物体开始“闪烁”这仅在物体相交时发生,然后随着相机远离物体而变得越来越“剧烈” .

我已在此处上传问题图片:http://imgur.com/SOeemng

虽然我不知道是什么原因造成的,但我对可能导致它的原因有一些可能的想法:

首先,是不是我工作的尺寸对于 three.js/webgl 来说太大了

我认为的第二种可能性是使用我制作的相机控件,如下所示:

    if(mouseIsDown == true){
if(this.movementSpeed < this.maxSpeed){
this.movementSpeed += this.acceleration
}else{
this.movementSpeed = this.maxSpeed
}

}else{
if(this.movementSpeed > this.minSpeed){
this.movementSpeed = this.movementSpeed/this.deceleration
}else{
this.movementSpeed = this.minSpeed
}

}

其中 this.minSpeed = 0,而 this.movementSpeed 用于像这样移动相机:

var actualSpeed = delta * this.movementSpeed;
this.object.translateZ( -actualSpeed * forwardOrAuto );
this.object.translateX( actualSpeed * sideSpeed );
this.object.translateY( actualSpeed * upSpeed );

我不认为这会是个问题,但由于移动速度实际上永远不会等于零,所以这可能是个问题。即使移动速度为 10^-20 或 -30,闪烁仍然会发生。

如果重要的话,我也在 r.55 上。

最佳答案

听起来像是精度问题。运动会放大舍入误差的影响。在 three.js 中处理太阳系模型(uom:米)时,我自己遇到了许多“闪烁”纹理/模型的问题。 gaitat 是绝对正确的,您遇到 z 缓冲区深度精度问题。我和我的合作伙伴有几种处理方法。

z 缓冲区不是线性的。 gaitat 提到的 sjbaker 的网站会像几个月前对我一样清楚地说明这一点。大多数 z-buffer 的精度都在附近。如果你的对象的尺寸达到 1000000 个单位,那么对象本身,更不用说它们之间的空间,已经超出了有效精度的范围。许多视频游戏使用的一种解决方案是移动玩家(摄像机),而是移动世界。这样,当某物离相机越来越近时,它的精度就会提高。这对于远处大型重叠对象上的纹理(闪烁/遮挡)或远离轴向原点的小网格最为重要,其中舍入问题变得严重到足以使网格跳出视野。不过,这绝对是说起来容易做起来难,因为您要么必须进行“及时”计算以相对于玩家移动所有内容(并且仍然会遇到舍入误差),要么想出一个更优雅的解决方案。

对于非常高的远距离数字,您将损失很少的近距离精度,但是您将在中距离范围内获得相当大的精度,并且近距离数字稍大。即使您使用的网格可以小到 10 个单位,近距离相机设置为 10 或 100 也可能会让您松懈。相机设置不是处理 z 缓冲区的唯一方法。

polygonOffset - 你有效地告诉 z-buffer 哪个东西(网格上的 Material )属于顶部。尽管它可以解决多少问题,但它可能会引入很多问题,并且可能需要进行相当多的调整。将其视为类似于 css 中的 z-index,但更易变。增加一种 Material 的偏移以确保它渲染在远处的物体上,可能会使它渲染在近处的物体上。它会滚雪球,迫使您在大多数对象上设置偏移量。 polygonOffset 的因子和单位数通常在 -1.0 和 1.0 之间,可能需要调整。

depthWrite=false - 这意味着“不要写入深度缓冲区”并且非常适合应该始终呈现在所有内容“后面”的 Material 。天空盒和背景就是很好的例子。

我们的项目使用了上述所有方法,但仍然取得了平庸的结果,尽管我们正在处理以米为单位的 40 个天文单位(冥王星)的数字。

“他们”称之为“z-fighting”,所以打好仗吧!

关于javascript - Three.js 对象 'shimmering' 远距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14761595/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com