3D PDF(PRC格式)压缩棋盘格网格遍历

时间:2019-02-19 15:26:00

标签: algorithm pdf 3d rendering tessellation

我正在致力于可视化/渲染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):

enter image description here

3。像简单立方体这样的真实3D模型的参考点(point_reference_array)也指向其索引指向错误的“已经受到威胁”的位置,从而给出不正确的三角形。我已经写了很长的文章,所以不想真的详细介绍它,但是在霍夫曼解码(CompressedIndiceArray的伪代码)后,为了得到原始索引,还有一个(较小的)计算,但是它似乎没有用根据规格。

如果过去仍然有任何使用过PDF 3D PRC的经验的人,将不胜感激。

0 个答案:

没有答案