【发布时间】:2016-08-18 13:45:26
【问题描述】:
我开始制作各种 3D 文件格式的查看器,而我之前拥有的那些格式并没有造成问题,直到我来到 PRC 文件(这是可以嵌入的受支持的 3D 格式之一) PDF)。我可以从 PDF 中提取所有数据并显示那些以无损方式编码的模型,但是当我尝试解码他们所谓的“高度压缩镶嵌”时,我遇到了一个我认为是精度问题的问题,但是我不太清楚如何解决它或在哪里寻找解决方案。
本质上它是一种有损格式,他们所做的是采用原始(基于浮点)顶点坐标,并使用公差值将这些坐标除以它并将结果四舍五入到最接近的整数。遍历网格对所有三角形进行编码时,仅存储第一个三角形的绝对值,其余三角形始终基于先前的相邻三角形并构建以共享边的中间为原点的局部坐标系,向量沿共享边是 x 轴,三角形法线是 z 轴。然后,y 轴只是它们的叉积的结果,并使用这 3 个局部轴存储新三角形第三点的坐标。
我的系统通常可以正常工作,对于三角形不多的简单模型,它也可以很好地工作,但是一旦模型变得更复杂,结果就会出错,而且似乎离最后一个绝对坐标越远,偏差越大。
在下面的示例图片中,您可以在左侧看到预期的结果(在 Adobe Reader 中呈现),在右侧看到我的结果。这个模型本质上有一个内部和一个我们的部分,在这种情况下,内部部分由一个绝对三角形和后面的相对三角形组成(而外部部分主要由绝对坐标组成,这就是为什么它在我看来是正确的),并且从内环到外环的遍历。在 Adobe 渲染中,您可以看到线条或多或少地径向向外指向,而在我的情况下,从大约第四个“圆圈”开始出现问题:
Expected result on the left, my result on the right
我目前被困在这个问题上,不太知道如何解决这个问题。我发现做一些小的改动(比如将 double 更改为 float 或反之亦然)会对结果产生巨大影响,很快就会使结果变得更糟。但基本上我遵循规范,它说对所有计算使用双精度浮点变量,并且还使用他们自己的计算平方根的实现(标准化轴所需)。例如,通过使用他们的 sqrt 函数而不是普通数学库中的函数,结果已经更好(没有它,我什至不会像上面显示的图片那样接近)。
但我想知道是否有某种我没有在这里掌握的数学方面?或者其他一些可能有帮助的想法?同样在该特定模型中,这些值似乎都足够大,因此它不应该是由于浮点格式缺乏精度而导致的数据丢失问题。规范中还有一些特殊情况,如果 y 轴或 z 轴太短(
仅供参考,这里是关于点编码的描述(但没有关于解码细节的更多信息):
info from the PRC spec on how to encode points
任何意见将不胜感激。如果需要,我可以提供更多数据、信息、示例、规范摘录等。
【问题讨论】:
-
问题与 PDF 无关。 PRC 内容作为独立的黑盒嵌入在 PDF 文件中,PDF 中没有影响 PRC 渲染的数据。 Acrobat 中的 3D 查看器可能使用了一些数学调整来正确呈现,但它们与 PDF 无关。
-
Ok 将删除标签(尽管 PDF 中实际上有一些数据会影响 PRC/U3D 的渲染,例如影响哪个视口、要使用的相机视角或可以执行以修改内容的脚本 - 但在这种情况下不相关)
标签: algorithm rendering precision