3D PDF (формат PRC) Обход сжатой тесселированной сетки - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю над визуализацией / рендерингом 3D PDF PRC файлов.Формат файла PRC имеет свою собственную спецификацию .

Мне удалось визуализировать несжатые трехмерные тесселяционные данные (PRC_TYPE_TESS_3D), но у меня возникли некоторые проблемы с визуализацией сжатой трехмерной тесселяции (PRC_TYPE_TESS_3D_COMPRESSED).

Я не знаю, есть ли еще кто-нибудь тамработает с этим форматом файла, но видел некоторые старые посты на форуме, с которыми многие сталкивались, потому что спецификация неверна или отсутствуют некоторые детали ...

Вся история начинается с разбора данных, где Хаффмандекодирование необходимо для различных типов CompressedArrays (одно обсуждение здесь, на форуме Adobe ).Пост "doctorbjoern" от 2014.12.15.мне все еще не хватало некоторых деталей, но в конце я смог проанализировать и декодировать данные.

Сейчас я работаю над Mesh Traversal - единственное существующее обсуждение этого вопроса в Интернете находится здесь на Stackoverflowс 2016 года

В основном, что я смог сделать правильно, это только первый треугольник (с абсолютными значениями).Остальные определяются относительными значениями XYZ в зависимости от соседнего треугольника и вычисления локальных систем координат для каждого треугольника.

Мои проблемы и вопросы:

1.Записанный в файл левый / правый треугольник отличается для меня в большинстве случаев для реальных моделей (создание и экспорт простых моделей PRC из Solidworks).Спецификация гласит: «Характеристика влево / вправо для соседа определяется с помощью нормали треугольника» ... Порядок индексов отсутствует, поэтому я предполагаю, что для каждого первого тригона сначала нужно вычислить вектор нормали в соответствии с разделом 8.8.9.4.Mesh Normal Construction 'из спецификации.Это правильно?

2.Нахождение следующих треугольников относительно положения в большинстве случаев для меня некорректно.Это нелегко объяснить, поэтому давайте рассмотрим пример:

Сначала информация из спецификации КНР о том, как кодировать точки (обход сетки)

В моем случае модельявляется поверхностью панели, лежащей на панели векторов X и Z (модель, созданная также в Solidworks).Мировое происхождение O (0, 0, 0).Модели местного происхождения ОМ (-25, 0, -25);Единицы измерения в см.

Point_Array, исходящий из файла (X, Y, Z):

    [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), давайте перейдем кnext, второй треугольник (T1):

Ребро первого треугольника находится на V0 и V1, а массив статусов ребер говорит, что следующий треугольник будет правым соседом первого.Я еще не вычисляю векторы нормалей из спецификации, но как автор модели я знаю, что вектор нормалей равен (0, 1, 0) для всех из них.Таким образом, если смотреть в направлении нормальных векторов, должно быть правильно, что это правая сторона + 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, чтобы попасть в правильное положение ... в соответствии с чем?Я что-то упускаю или вычисляю что-то не так?

Вот так должна выглядеть модель (с моими рисунками, оригинальный скриншот из Adobe Acrobat с режимом рендеринга в каркасной области ):

enter image description here

3.Контрольные точки (point_reference_array) для реальных трехмерных моделей, таких как простой куб, также указывают своими индексами на плохие «уже обработанные» позиции, давая неправильные треугольники.Я уже сделал длинный пост, поэтому не хочу вдаваться в подробности с этим, но есть также (меньший) расчет после декодирования Хаффмана (псевдокод CompressedIndiceArray) для получения исходных индексов, но, похоже, он не работаетсогласно спецификациям.

Если в прошлом кто-то еще имел опыт работы с PDF 3D PRC, то была бы полезна помощь.

...