【问题标题】:Reading lossy file format (PRC), resulting in precision problems读取有损文件格式 (PRC),导致精度问题
【发布时间】:2016-08-18 13:45:26
【问题描述】:

我开始制作各种 3D 文件格式的查看器,而我之前拥有的那些格式并没有造成问题,直到我来到 PRC 文件(这是可以嵌入的受支持的 3D 格式之一) PDF)。我可以从 PDF 中提取所有数据并显示那些以无损方式编码的模型,但是当我尝试解码他们所谓的“高度压缩镶嵌”时,我遇到了一个我认为是精度问题的问题,但是我不太清楚如何解决它或在哪里寻找解决方案。

本质上它是一种有损格式,他们所做的是采用原始(基于浮点)顶点坐标,并使用公差值将这些坐标除以它并将结果四舍五入到最接近的整数。遍历网格对所有三角形进行编码时,仅存储第一个三角形的绝对值,其余三角形始终基于先前的相邻三角形并构建以共享边的中间为原点的局部坐标系,向量沿共享边是 x 轴,三角形法线是 z 轴。然后,y 轴只是它们的叉积的结果,并使用这 3 个局部轴存储新三角形第三点的坐标。

我的系统通常可以正常工作,对于三角形不多的简单模型,它也可以很好地工作,但是一旦模型变得更复杂,结果就会出错,而且似乎离最后一个绝对坐标越远,偏差越大。

在下面的示例图片中,您可以在左侧看到预期的结果(在 Adob​​e Reader 中呈现),在右侧看到我的结果。这个模型本质上有一个内部和一个我们的部分,在这种情况下,内部部分由一个绝对三角形和后面的相对三角形组成(而外部部分主要由绝对坐标组成,这就是为什么它在我看来是正确的),并且从内环到外环的遍历。在 Adob​​e 渲染中,您可以看到线条或多或少地径向向外指向,而在我的情况下,从大约第四个“圆圈”开始出现问题:

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


【解决方案1】:

根据我之前使用 PRC 的经验,这看起来很像对象偏移(我认为它被称为原点偏移)应用在错误位置的问题。

由于每个新顶点都基于前一个顶点,使用基于最后一个三角形的局部坐标系来获取新三角形的第三个点,这种格式的错误似乎增长得非常非常快,并且作为有损格式也无济于事。在我最初的方法中,我尝试计算所有三角形,然后在最后应用偏移量以将其放入正确的位置,从而导致看起来与您的问题相似的问题。

只需更改它以将偏移量应用于“绝对顶点”(即那些未修改的读取,并且在开始新三角形时充当“锚点”),我就能够解决问题。

当然,作为中华人民共和国,还有很多其他的事情你可能需要解决,我不确定你是否已经解决了。官方 ISO 规范中的很多东西都是完全错误的,其他的没有提到(例如,当你应该重新计算法线而不是从文件中获取明确的法线时),像哈夫曼压缩这样的东西有错误等等。如果你能避免它,然后最好不要实施它;-)

【讨论】:

  • 啊,可能真的是这样...让我检查一下,稍后再回复您
  • 是的,事实证明这有帮助,还有一些其他的事情我需要弄清楚,但这个简单的小修复帮助了我。让我为自己没有意识到而感到难过
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2015-03-28
  • 2011-11-16
相关资源
最近更新 更多