这是一个Povray精确丢失神器吗?

我正在试验整个行星的程序地形生成.这意味着我倾向于从近距离渲染非常大的对象,因此我偶尔会遇到精确丢失问题.

我最新的地形生成器生成的图像如下所示.如您所见,某些多边形之间存在线条.

事实是,我有理由相信我的地形生成器正在输出正确的网格—手工观察显示三角形似乎是共享顶点,顶点:面比约为2:1,这是正确的.所以我看不出多边形是如何不能精确对接的.

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

(如果有人想看看地形生成器的源代码,这是在C中,它就在这里:https://code.google.com/p/flooded-moon/source/browse/terrainmaker/sphericalroam.h)

更新:这是一个展示问题的更好的图像.

相机现在在表面上方有0.002个世界单位.表面距离原点约1750个世界单位.我的规模是1世界单位到1公里;这意味着奇怪的伪像大约为厘米,或大约0.00001.这是大约10 ^ 8的差异.这对于舍入错误是否足够重要?

最佳答案 我尝试使用下面的POVRay代码重现您的风景的尺寸.这里,我示出了10cm(0.0001)宽度的表面元素,其具有变化的高度z =(i j)* 0.000001(即每步1mm).我希望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 

令我惊讶的是,这发生了:

在规则的时间间隔内,模式中有大的步骤,无法通过场景描述的简单数学来解释.当我改为Radius = 1.0;人工制品已经消失:

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

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

干杯,
马库斯

点赞