Please, pay attention that now you are in public part of FAQ-Area. Register and find more FAQ-articles in Personal Cabinet.
В предыдущих версиях ядра C3D, для сохранения информации о цвете тела, а также дочерних топологических объектов (граней, ребер, вершин) сохранялась в атрибуте MbColor. В данном атрибуте возможно сохранение 4х компонентов цвета в модели RGBA. Однако, для визуализации объекта в 3D приложениях используется больше параметров и в случае отсутствия их, используются значения по умолчанию, что в некоторых случаях приводит к различию получаемых цветов при открытии модели в разных программах.
Для сохранения всех необходимых для визуализации данных был добавлен атрибут MbVisual, который содержит в себе подробную информацию о каждом компоненте визуализации:
Цвет общего фона (ambient), в формате RED, GREEN, BLUE и коэффициент диффузного отражения в диапазоне 0.0 - 1.0 (0 - 255 в uint8);
Цвет диффузного отражения (diffuse), в формате RED, GREEN, BLUE и коэффициент диффузного отражения в диапазоне 0.0 - 1.0 (0 - 255 в uint8);
Цвет зеркального отражения (specular), в формате RED, GREEN, BLUE коэффициент зеркального отражения света в диапазоне 0.0 - 1.0 (0 - 255 в uint8);
Цвет излучения (emission), в формате RED, GREEN, BLUE коэффициент излучения в диапазоне 0.0 - 1.0 (0 - 255 в uint8);
Показатель степени в законе зеркального отражения (shininess) в диапазоне 0 - 128 (uint8);
Коэффициент непрозрачности (коэффициент суммарного отражения - opacity) в диапазоне 0.0 - 1.0 (0 - 255 в uint8);
Коэффициент зеркального отражения объектов в диапазоне 0.0 - 1.0 (0 - 255 в uint8).
Для хранения компонентов 1-4 используется тип MbRGBA, в котором в полях rgb хранится значение цвета, а в поле alpha – коэффициент использования.
В код ядра C3D были внесены следующие изменения по работе с цветом объекта:
При задании цвета для тела (грани, ребра, вершины) методом MbAttributeContainer::SetColor( int iR, int iG, int iB ), получается атрибут MbVisual, если его нет, то создается. В компонент _diffuse записывается цвет RGB, в альфа канал записывается 255 (1.0, 100%).
При получении цвета методом uint32 MbAttributeContainer::GetColor() const
Получаем атрибут MbVisual, если его нет - возвращается цвет по умолчанию (MB_C3DCOLOR). Если атрибут есть, берем цвет из компонента _diffuse (RGB).
При чтении файла, где есть только MbVisual (новая версия), все атрибуты цвета и коэффициенты смешивания используются как описано в спецификации MbVisual.
При чтении файла предыдущих версий, где содержится только MbColor, создается новый атрибут MbVisual, в компонент _diffuse записывается цвет из MbColor, в альфа канал записывается 255 (1.0, 100%). Атрибут MbColor удаляется.
При чтении файла предыдущих версий, содержащего MbColor и MbVisual, где в MbVisual в каждом компоненте (RGB) содержится коэффициент смешивания — предыдущий вариант использования атрибута MbVisual, а в MbColor сохранен основной цвет, выполняются следующие действия:
Создается новый атрибут MbVisual. Во все компоненты (_ambient, _diffuse, _specularity и _emission) записывается основной цвет из прочитанного MbColor.
В альфа канал каждого из компонентов записывается значение из прочитанного из файла MbVisual.
Прочитанные атрибуты MbColor и MbVisual удаляются, остается только новый атрибут MbVisual.
При сохранении файла C3D для старой версии, создается атрибут MbColor, в который записываем цвет из _diffuse нового атрибута MbVisual, далее создается еще один атрибут MbVisual, в который записываются коэффициенты из альфа каналов компонентов имеющегося атрибута MbVisual. Атрибут MbVisual, который был в модели (новый вариант) удаляется и записывается файл в старом формате.
Класс MbColor — помечен как устаревший и не рекомендуется к использованию. Вместо него необходимо использовать атрибут MbVisual.