Please, pay attention that now you are in public part of FAQ-Area. Register and find more FAQ-articles in Personal Cabinet.

FAQ#7001551: Изменение атрибута для хранения информации о цвете объекта в ядре C3D

Keywords: Created: 2024-02-27 16:06:06
Linked Articles: Changed: 2024-02-27 16:07:08

Problem:

В предыдущих версиях ядра C3D, для сохранения информации о цвете тела, а также дочерних топологических объектов (граней, ребер, вершин) сохранялась в атрибуте MbColor. В данном атрибуте возможно сохранение 4х компонентов цвета в модели RGBA. Однако, для визуализации объекта в 3D приложениях используется больше параметров и в случае отсутствия их, используются значения по умолчанию, что в некоторых случаях приводит к различию получаемых цветов при открытии модели в разных программах.

Для сохранения всех необходимых для визуализации данных был добавлен атрибут MbVisual, который содержит в себе подробную информацию о каждом компоненте визуализации:

  1. Цвет общего фона (ambient), в формате RED, GREEN, BLUE и коэффициент диффузного отражения в диапазоне 0.0 - 1.0 (0 - 255 в uint8);

  2. Цвет диффузного отражения (diffuse), в формате RED, GREEN, BLUE и коэффициент диффузного отражения в диапазоне 0.0 - 1.0 (0 - 255 в uint8);

  3. Цвет зеркального отражения (specular), в формате RED, GREEN, BLUE коэффициент зеркального отражения света в диапазоне 0.0 - 1.0 (0 - 255 в uint8);

  4. Цвет излучения (emission), в формате RED, GREEN, BLUE коэффициент излучения в диапазоне 0.0 - 1.0 (0 - 255 в uint8);

  5. Показатель степени в законе зеркального отражения (shininess) в диапазоне 0 - 128 (uint8);

  6. Коэффициент непрозрачности (коэффициент суммарного отражения - opacity) в диапазоне 0.0 - 1.0 (0 - 255 в uint8);

  7. Коэффициент зеркального отражения объектов в диапазоне 0.0 - 1.0 (0 - 255 в uint8).

 

Для хранения компонентов 1-4 используется тип MbRGBA, в котором в полях rgb хранится значение цвета, а в поле alpha – коэффициент использования.

 

В код ядра C3D были внесены следующие изменения по работе с цветом объекта:

  1. При задании цвета для тела (грани, ребра, вершины) методом MbAttributeContainer::SetColor( int iR, int iG, int iB ), получается атрибут MbVisual, если его нет, то создается. В компонент _diffuse записывается цвет RGB, в альфа канал записывается 255 (1.0, 100%).

  2. При получении цвета методом uint32 MbAttributeContainer::GetColor() const

    Получаем атрибут MbVisual, если его нет - возвращается цвет по умолчанию (MB_C3DCOLOR). Если атрибут есть, берем цвет из компонента _diffuse (RGB).

  3. При чтении файла, где есть только MbVisual (новая версия), все атрибуты цвета и коэффициенты смешивания используются как описано в спецификации MbVisual.

  4. При чтении файла предыдущих версий, где содержится только MbColor, создается новый атрибут MbVisual, в компонент _diffuse записывается цвет из MbColor, в альфа канал записывается 255 (1.0, 100%). Атрибут MbColor удаляется.

  5. При чтении файла предыдущих версий, содержащего MbColor и MbVisual, где в MbVisual в каждом компоненте (RGB) содержится коэффициент смешивания — предыдущий вариант использования атрибута MbVisual, а в MbColor сохранен основной цвет, выполняются следующие действия:

    1. Создается новый атрибут MbVisual. Во все компоненты (_ambient, _diffuse, _specularity и _emission) записывается основной цвет из прочитанного MbColor.

    2. В альфа канал каждого из компонентов записывается значение из прочитанного из файла MbVisual.

    3. Прочитанные атрибуты MbColor и MbVisual удаляются, остается только новый атрибут MbVisual.

  6. При сохранении файла C3D для старой версии, создается атрибут MbColor, в который записываем цвет из _diffuse нового атрибута MbVisual, далее создается еще один атрибут MbVisual, в который записываются коэффициенты из альфа каналов компонентов имеющегося атрибута MbVisual. Атрибут MbVisual, который был в модели (новый вариант) удаляется и записывается файл в старом формате.

  7. Класс MbColor — помечен как устаревший и не рекомендуется к использованию. Вместо него необходимо использовать атрибут MbVisual.

 


Solution: