Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Рис. 17. Блок-схема алгоритма работы программы-plugin’a

3.4. Тестирование программ

Для того, чтобы можно было произвести тестирование программ, требуется скопировать файл «GpuRayTracerMayaPlugin. mll» (динамическая библиотека с программой-модулем) в папку «Maya2008\bin\plug-ins\», а также файлы, требуемые для работы визуализатора (GpuRayTracer. exe, cuda. dll, cudart. dll, glew32.dll) туда же.

На рисунке 18 показан пользовательский интерфейс программы Maya. Используя верхнюю панель при выбранной вкладке «Polygons» можно строить из полигональных примитивов модели, которые будут экспортироваться. (возможно также использование неполигональных примитивов, при условии их последующей конвертации в полигональные). Чтобы наложить на модель материал нужно выбрать ее во вкладке «Rendering» нажать на «Phong Material».

В панели «Atribute Editor» (справа) при выбранном материале возможно задавать цвет объектов, который настраивается в отдельном специальном окне «Color Chooser», где можно указать на раскрашенном градиентном кубе требуемый цвет, либо задать параметры цветовой модели RGB или CMYK вручную. Также в «Atrribute Editor» возможно задавать прозрачность объекта (Common Material Attributes -> Transparency), коэффициент отражения (Specular Shading -> Reflectivity) и коэффициент преломления (Raytrace Options -> Refractive Index) при установленном флажке «Refractions». Максимальное значение для всех коэффициентов – единица.

Во вкладке «Rendering» можно выбрать любой источник света (однако экспортироваться он будет как точечный) и он будет помещен на сцену. Интенсивность источника можно менять в «Attribute Editor».

НЕ нашли? Не то? Что вы ищете?

Камеру можно установить также с помощью вкладки «Rendering», а активная камера (с помощью которой проходит визуализация) настраивается при нажатии на иконку «Render Settings» (далее Renderable Cameras).

После настройки сцены, требуется набрать в коммандной строке (снизу) команду «GPURTExport» и сцена будет экспортирована в папку, о которой шла речь в начале этой главы. После этого можно запустить визуализатор и тогда произойдет визуализация сцены, результатом которой станет картинка: проекция трехмерного изображения на виртуальную камеру (см. рис. 19).

Рис. 18. Вид пользовательского интерфейса трехмерного редактора

Рис. 19. Результат работы программы

4. Охрана труда

4.1. Исследование возможных опасных и вредных факторов при эксплуатации ЭВМ и их влияния на пользователей

4.1.1. Введение

В процессе использования ПЭВМ здоровью, а иногда и жизни оператора угрожают различные вредные факторы, связанные с работой на персональном компьютере. Типичными ощущениями, которые испытывают к концу дня люди, работающие за компьютером, являются: головная боль, резь в глазах, тянущие боли в мышцах шеи, рук и спины, зуд кожи на лице и т. п. Испытываемые каждый день, они могут привести к мигреням, частичной потере зрения, сколиозу, тремору, кожным воспалениям и другим нежелательным явлениям.

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

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

Любой производственный процесс, в том числе и работа с вычислительной техникой, сопряжен с появлением опасных и вредных факторов.

Опасным называется фактор, воздействие которого на человека вызывает травму, то есть внезапное повреждение организма в результате воздействия внешних факторов.

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

Типовая конфигурация компьютеризированного рабочего места:

·  ПК на основе процессора Intel Pentium III c необходимым набором устройств ввода-вывода и хранения информации (ZIP-drive, CDRW, Floppy 3.5”);

·  лазерный принтер QMS Print System 2060 (A3);

·  цветной XGA монитор Sony 19” (TCO 99) на базе ЭЛТ Trinitron:

