GlTF2 Длина блока аксессуаров

В настоящее время я пытаюсь экспортировать 3D-геометрию в GlTF и обнаружил ошибку, которую не понимаю. В файле, описывающем простой серый куб, я получил это в аксессоре нормалей:

[glTF Validator] Accessor element at index 2 is not of unit length: 0.
[glTF Validator] Accessor element at index 5 is not of unit length: 0.
[glTF Validator] Accessor element at index 8 is not of unit length: 0.
[glTF Validator] Accessor element at index 11 is not of unit length: 0.
[glTF Validator] Accessor element at index 14 is not of unit length: 0.
[glTF Validator] Accessor element at index 17 is not of unit length: 0.
[glTF Validator] Accessor element at index 20 is not of unit length: 0.
[glTF Validator] Accessor element at index 23 is not of unit length: 0.

Вот json:

{
  "accessors": [
    {
      "bufferView": 0,
      "byteOffset": 0,
      "componentType": 5123,
      "normalized": false,
      "count": 36,
      "type": "SCALAR",
      "name": "31546_indices"
    },
    {
      "bufferView": 1,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 8,
      "type": "VEC3",
      "max": [
        32.808,
        32.808,
        32.808
      ],
      "min": [
        0.0,
        0.0,
        0.0
      ],
      "name": "31546_vertices"
    },
    {
      "bufferView": 2,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 8,
      "type": "VEC3",
      "name": "31546_normals"
    },
    {
      "bufferView": 3,
      "byteOffset": 0,
      "componentType": 5126,
      "normalized": false,
      "count": 8,
      "type": "VEC3",
      "name": "31546_color"
    }
  ],
  "asset": {
    "version": "2.0"
  },
  "buffers": [
    {
      "uri": "31546.bin",
      "byteLength": 360,
      "name": "31546"
    }
  ],
  "bufferViews": [
    {
      "buffer": 0,
      "byteOffset": 0,
      "byteLength": 72,
      "name": "31546_indices"
    },
    {
      "buffer": 0,
      "byteOffset": 72,
      "byteLength": 96,
      "name": "31546_vertices"
    },
    {
      "buffer": 0,
      "byteOffset": 168,
      "byteLength": 96,
      "name": "31546_normals"
    },
    {
      "buffer": 0,
      "byteOffset": 264,
      "byteLength": 96,
      "name": "31546_color"
    }
  ],
  "meshes": [
    {
      "primitives": [
        {
          "attributes": {
            "POSITION": 1,
            "NORMAL": 2,
            "COLOR_0": 3
          },
          "indices": 0,
          "mode": 4
        }
      ],
      "name": "31546"
    }
  ],
  "nodes": [
    {
      "mesh": 0
    }
  ],
  "scene": 0,
  "scenes": [
    {
      "nodes": [
        0
      ],
      "name": "RNT_Viewport"
    }
  ]
}

Я не понимаю, что Валидатор говорит об аксессуарах выше 3, поскольку их всего 4 ... Чтобы получить это, я использовал плагин GlTF для визуального кода. Для онлайн-валидатора Khronos JSON выглядит правильно (https://github.khronos.org/glTF-Validator/), поэтому на данный момент я действительно не знаю, в чем моя ошибка ...

Заранее благодарю за понимание :)


person Youri GICQUEL    schedule 21.09.2018    source источник


Ответы (1)


Здесь он жалуется на двоичные данные в 31546.bin файле, на который ссылается ваш JSON. Если вы щелкнете по одному из сообщений в окне проблем с документом, оно должно сфокусировать курсор на рассматриваемом аксессоре (и я пойду на шаг и угадаю, что это будет аксессор с индексом 2 с именем 31546_normals, как это выглядит единственный, который следует нормализовать в этой модели).

Фактические значения индекса, сообщаемые в этих сообщениях, являются индексами данных, содержащихся в этом методе доступа. В VSCode, с правильным выбранным аксессором, нажмите ALT + d, чтобы декодировать двоичные данные в текстовый буфер, чтобы просмотреть их как текст.

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

Если вы редактируете эту модель в каком-либо другом инструменте, таком как Blender или Maya, у вас может быть возможность найти и удалить вырожденные треугольники и пересчитать векторы нормалей. Это может избавить вас от ваших нормалей нулевой длины.

person emackey    schedule 21.09.2018
comment
Большое спасибо, отличный ответ! :) - person Youri GICQUEL; 24.09.2018
comment
Для всех пользователей Blender, читающих это, это: Сетка - ›Очистить -› Вырожденное растворение. Просто пришлось поискать в этом одну из моих собственных моделей. - person emackey; 25.09.2018
comment
Ответ + наконечник блендера отлично решил мою проблему. - person RDK; 21.08.2019