Я работаю над визуализацией / рендерингом 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 с режимом рендеринга в каркасной области ):
3.Контрольные точки (point_reference_array) для реальных трехмерных моделей, таких как простой куб, также указывают своими индексами на плохие «уже обработанные» позиции, давая неправильные треугольники.Я уже сделал длинный пост, поэтому не хочу вдаваться в подробности с этим, но есть также (меньший) расчет после декодирования Хаффмана (псевдокод CompressedIndiceArray) для получения исходных индексов, но, похоже, он не работаетсогласно спецификациям.
Если в прошлом кто-то еще имел опыт работы с PDF 3D PRC, то была бы полезна помощь.