·  разрешение по горизонтали (maxпикселей;

·  разрешение по вертикали (maxпикселей;

·  легко регулируемые контрастность и яркость;

·  частота кадровой развертки при максимальном разрешении - 90 Гц;

частота строчной развертки при максимальном разрешении - 42 кГц;

Рассмотрим какие могут быть вредные факторы при эксплуатации указанных элементов ВТ. Питание ПЭВМ производится от сети 220В. Так как безопасным для человека напряжением является напряжение 40В, то при работе на ПЭВМ опасным фактором является поражение электрическим током.

В дисплее ПЭВМ высоковольтный блок строчной развертки и выходного строчного трансформатора вырабатывает высокое напряжение до 25кВ для второго анода электронно - лучевой трубки. А при напряжении от 5 до 300 кВ возникает рентгеновское излучение различной жесткости, которое является вредным фактором при работе с ПЭВМ (прикВ возникает мягкое рентгеновское излучение).

Изображение на ЭЛТ создается благодаря кадрово-частотной развертке с частотой:

·  85 Гц (кадровая развертка);

·  42 кГц (строчная развертка).

Следовательно, пользователь попадает в зону электромагнитного излучения низкой частоты, которое является вредным фактором.

Во время работы компьютера дисплей создает ультрафиолетовое излучение, при повышении плотности которого > 10 Вт/м2, оно становиться для человека вредным фактором. Его воздействие особенно сказывается при длительной работе с компьютером.

Любые электронно-лучевые устройства, в том числе и электронно-вычислительные машины во время работы компьютера вследствие явления статического электричества происходит электризация пыли и мелких частиц, которые притягивается к экрану. Собравшаяся на экране электризованная пыль ухудшает видимость, а при повышении подвижности воздуха, попадает на лицо и в легкие человека, вызывает заболевания кожи и дыхательных путей.

4.1.2. Выводы

При эксплуатации перечисленных элементов вычислительной техники могут возникнуть следующие опасные и вредные факторы:

·  Поражение электрическим током.

·  Электромагнитное излучение.

·  Ультрафиолетовое излучение.

·  Статическое электричество.

4.2. Анализ влияния опасных и вредных факторов на пользователя

4.2.1. Влияние электрического тока

Электрический ток, воздействуя на человека, приводит к травмам:

Проходя через тело человека, электрический ток оказывает следующие воздействия:

·  Термическое — нагрев тканей и биологической среды

·  Электролитическое — разложение крови и плазмы

·  Биологическое — способность тока возбуждать и раздражать живые ткани организма

·  Механическое — возникает опасность механического травмирования в результате судорожного сокращения мышц

·  Тяжесть поражения электрическим током зависит от:

·  Величины тока.

·  Времени протекания.

·  Пути протекания.

·  Рода и частоты тока.

·  Сопротивления человека.

·  Окружающей среды.

·  Состояния человека.

·  Пола и возраста человека. Последствия влияния электрического тока на организм человека представлены на рис Рисунок 20. Последствия влияния электрического тока на организм человека

Рисунок 20. Последствия влияния электрического тока на организм человека

T - длительность воздействия в милисекундах (ms)

I - величина тока в милиамперах (mA).

Общие травмы:

·  Судорожное сокращение мышц, без потери сознания

·  Судорожное сокращение мышц, с потерей сознания

·  Потеря сознания с нарушением работы органов дыхания и кровообращения

·  Состояние клинической смерти

·  Местные травмы:

·  Электрические ожоги

·  Электрический знак

·  Электроавтольмия

Наиболее опасным переменным током является токГц. Так как компьютер питается от сети переменного тока частотой 50Гц, то этот ток является опасным для человека.

4.2.2. Влияние электромагнитных излучений НЧ

Электромагнитные поля с частотой 60Гц и выше могут инициировать изменения в клетках животных (вплоть до нарушения синтеза ДНК). В отличие от рентгеновского излучения, электромагнитные волны обладают необычным свойством: опасность их воздействия при снижении интенсивности не уменьшается, мало того, некоторые поля действуют на клетки тела только при малых интенсивностях или на конкретных частотах. Оказывается переменное электромагнитное поле, совершающее колебания с частотой порядка 60Гц, вовлекает в аналогичные колебания молекулы любого типа, независимо от того, находятся они в мозге человека или в его теле. Результатом этого является изменение активности ферментов и клеточного иммунитета, причем сходные процессы наблюдаются в организмах при возникновении опухолей. [31]

Влияние ультрафиолетового излучения

Ультрафиолетовое излучение ‑ электромагнитное излучение в области, которая примыкает к коротким волнам и лежит в диапазоне длин волн ~ нм. [36]

·  Различают следующие спектральные области:

·  нм ‑ бактерицидная область спектра.

·  нм ‑ Зрительная область спектра (самая вредная).

·  нм ‑ Оздоровительная область спектра.

При длительном воздействии и больших дозах могут быть следующие последствия:

·  Серьезные повреждения глаз (катаракта).

·  Меломанный рак кожи.

·  Кожно-биологический эффект (гибель клеток, мутация, канцерогенные накопления).

·  Фототоксичные реакции.

4.2.3. Влияние статического электричества

Результаты медицинских исследований показывают, что электризованная пыль может вызвать воспаление кожи, привести к появлению угрей и даже испортить контактные линзы. Кожные заболевания лица связаны с тем, что наэлектризованный экран дисплея притягивает частицы из взвешенной в воздухе пыли, так, что вблизи него «качество» воздуха ухудшается и оператор вынужден работать в более запыленной атмосфере. Таким же воздухом он и дышит.

Особенно стабильно электростатический эффект наблюдается у компьютеров, которые находятся в помещении с полами, покрытыми синтетическими коврами.

При повышении напряженности поля Е>15 кВ/м, статическое электричество может вывести из строя компьютер.

4.2.4. Выводы

Из анализа воздействий опасных и вредных факторов на организм человека следует необходимость защиты от них.

4.3. Методы и средства защиты пользователей от воздействия на них опасных и вредных факторов

4.3.1. Методы и средства защиты от поражения электрическим током

Техническим средством защиты от поражения электрическим током является зануление. Защитное зануление - преднамеренное соединение нетоковедущих частей с нулевым защитным проводником (см. на рис. Рисунок 2).

Рисунок 2. Защитное зануление

НЗП - нулевой защитный проводник

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

Принцип защиты пользователей при занулении заключается в отключении сети за счет тока короткого замыкания, который вызывает отключение ПЭВМ от сети.

По заданным параметрам определим возможный Jк. з.

(формула 1), где:

Jк. з. - ток короткого замыкания [А];

Uф - фазовое напряжение [B];

rm - сопротивление катушек трансформатора [Ом];

rнзп - сопротивление нулевого защитного проводника [Ом].

Uф = 220 В

Ом

(формула 2), где:

- удельное сопротивление материала проводника [Ом*м];

l - длина проводника [м];

s – площадь поперечного сечения проводника [мм2].

По величине определим с каким необходимо включить в цепь питания ПЭВМ автомат.

рмедь= 0,0175 Ом*м

* =400 м ; =150 м ; =50 м

; 9,1 (Ом)

(А)

, где:

K – качество автомата.

4.3.1.1. Вывод.

Для отключения ПЭВМ от сети в случае короткого замыкания или других неисправностей в цепь питания ПЭВМ необходимо ставить автомат с Jном = 8 А.

4.3.1.2. Общие рекомендации при работе с вычислительной техникой

Для защиты от вредных факторов имеющих место при эксплуатации ЭВМ необходимо придерживаться следующих рекомендаций:

§  правильно организовывать рабочие места;

правильно организовать рабочее время оператора, соблюдая ограничения при работе с вычислительной техникой.

4.3.1.3. Требования к помещениям и организации рабочих мест

Особые требования к помещениям, в которых эксплуатируются компьютеры:

§  Не допускается расположение рабочих мест в подвальных помещениях.

§  Площадь на одно рабочее место должна быть не меньше 6 м2, а объем - не менее 20м3.

Для повышения влажности воздуха в помещениях с компьютерами следует применять увлажнители воздуха, ежедневно заправляемые дистиллированной или прокипяченной питьевой водой. Перед началом и после каждого часа работы помещения должны быть проветрены.

Рекомендуемый микроклимат в помещениях при работе с ПЭВМ:

§  температура 19- 21°С;

§  относительная влажность воздуха 55-62%.

В помещениях, где размещены шумные агрегаты вычислительных машин (матричные принтеры и тому подобное), уровень шума не должен превышать 75дБА, в обычных же помещениях, где стоят персональные машины, допускается максимум 65 дБА.

Помещения должны иметь естественное и искусственное освещение. Желательна ориентация оконных проемов на север или северо-восток. Оконные проемы должны иметь регулируемые жалюзи или занавеси, позволяющие полностью закрывать оконные проемы. Занавеси следует выбирать одноцветные, гармонирующие с цветом стен, выполненные из плотной ткани и шириной в два раза больше ширины оконного проема. Для дополнительного звукопоглощения занавеси следует подвешивать в складку на расстоянии 15-20 см от стены с оконными проемами.

Рабочие места по отношению к световым проемам должны располагаться так, чтобы естественный свет падал сбоку, преимущественно - слева.

Для устранения бликов на экране, также как чрезмерного перепада освещенности в поле зрения, необходимо удалять экраны от яркого дневного света.

Рабочие места должны располагаться от стен с оконными проемами на расстоянии не менее 1,5 м, от стен без оконных проемов на расстоянии не менее 1,0 м.

Поверхность пола в помещениях должна быть ровной, без выбоин, нескользкой, удобной для чистки и влажной уборки, обладать антистатическими свойствами.

Освещенность на рабочем месте с ПЭВМ должна быть не менее:

·  экрана - 200 лк;

·  клавиатуры, документов и стола - 400 лк.

Для подсветки документов допускается установка светильников местного освещения, которые не должны создавать бликов на поверхности экрана и увеличивать его освещенность до уровня более 300 лк. Следует ограничивать прямые блики от источников освещения.

Освещенность дисплейных классов, рекомендуемая отраслевыми нормами лежит в пределах 400-700 лк и мощностью ламп до 40Вт.

В качестве источников света при искусственном освещении необходимо применять преимущественно люминесцентные лампы типа ЛБ цветовая температура (Тцв) излучения которых находится в диапазоне °K.

Допускается применение ламп накаливания в светильниках местного освещения. Для того чтобы избегать ослепления, необходимо устранять из поля зрения оператора источники света (лампы, естественный солнечный свет), а также отражающие поверхности (например, поверхность блестящих полированных столов, светлые панели мебели). При электрическом освещении упомянутые требования могут быть удовлетворены при выполнении следующих условий: освещение должно быть не прямым, для чего необходимо избегать на потолке зон чрезмерной освещенности. При этом освещенность должна быть равномерной, потолок должен быть плоским, матовым и однородным. Необходима также достаточная высота потолка для возможности регулировать высоту подвеса светильников.

При установке рабочих мест нужно учитывать, что мониторы должны располагаться на расстоянии не менее 2 метров друг от друга, если брать длины от задней поверхности одного до экрана другого, и 1,2 метра между их боковыми поверхностями. При выполнении творческой работы, требующей «значительного умственного напряжения или высокой концентрации внимания», между компьютерами должны быть установлены перегородки высотой 1,5-2,0 метра.

Дисплей должен поворачиваться по горизонтали и по вертикали в пределах 30 градусов и фиксироваться в заданном направлении. Дизайн должен предусматривать окраску корпуса в мягкие, спокойные тона с диффузным рассеиванием света. Корпус дисплея, клавиатура и другие блоки и устройства должны иметь матовую поверхность одного цвета с коэффициентом отражения 0.4-0.6 и не иметь блестящих деталей, способных создавать блики.

Рабочий стул должен быть подъемно-поворотным и регулируемым по высоте и углам наклона сиденья и спинки, а также расстоянию спинки от переднего края сиденья.

Экран монитора должен находиться от глаз пользователя на расстоянии 600-700 мм, но не ближе 500 мм. В помещениях ежедневно должна проводиться влажная уборка.

Рабочее место должно быть оборудовано подставкой для ног, шириной не менее 300 мм, глубину не менее 400 мм, регулировку по высоте в пределах 150 мм и по углу наклона опорной поверхности до 20 градусов. Клавиатуру следует располагать на поверхности стола на расстоянии 100-300 мм от края, обращенного к пользователю, или на специальной, регулируемой по высоте рабочей поверхности.

4.3.1.4. Требования к организации работы

Для преподавателей вузов и учителей средних учебных заведений длительность работы в дисплейных классах устанавливается не более 4 часов в день. Для инженеров, обслуживающих компьютерную технику, - не более 6 часов в день. Для обычного пользователя продолжительность непрерывной работы за компьютером без перерыва не должна превышать 2 часов.

Необходимо делать 15-минутные перерывы каждые 2 часа, менять время от времени позу.

Для тех, у кого смена работы за компьютером 12 часов, установлено - в течение последних четырех часов каждый час должен прерываться 15-минутным перерывом.

При работе с ПЭВМ в ночную смену, независимо от вида и категории работ, продолжительность регламентированных перерывов увеличивается на 60 минут. В случаях возникновения у работающих с ПЭВМ зрительного дискомфорта и других неблагоприятных субъективных ощущений, несмотря на соблюдение санитарно-гигиенических, эргономических требований, режимов труда и отдыха следует применять индивидуальный подход в ограничении времени работ с ПЭВМ и коррекцию длительности перерывов для отдыха или проводить смену деятельности на другую, не связанную с использованием ПЭВМ.

Профессиональные пользователи обязаны проходить периодические медицинские осмотры. Женщины во время беременности и в период кормления ребенка грудью к работе за компьютером не допускаются.

Необходимо строго регламентировать время и условия работы с компьютером для сотрудников, страдающих заболеваниями опорно-двигательного аппарата, глаз и т. д.

4.3.2. Методы и средства защиты от ультрафиолетового излучения

Энергетической характеристикой является плотность потока мощности [Вт/м2]

Биологический эффект воздействия определяется внесистемной единицей эр.

1 эр - это поток (нм), который соответствует потоку мощностью 1 Вт.

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

Максимальная доза облучения:

·  7.5 мэр*ч/ м2 за рабочую смену;

·  60 мэр*ч/м2 в сутки.

Для защиты от ультрафиолетового излучения:

·  защитный фильтр или специальные очки (толщина стекол 2мм, насыщенных свинцом);

·  одежда из фланели и поплина;

·  побелка стен и потолка (ослабляет на 45-50%).

4.3.3. Методы и средства защиты от электромагнитных полей низкой частоты.

Защита от электромагнитных излучений осуществляется следующими способами:

·  Время работы - не более 4 часов

·  Расстояние - не менее 50 см от источника

·  Экранирование

·  Расстояние между мониторами - не менее 1,5 м

·  Не находиться слева от монитора ближе 1.2 м, и сзади не ближе 1м.

4.3.4. Методы и средства защиты от статического электричества

Защита от статического электричества и вызванных им явлений осуществляется следующими способами:

·  Проветривание без присутствия пользователя.

·  Влажная уборка.

·  Отсутствие синтетических покрытий.

·  Нейтрализаторы статического электричества.

·  Подвижность воздуха в помещении не более 0.2 м/с.

·  Иметь контурное заземление.

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

4.4. Выводы.

Выбранные методы и способы защиты от опасных и вредных факторов обеспечивают защиту пользователей, работающих с вычислительной техникой.

5. Выводы

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

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

6. Список литературы

1.  «PARALLEL PROCESSING WITH CUDA: Nvidia’s High-Performance Computing Platform Uses Massive Multithreading», By Tom R. Halfhill, журнал Microprocessor Report, 28.01.08, гиперссылка: http://www. /docs/IO/47906/220401_Reprint. pdf

2.  «NVIDIA Cuda: унификация графики и вычислений», Андрей Зубинский, 8 мая 2007 г, гиперссылка: http:///node/27969

3.  «CUDA, Supercomputing for the Masses: Part 1», Rob Farber, 2008, гиперссылка: http://www. /hpc-high-performance-computing/

4.  «3D графика - история, методология, инструменты», Болдырев Дмитрий, журнал кафедры ИКТ «Editory» #.

5.  «3D software comparison tables», Benoît Saint-Moulin, European CG Network, гиперссылка: http://www. tdt3d. be/articles_viewer. php? art_id=99

6.  «Comparison of 3d tools», CGSociety Wiki, гиперссылка: http://wiki. cgsociety. org/index. php/Comparison_of_3d_tools

7.  «3ds Max», From Wikipedia, the free encyclopedia, гиперссылка: http://en. wikipedia. org/wiki/3ds_Max

8.  «LightWave 3D», From Wikipedia, the free encyclopedia, гиперссылка: http://en. wikipedia. org/wiki/LightWave

9.  «Maya», CGSociety Wiki, гиперссылка: http://wiki. cgsociety. org/index. php/Maya

10.  «XSI», CGSociety Wiki, гиперссылка: http://wiki. cgsociety. org/index. php/XSI

11.  «Houdini», From Wikipedia, the free encyclopedia, гиперссылка: http://en. wikipedia. org/wiki/Houdini_%28software%29

12.  «Blender (software)», From Wikipedia, the free encyclopedia, гиперссылка: http://en. wikipedia. org/wiki/Blender_%28software%29

13.  «Binary file», From Wikipedia, the free encyclopedia, гиперссылка: http://en. wikipedia. org/wiki/Binary_file

14.  «Text file», From Wikipedia, the free encyclopedia, гиперссылка: http://en. wikipedia. org/wiki/Text_file

15.  «RapidXml Manual version 1.1», Marcin Kalicinski, 2007, гиперссылка: http://rapidxml. /manual. html

16.  «COMPLETE MAYA PROGRAMMING. An Extensive Guide to MEL and the C++API», David A. D. Gould, Academic Press - MORGAN KAUFMANN PUBLISHERS, 2002

17.  «gpExport - a Maya Exporter», Florian Loitsch, 2004, гиперссылка:

http://florian. /gpExport/

18.  «How to Write a Simple Maya Model Exporter». Rafael Baptista, , 18.04.2003, гиперссылка: http://www. /reference/articles/article1906.asp

19.  «The Maya Exporter Factfile», Robert Bateman, 2004, гиперссылка:

http://www. robthebloke. org/research/index. htm

7. Приложение

7.1. Листинг с исходным кодом класса XMLImport

7.1.1. Файл XMLImport. h

#ifndef XMLIMPORT_H

#define XMLIMPORT_H

#include "RapidXML\rapidxml. hpp"

#include <iostream>

#include <string>

#include <fstream>

#include "render. h"

using namespace rapidxml;

using namespace std;

class XMLImport

{

public:

XMLImport(const char* filename);

TRender Parse(TRender render);

private:

char* fileString;

void FileToString(const char* filename);

xml_document<> xmldoc;

};

#endif //XMLIMPORT_H

7.1.1. Файл XMLImport. cpp

#include "XMLImport. h"

#include "scene. h"

using namespace rapidxml;

using namespace std;

XMLImport::XMLImport(const char* filename)

{

FileToString(filename);

xmldoc. parse<0>(fileString);

}

void XMLImport::FileToString(const char* filename)

{

FILE* file = fopen(filename, "rb");

if (!file) {cout << "File " << filename << " does not exist\n"; return;}

fseek(file, 0, SEEK_END);

long length = ftell(file);

fseek(file, 0, SEEK_SET);

if (length < 0)

{

cout << "File " << filename << " is empty\n";

fclose(file);

return ;

}

try

{

fileString = new char[length + 1];

if (!fileString) {cout << "Parsing string is null\n";return;}

}

catch (const std::bad_alloc&)

{

cout << "Parsing string: allocation error\n";

fclose(file);

return;

}

size_t read = fread(fileString, (size_t)length, 1, file);

fclose(file);

if (read!= 1)

{

cout << "Parsing string: reading error\n";

delete[] fileString;

return;

}

fileString[length] = 0;

//cout << fileString << endl;

}

TRender XMLImport::Parse (TRender render)

{

xml_node<> *scene = xmldoc. first_node("scene");

xml_node<> *polygons = scene->first_node("polygons");

xml_node<> *lights = polygons->next_sibling("lights");

xml_node<> *camera = lights->next_sibling("camera");

xml_node<> *params;

xml_attribute<> *attrs;

TPolygon tpolygon;

TLightSource tlight;

cout << "Parsing scene..." << endl;

cout << "Parsing polygons..." << endl;

for(xml_node<> *polygon = polygons->first_node("polygon"); polygon; polygon = polygon->next_sibling("polygon"))

{

params = polygon->first_node("color");

attrs = params->first_attribute("r");

tpolygon. Color. R = atof(attrs->value());

/*cout << tpolygon. Color. R << endl;*/

attrs = attrs->next_attribute("g");

tpolygon. Color. G = atof(attrs->value());

/*cout << tpolygon. Color. G << endl;*/

attrs = attrs->next_attribute("b");

tpolygon. Color. B = atof(attrs->value());

/*cout << tpolygon. Color. R << endl;*/

params = params->next_sibling("a");

attrs = params->first_attribute("x");

tpolygon. A.x = atof(attrs->value());

/*cout << tpolygon. A.x << endl;*/

attrs = attrs->next_attribute("y");

tpolygon. A.y = atof(attrs->value());

/*cout << tpolygon. A.y << endl;*/

attrs = attrs->next_attribute("z");

tpolygon. A.z = atof(attrs->value());

/*cout << tpolygon. A.z << endl;*/

params = params->next_sibling("b");

attrs = params->first_attribute("x");

tpolygon. B.x = atof(attrs->value());

/*cout << tpolygon. B.x << endl;*/

attrs = attrs->next_attribute("y");

tpolygon. B.y = atof(attrs->value());

/*cout << tpolygon. B.y << endl;*/

attrs = attrs->next_attribute("z");

tpolygon. B.z = atof(attrs->value());

/*cout << tpolygon. B.z << endl;*/

params = params->next_sibling("c");

attrs = params->first_attribute("x");

tpolygon. C.x = atof(attrs->value());

/*cout << tpolygon. C.x << endl;*/

attrs = attrs->next_attribute("y");

tpolygon. C.y = atof(attrs->value());

/*cout << tpolygon. C.y << endl;*/

attrs = attrs->next_attribute("z");

tpolygon. C.z = atof(attrs->value());

/*cout << tpolygon. C.z << endl;*/

params = params->next_sibling("reflect");

attrs = params->first_attribute("value");

tpolygon. KReflection = atof(attrs->value());

//cout << tpolygon. KReflection << endl;

params = params->next_sibling("refract");

attrs = params->first_attribute("value");

tpolygon. KRefraction = atof(attrs->value());

/*cout << tpolygon. KRefraction << endl;*/

params = params->next_sibling("alpha");

attrs = params->first_attribute("value");

tpolygon. Alpha = atof(attrs->value());

/*cout << tpolygon. Alpha << endl;*/

render. AddPolygonToScene(tpolygon);

}

cout << "Parsing lights..." << endl;

for(xml_node<> *light = lights->first_node("light"); light; light = light->next_sibling("light"))

{

params = light->first_node("position");

attrs = params->first_attribute("x");

tlight. Position. x = atof(attrs->value());

/*cout << tlight. Position. x << endl;*/

attrs = attrs->next_attribute("y");

tlight. Position. y = atof(attrs->value());

/*cout << tlight. Position. y << endl;*/

attrs = attrs->next_attribute("z");

tlight. Position. z = atof(attrs->value());

/*cout << tlight. Position. z << endl;*/

params = params->next_sibling("properties");

attrs = params->first_attribute("r");

float r = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("g");

float g = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("b");

float b = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("intensity");

float i = atof(attrs->value());

/*cout << attrs->value() << endl;*/

tlight. Light. Init(r, g, b, i);

render. AddLightSourceToScene(tlight);

}

cout << "Parsing camera..." << endl;

params = camera->first_node("position");

attrs = params->first_attribute("x");

float x = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("y");

float y = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("z");

float z = atof(attrs->value());

/*cout << attrs->value() << endl;*/

render. GetScene()->Camera. Position = make_float3(x, y, z);

params = params->next_sibling("up");

attrs = params->first_attribute("x");

x = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("y");

y = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("z");

z = atof(attrs->value());

/*cout << attrs->value() << endl;*/

render. GetScene()->Camera. Up = make_float3(x, y, z);

params = params->next_sibling("right");

attrs = params->first_attribute("x");

x = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("y");

y = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("z");

z = atof(attrs->value());

/*cout << attrs->value() << endl;*/

render. GetScene()->Camera. Right = make_float3(x, y, z);

params = params->next_sibling("look");

attrs = params->first_attribute("x");

x = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("y");

y = atof(attrs->value());

/*cout << attrs->value() << endl;*/

attrs = attrs->next_attribute("z");

z = atof(attrs->value());

/*cout << attrs->value() << endl;*/

render. GetScene()->Camera. Look = make_float3(x, y, z);

cout << "Parsing scene done." << endl;

return render;

}

7.1.3. Функция InitSceneFromFile из файла main. cpp

void InitSceneFromFile()

{

char* xmlFileName = "scene. xml";

XMLImport import(xmlFileName);

render = import. Parse(render);

}

7.2. Листинг с исходным кодом программы-модуля для Maya

#include <maya/MSimple. h>

#include <maya/MSimple. h>

#include <maya/MGlobal. h>

#include <maya/MDagPath. h>

#include <maya/MDagPathArray. h>

#include <maya/MIntArray. h>

#include <maya/MPointArray. h>

#include <maya/MVectorArray. h>

#include <maya/MObjectArray. h>

#include <maya/MPoint. h>

#include <maya/MVector. h>

#include <maya/MMatrix. h>

#include <maya/MAngle. h>

#include <maya/MSelectionList. h>

#include <maya/MPlugArray. h>

#include <maya/MItDag. h>

#include <maya/MItDependencyNodes. h>

#include <maya/MItMeshPolygon. h>

#include <maya/MFnMesh. h>

#include <maya/MFnCamera. h>

#include <maya/MFnDependencyNode. h>

#include <maya/MFnLambertShader. h>

#include <maya/MFnPhongShader. h>

#include <maya/MFnAreaLight. h>

#include <maya/MFnDirectionalLight. h>

#include <maya/MFnAmbientLight. h>

#include <maya/MFnLight. h>

#include <maya/MFnPointLight. h>

#include <maya/MFnSpotLight. h>

#include <maya/MFnTransform. h>

#include <iostream>

#include <fstream>

#include <set>

#include <vector>

#include <string>

#include <cassert>

bool isObjectVisible(const MDagPath& path) {

MStatus status;

MFnDagNode node(path);

MPlug vPlug = node. findPlug("visibility", &status);

bool visible = true;

if (status == MS::kSuccess)

vPlug. getValue(visible);

status. clear();

MPlug iPlug = node. findPlug("intermediateObject", &status);

bool intermediate = false;

if (status == MS::kSuccess)

iPlug. getValue(intermediate);

return visible && !intermediate;

}

bool areObjectAndParentsVisible(const MDagPath& path) {

bool result = true;

MDagPath searchPath(path);

for (;;) {

if (!isObjectVisible(searchPath)) {

result = false;

break;

}

if (searchPath. length() <= 1)

break;

searchPath. pop();

}

return result;

}

bool isCameraRenderable(const MDagPath& path) {

MStatus status;

MFnDagNode node(path);

MPlug rPlug = node. findPlug("renderable", &status);

bool renderable = true;

if (status == MS::kSuccess)

rPlug. getValue(renderable);

return renderable;

}

MMatrix BuildTransform(const MObject& obj)

{

MFnTransform fn(obj);

MMatrix M = fn. transformationMatrix();

if (fn. parentCount()>0) {

return M* BuildTransform(fn. parent(0)) ;

}

return M;

}

bool getShaderFromEngine(const MObject& obj, MFnDependencyNode& node) {

if (!obj. hasFn(MFn::kShadingEngine))

return false;

MFnDependencyNode seNode(obj);

MPlug shaderPlug = seNode. findPlug("surfaceShader");

if (shaderPlug. isNull())

return false;

MPlugArray plugs;

shaderPlug. connectedTo(plugs, true, false);

for (unsigned int i = 0; i < plugs. length(); i++) {

MObject sObj = plugs[i].node();

if (sObj. hasFn(MFn::kLambert)) {

node. setObject(sObj);

return true;

}

}

return false;

}

void exportMeshAndPhong(const MDagPath& path, std::ofstream& file) {

bool instancing = path. isInstanced();

if (instancing) {

if (path. instanceNumber() != 0)

return;

else {

MDagPathArray paths;

path. getAllPathsTo(path. node(), paths);

bool hasVisible = false;

for (unsigned int i = 0; i < paths. length() && !hasVisible; i++)

hasVisible |= areObjectAndParentsVisible(paths[i]);

if (!hasVisible)

return;

}

} else if (!areObjectAndParentsVisible(path))

return;

MFnMesh mesh(path);

int numPoints = mesh. numVertices();

int numTriangles = 0;

for (MItMeshPolygon it(path); !it. isDone(); it. next()) {

int tri;

it. numTriangles(tri);

numTriangles += tri;

}

if (numPoints == 0 || numTriangles == 0) return;

file << "\n<!-- Mesh: " << path. fullPathName().asChar()

<< ", Triangles: " << numTriangles << " -->" << std::endl;

MColor color;

MColor trans;

float refl = 0;

float refr = 0;

MObjectArray shaders;

MIntArray polyShaderIndices;

mesh. getConnectedShaders(path. instanceNumber(), shaders, polyShaderIndices);

MObject engine = shaders[0];

MFnDependencyNode shader;

if (getShaderFromEngine(engine, shader))

if (shader. object().hasFn(MFn::kPhong))

{

MFnPhongShader shader(shader. object());

color = shader. color();

trans = shader. transparency();

refl = shader. reflectivity();

if(shader. rtRefractedColor())

refr = shader. refractiveIndex();

if(refr > 1) refr = 1.0;

}

unsigned int t = 0;

MPointArray triVertCoords;

MIntArray triangleVertices;

MIntArray polygonVertices;

std::vector<int> faceMaterials(numTriangles);

for (MItMeshPolygon mItMeshPolygon(path); !mItMeshPolygon. isDone(); mItMeshPolygon. next()) {

mItMeshPolygon. getVertices(polygonVertices);

int numVerts = (int) polygonVertices. length();

int numTriangles; mItMeshPolygon. numTriangles(numTriangles);

while (numTriangles--) {

mItMeshPolygon. getTriangle(numTriangles, triVertCoords, triangleVertices, MSpace::kWorld);

MPoint a = triVertCoords[0];

MPoint b = triVertCoords[1];

MPoint c = triVertCoords[2];

file << "\t<polygon>" << "\n";

file << "\t\t<color r=\"" << color. r

<< "\" g=\"" << color. g

<< "\" b=\"" << color. b

<< "\" />" << "\n";

file << "\t\t<a x=\"" << a. x

<< "\" y=\"" << a. y

<< "\" z=\"" << - a. z

<< "\" />" << "\n";

file << "\t\t<b x=\"" << b. x

<< "\" y=\"" << b. y

<< "\" z=\"" << - b. z

<< "\" />" << "\n";

file << "\t\t<c x=\"" << c. x

<< "\" y=\"" << c. y

<< "\" z=\"" << - c. z

<< "\" />" << "\n";

file << "\t\t<reflect value=\"" << refl

<< "\" />" << "\n";

file << "\t\t<refract value=\"" << refr

<< "\" />" << "\n";

file << "\t\t<alpha value=\"" << trans. r

<< "\" />" << "\n";

file << "\t</polygon>" << "\n";

}

}

}

void exportCamera(const MDagPath& path, std::ofstream& file) {

MFnCamera camera(path);

if (!isCameraRenderable(path)) return;

MSpace::Space space = MSpace::kWorld;

MPoint pos = camera. eyePoint(space);

MVector look = camera. viewDirection(space);

MVector up = camera. upDirection(space);

MVector right = camera. rightDirection(space);

std::cout << "Exporting camera: " << path. fullPathName().asChar() << " ..." << std::endl;

file << "<camera>" << std::endl;

file << "\t<position x=\"" << pos. x << "\" y=\"" << pos. y << "\" z=\"" << - pos. z << "\"/>" << std::endl;

file << "\t<up x=\"" << up. x << "\" y=\"" << up. y << "\" z=\"" << - up. z << "\"/>" << std::endl;

file << "\t<right x=\"" << right. x << "\" y=\"" << right. y << "\" z=\"" << - right. z << "\"/>" << std::endl;

file << "\t<look x=\"" << look. x << "\" y=\"" << look. y << "\" z=\"" << - look. z << "\"/>" << std::endl;

file << "</camera>" << std::endl;

file << std::endl;

}

void OutputLight(std::ofstream& ofs, MObject &obj)

{

assert( !obj. isNull() );

assert( obj. hasFn(MFn::kLight) );

MFnLight fnLight(obj);

if ( !fnLight. isIntermediateObject() )

{

MColor color(0.0f,0.0f,0.0f);

color = fnLight. color();

MVector p(0,0,0);

MFnTransform fnXform( fnLight. parent(0) );

MMatrix ws = BuildTransform(fnXform. object());

ofs << "\t<light>" << "\n"

<< "\t\t<position x=\"" << ws(3,0) << "\""

<< " y=\"" << ws(3,1) << "\""

<< " z=\"" << - ws(3,2) << "\""

<< "/>\n"

<< "\t\t<properties r=\"" << color. r << "\""

<< " g=\"" << color. g << "\""

<< " b=\"" << color. b << "\""

<< " intensity=\"" << fnLight. intensity()*25.5 << "\""

<< "/>\n"

<< "\t</light>"

<< std::endl;

}

}

DeclareSimpleCommand( GPURTExport, "GIiRT Team", "2008");

MStatus GPURTExport::doIt(const MArgList& args) {

MString filename = ".\\plug-ins\\scene. xml";

std::cout << "Exporting scene to: " << filename. asChar() << " ..." <<std::endl;

std::ofstream file(filename. asChar());

MStatus status;

file << "<scene>" << std::endl << std::endl;

file << "<polygons>" << std::endl;

for (MItDag mItDag = MItDag(MItDag::kBreadthFirst); !mItDag. isDone(&status); mItDag. next())

{

MDagPath path;

status = mItDag. getPath(path);

if (path. apiType(&status) == MFn::kMesh)

{

std::cout << "Exporting mesh: " << path. fullPathName().asChar() << " ..." << std::endl;

exportMeshAndPhong(path, file);

}

}

file << "</polygons>" << std::endl;

MItDependencyNodes itDep(MFn::kInvalid);

file << "<lights>" << std::endl;

while (!itDep. isDone())

{

MObject item = itDep. item();

switch(item. apiType())

{

case MFn::kLight:

case MFn::kAreaLight:

case MFn::kAmbientLight:

case MFn::kDirectionalLight:

case MFn::kPointLight:

case MFn::kSpotLight:

std::cout << "Exporting light..." << std::endl;

OutputLight(file, item);

break;

default:

break;

}

itDep. next();

}

file << "</lights>" << std::endl;

for (MItDag mItDag = MItDag(MItDag::kBreadthFirst); !mItDag. isDone(&status); mItDag. next())

{

MDagPath path;

status = mItDag. getPath(path);

if (path. apiType(&status) == MFn::kCamera)

{

exportCamera(path, file);

}

}

file << "</scene>" << std::endl;

file. close();

std::cout << "Exporting scene done." << std::endl;

return MS::kSuccess;

}

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3