4

我正在试验整个行星的程序地形生成。这意味着我倾向于从非常近的地方渲染非常大的物体,因此我偶尔会遇到精度损失问题。

我最新的地形生成器正在生成如下所示的图像。如您所见,一些多边形之间有线条。

问题是,我有理由确定我的地形生成器正在输出正确的网格 --- 手观察显示三角形似乎共享顶点,并且顶点:面比率约为 2:1,这是正确的。所以我看不出多边形如何不能精确地相互对接。

这看起来可能是另一个精度损失问题吗?相机距地表约 0.1 个世界单位,距原点约 1750 个世界单位。这似乎不足以成为 Povray 的双精度浮点数的问题,但是......

(如果有人想查看 C++ 中的地形生成器的源代码,请访问:https ://code.google.com/p/flooded-moon/source/browse/terrainmaker/sphericalroam.h )

有问题的图像

更新:这是展示问题的更好图像。

相机现在在地表上方 0.002 个世界单位。表面距原点约 1750 个世界单位。我的比例是 1 个世界单位到一公里;这意味着奇怪的伪影在厘米的数量级,或大约 0.00001。这是大约 10^8 的差异。这足以使舍入误差变得重要吗?

另一个有问题的图像

4

1 回答 1

2

我试图用下面的 POVRay 代码重现你风景的尺寸。在这里,我展示了 10 厘米 (0.0001) 宽的表面元素,其高度变化为 z=(i+j)*0.000001(即每步 1 毫米)。我希望 2D 楼梯随着距离原点(0.0,0.0,1750.0)的距离逐渐上升。

/* 
  display a planet's surface with real dimensions
 */
#include "colors.inc"

// dimensions
#declare Radius = 1750.0;   // planet radius in km
#declare nEl    = 100;      // nEl x nEl will be produced
#declare sEl    = 0.0001;   // size of one surface element
//
#declare camX = 0.0;
#declare camY = 0.0;
#declare camZ = Radius + 0.003

camera {
location <camX,camY,camZ>
look_at  <camX+1,camY+1,camZ-1>
angle 50
sky <0,1,0>
up <0,9,0>
right <16,0,0>  // up,right -> 16:9 
}
light_source { <camX,camY,camZ>
              color White
              fade_distance 2.0
              fade_power 1
}
#macro SElement(Xoff,Yoff,Zoff) 
#local cbase=<0.9,0.1,0.1>; // base color
#local hcolr=rand(hh)*0.1;  // color variation
#local hcolg=rand(hh)*0.1;
#local hcolb=rand(hh)*0.1;
#local OneElement = box { <0,0,0>, <1,1,1> 
     texture {
        pigment { color cbase+<hcolr,hcolg,hcolb> }
     } 
}
object{ OneElement
      scale sEl
      translate <Xoff,Yoff,Zoff> }
#end // macro SElement

// create surface from surface elements of varying elevation Zoff 
#local i=0;
#local j=0;
#while (i<nEl)
  #while (j<nEl)
    #local Xoff = i*(sEl);
    #local Yoff = j*(sEl);
    #local Zoff = Radius + (i+j)*0.000001; 
    SElement(Xoff,Yoff,Zoff)
    #local j=j+1;
  #end
  #local j=0;
  #local i=i+1;
#end 

令我惊讶的是,这发生了: 镜头角度为 50 的场景

在固定的时间间隔内,模式中有很大的步骤无法用场景描述的简单数学来解释。当我更改为 Radius=1.0; 文物消失了: Radius=1.0 的相同场景

所以结论(以及您的问题的答案,而不是一般问题的答案)必须是:是的,POVRay 在添加大小数字时存在一些问题。也许有一个开关告诉 POVRay 使用双精度。我不知道。我猜,有些经验丰富的 POVRay 用户在阅读本文时只会微笑。

我希望这有帮助。无论如何,通过回答您的问题,我也学到了一些东西。

干杯,马库斯

于 2013-12-04T09:21:19.460 回答