Cab*_*ibo 2 javascript webgl three.js
我目前正在开展一个项目,涉及在大小为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
}
}
Run Code Online (Sandbox Code Playgroud)
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 );
Run Code Online (Sandbox Code Playgroud)
我不认为这会是问题,但由于移动速度实际上从未等于零,因此可能是一个问题.即使移动速度为10 ^ -20或-30,闪烁仍然会发生.
如果重要的话,我也在55号.
bri*_*gan 11
听起来像精确问题.运动可以放大舍入误差的影响.在使用three.js中的太阳系模型(uom:米)时,我遇到了许多关于"闪烁"纹理/模型的问题.gaitat绝对正确,您遇到z缓冲区深度精度问题.我和我的伙伴有几种方法可以处理它.
z缓冲区不是线性的.gaitat提到的sjbaker网站将会像几个月前那样清楚地表达出来.大多数z缓冲区精度都在附近找到.如果您的对象的大小最多为1000000个单位,那么对象本身(更不用说它们之间的空间)已经超出了有效精度范围.许多很多视频游戏使用的一种解决方案是不移动播放器(相机),而是移动世界.这样,随着某些东西越来越靠近相机,它的精度也会提高.这对于远处大的重叠物体(闪烁/遮挡)上的纹理或远离轴向原点的小网格来说是最重要的,其中圆角问题变得严重到足以将网格跳出视野.然而,说起来容易做起来容易,因为你要么必须进行"及时"计算,以便根据玩家移动一切(并且仍然遭受舍入错误)或者提出更优雅的解决方案.
使用非常高的远距离数值,您将失去非常接近的精度,但是您将在中距离内获得相当大的精度,并且近似数字会略大.即使你正在使用的网格可以小到10个单位,近10或100的相机设置可能会让你有些松懈.相机设置不是处理z缓冲区的唯一方法.
polygonOffset - 您有效地告诉z-buffer哪个东西(网格上的材料)属于顶部.它可以引入尽可能多的问题,并且可以进行相当多的调整.考虑它类似于css中的z-index,但有点变幻无常.增加一个材质上的偏移以确保它在远处的某些东西上渲染,可以使其渲染在近处的某些东西上.它可以滚雪球,迫使你在大多数物体上设置偏移.对于polygonOffset,因子和单位数通常在-1.0和1.0之间,可能需要进行补充.
depthWrite = false - 这意味着"不要写入深度缓冲区",并且非常适合应始终在"后面"渲染所有内容的材质.很好的例子是天空盒和背景.
我们的项目使用了上述所有方法,并且仍然有平庸的结果,尽管我们处理的数字大到40个天文单位(米)(冥王星).
"他们"称之为"z战斗",所以要打好斗争!
由于您的范围这么大,那么您必须将相机近平面设置为接近 0,远平面设置为接近 1000000。但是 z 分辨率不够。您可以在http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html阅读更多相关信息。