我正在致力于可视化/渲染3D PDF PRC文件格式。 PRC文件格式具有自己的specification。
我设法可视化未压缩的3D细分数据(PRC_TYPE_TESS_3D),但是在可视化压缩的3D细分(PRC_TYPE_TESS_3D_COMPRESSED)时遇到了一些问题。
我不知道还有没有人使用这种文件格式,但是看到一些旧的论坛帖子,很多人都在为此苦苦挣扎,因为规范不正确或缺少一些细节...
整个故事始于数据解析,其中霍夫曼解码对于不同类型的CompressedArrays是必需的(一个讨论here on Adobe forum)。从2014.12.15开始的“ doctorbjoern”帖子。仍然缺少一些细节,但是最后我能够解析和解码数据。
现在我正在进行网格遍历-互联网上关于此的唯一现有讨论是在Stackoverflow from 2016
上基本上,我能够正确执行的操作只是第一个三角形(具有绝对值)。其余的定义为相对XYZ值,具体取决于相邻的三角形并为每个三角形计算局部坐标系。
我的问题和疑问:
1。在大多数情况下,对于真实模型(从Solidworks创建和导出简单的PRC模型),写入文件的左/右三角形邻域对我而言是不同的。规范说:“左/右特性为 邻居是使用三角形法线确定的...。没有序号,因此我假设对于每个小三角,我必须首先根据规范中的'8.8.9.4网格法线构造'计算法线向量。对吧?
2。在大多数情况下,寻找下一个三角形的相对位置对我来说是不正确的。解释起来并不容易,所以举个例子:
First the info from the PRC spec on how to encode points (Mesh traversal)
在我的情况下,模型是位于X和Z向量的窗格上的窗格表面(模型也在Solidworks中创建)。世界原点O(0,0,0)。型号本地原点OM(-25,0,-25);单位为厘米。
来自文件(X,Y,Z)的Point_Array:
[0] -2500 int
[1] 0 int
[2] 2500 int
[3] 2500 int
[4] 0 int
[5] 5000 int
[6] 3750 int
[7] 0 int
[8] -2500 int
[9] 2500 int
[10] -5000 int
[11] 0 int
[12] -5303 int
[13] -5303 int
[14] 0 int
[15] 303 int
[16] -1213 int
[17] 0 int
[18] 2500 int
[19] -2500 int
[20] 0 int
[21] -559 int
[22] -1118 int
[23] 0 int
[24] 3536 int
[25] -5303 int
[26] 0 int
[27] 1250 int
[28] -2500 int
[29] 0 int
[30] 0 int
[31] -5000 int
[32] 0 int
edge_status_array(0-无邻居,1-有右邻居,2-有左邻居,3-有两个邻居):
[0] 1 int
[1] 3 int
[2] 2 int
[3] 2 int
[4] 1 int
[5] 1 int
[6] 2 int
[7] 0 int
位置乘以公差(0.01)。
在这种情况下,第一个三角形的第一个位置V0为(-25.00f,0.0f,25.00f)。 根据规范,第二位置V1为V0 + DV1,因此(0.0f,0.0f,75.0f)。 第三名V2 = DV2 +(V0 + V1)/ 2所以(25.0f,0.0f,25.0f)。
我们得到了第一个三角形(T0),放开下一个第二个三角形(T1):
第一个三角形的边缘在V0和V1上,边缘状态数组表示下一个三角形将是第一个三角形的右邻居。我尚未从规范中计算法向向量,但是作为该模型的作者,我知道所有法向向量均为(0,1,0)。因此,从法向矢量方向看,应该正确,因为它只有一个邻居:)是Right + ofc没有其他选择。
必须计算局部坐标系的位置在V0和V2的中间。 这是第一个问题-根据规格。 X轴应为V2-V0 / abs(V2-V0),Z轴为法线向量,Y轴仅为X和Z的叉积,因此:
X(1.0f, 0.0f, 0.0f)
Z(0.0f, 1.0f, 0.0f)
Y(0.0f, 0.0f, -1.0f)
O(0.0f, 0.0f, 25.0f) (mid point of V0 and V2)
V3表示point_array的第四个位置(25.0f,-50.0f,0.0f),然后在此坐标系中表示,但是在这里我到达了错误的位置(请参见图像上的红色V3)。
我应该反转X或Z向量以进入正确位置...根据什么?我是想念还是计算错了什么?
这是模型的外观(带有我的图纸,original screenshot from Adobe Acrobat with Wireframe rendering mode):
3。像简单立方体这样的真实3D模型的参考点(point_reference_array)也指向其索引指向错误的“已经受到威胁”的位置,从而给出不正确的三角形。我已经写了很长的文章,所以不想真的详细介绍它,但是在霍夫曼解码(CompressedIndiceArray的伪代码)后,为了得到原始索引,还有一个(较小的)计算,但是它似乎没有用根据规格。
如果过去仍然有任何使用过PDF 3D PRC的经验的人,将不胜感激。