Показаны сообщения с ярлыком sweet home. Показать все сообщения
Показаны сообщения с ярлыком sweet home. Показать все сообщения

Вести с поисковых полей

0 коммент. | добавить комментарий
В Mac OS 10.4, среди прочих новшеств, была внедрена технология поиска Spotlight, включающая индексирование и поиск по именам файлов, а также индексирование и поиск по метаданным. Для меня это значит примерно следующее: поскольку наш проект использует свой формат документов, представляя их в виде Mac OS bundles (т.е. документ представляет собой папку, в которой содержится описание структуры документа, а также хранятся использованные текстуры, материалы, 3D-объекты, представления и пр.), то автоматически Spotlight'овый поиск по нашим документам работать не будет. Чтобы справиться с этой проблемой, мне вчера довелось написать плагин для системы Spotlight - т.н. Spotlight Importer, который предоставляет данной системе метаданные наших документов в требуемом ей формате.

Об этом и речь. Для быстрого поиска информации в системе можно, как Microsoft, долго разрабатывать WinFS, и впоследствии отказаться от внедрения ее в новой версии Windows, а можно придумать Spotlight, поддержать поиск по стандартным форматам данных, и обязать разработчиков писать плагины для поиска по нестандартным форматам. Отличие в том, что второй подход уже реально работает на протяжении более чем полугода, а первый - нет, и неизвестно, когда WinFS будет-таки выпущена в свободное плавание.

Итак, Spotlight Importer. Его разработка сводится к реализации функции Boolean GetMetadataForFile(void* thisInterface, CFMutableDictionaryRef attributes, CFStringRef contentTypeUTI, CFStringRef pathToFile), которая принимает имя документа, созданного в нашем приложении, а возвращает ссылку на словарь метаданных attributes. Очевидно, что данная функция должна открыть документ, прочитать из него то, что может быть проиндексировано, и запихнуть это все в словарь attributes. Я уложился в набор стандартных ключей, используя:

  • kMDItemTitle - имя документа
  • kMDItemAuthors - массив, состоящий из имен авторов документа (у наших документов м.б. только 1 автор)
  • kMDItemDescription - описание документа

Нет, ну ведь правда здорово? Немедленно создаем документ spiralka и заполняем поля автор/копирайт/описание (кому не видно - имя автора "Zaycheg"):



Итак, что мы теперь найдем в Spotlight по запросу "zaycheg"? Конечно же, документ spiralka:



Не просто, а очень просто! Напоследок самое вкусное: как связать разработанный плагин с форматом документов. Иными словами - как сказать Spotlight'у, что для индексирования наших документов необходимо запустить наш плагин. Для этого в файл Info.plist приложения (содержит метаданные о приложении) необходимо указать тип (расширение) наших документов в формате UTI (Uniform Type Identifier). После первого запуска приложения Mac OS проанализирует его файл Info.plist, а затем всегда будет искать плагин для индексирования данного UTI в bundle приложения, и в системных папках Library. А плагин декларирует множество поддерживаемых UTI, и имеет собственный GUID, что гарантирует его уникальность в системе.

Ну красота ведь! До сих пор не нарадуюсь :)
А Microsoft пускай еще WinFS попишет.

Свет

0 коммент. | добавить комментарий
В прошлом посте речь шла о материалах и их свойствах – ambient, diffuse и specular. Как оказалось, теми же самыми свойствами обладает и свет. Этот факт сводится к тому, что у света также имеется три составляющих. Diffuse-цвет света, взаимодействуя с diffuse-цветом материала, определяет свойства рассеивания света по данному материалу. Specular-цвет света, взаимодействуя со specular-цветом материала, определяет вид блика, или светового пятна. Есть еще ambient-цвет света – но это отдельная песня, в которой поется об общем цвете сцены. Например, закат часто красит все вокруг в багровые тона – это потому, что у закатного солнца багровый ambient.

Нет, на самом деле все, конечно же, обстоит не так, и я сторонник того, что Господь не придумал факультетов. Багровый ambient – это всего лишь жалкая попытка нас, нервически дергающих ножкой, смоделировать закат на экранах наших мониторов. Так будет правильней.

Говоря о том, что что-то там с чем-то взаимодействует, я имею в виду вот что. Разные материалы при освещении одним и тем же светом ведут себя совершенно по-разному. Например, светлая сосна, если светить на нее, будет освещаться в целом равномерно, а, скажем, темный орех будет иметь характерное круглое световое пятно. Это говорит о том, что материалы по-разному реагируют на свет. Можно рассматривать аддитивную модель взаимодействия, когда, например, diffuse-цвет света складывается с diffuse-цветом материала, что дает результирующий цвет в освещенной точке. Из имеющих названия бывает еще модулятивная модель. А вообще говоря, модель взаимодействия компонент материала с компонентами света называется blending, и их бывает много разных типов.

В нашем проекте мы, разумеется, не обращаемся напрямую к OpenGL API, а используем opensource-3D-движок OGRE (http://www.ogre3d.org/). Когда он рендерит сцену, внутри него происходит деление материала на т.н. illumination passes. Грубо говоря, ему удобней просчитывать освещенность в несколько проходов: в первом (ambient pass) считаются ambient-компоненты материалов, полученные в результате освещения источниками света, находящимися в сцене; во втором (per-light pass) – diffuse и specular-компоненты; в третьем проходе (decal pass) обрабатываются текстуры. Кстати, это верно только для непрозрачных материалов; всякие там стекла на проходы не делятся, да и рендерятся они совсем по-другому, поскольку необходимо рисовать на экране также то, что находится за ними.

Напоследок – несколько картинок:

Сцена после ambient-прохода

Сцена после всех проходов

Сцена после всех проходов + наложение теней



Итог прост. Цвет объекта образуется во взаимодействии трех компонент света с тремя компонентами материала. В следующий раз я расскажу о том, во что выливается вся эта история с материалами и светом лично для меня и для нашего проекта.

О свойствах материалов

0 коммент. | добавить комментарий
Почти всю свою жизнь я считал, что свойства материалов в окружающем нас мире сводятся к паре «цвет/текстура». И в самом деле – казалось мне – если, например, стену покрасить краской, то она приобретет определенный цвет; если же ее оклеить рельефными обоями, то она станет обладать некоторой текстурой. Работая над проектом codename Sweet Home в BeLight Software, мне пришлось познакомиться с представлением материалов в OpenGL, которое, как оказалось, разительно отличается от моего [убогого] представления.

Так вот, первым свойством материала является т.н. ambient color. Ambient – это, попросту говоря, цвет материала, который мы наблюдаем в отсутствие текстуры и [выраженного] освещения – например, в пасмурный день. Вторым свойством назовем diffuse color – этот параметр определяет то, как свет рассеивается по объекту с рассматриваемым материалом. Кроме ambient и diffuse есть еще такой specular color – мы можем наблюдать его, когда свет светит так ярко, что дает блик на поверхности, а specular color как раз и есть цвет этого блика

Совсем непонятно, ага? У меня пример есть, вот он:



Ну, что бы я сказал раньше, когда был молод и глуп?
Что, дескать, сверху-слева на красный шарик светит желтая лампочка.

А что мы скажем теперь? Specular-цвет у материала, примененного к шарику, желтый – это видно на блике. Когда блик заканчивается, начинается власть diffuse-цвета. Как это легко видно, здесь он красный, что и придает красноту всей освещенной поверхности шарика. В тени шарик черный как жопа у негра что-то очень-очень черное – это потому, что у этого материала ambient-цвет такой… ну, вы поняли ;).

Что, еще не все? Ах, на рисунке еще какой-то self illumination есть? И тоже черный? А каким же ему быть, если self illumination, или emissive – это цвет самосвечения объекта. Ну, например фосфор в часах светится ночью зелененьким, потому что у него self illumination зеленый. А shininess, раз уж на то пошло, – это степень четкости блика. Чем shininess больше, тем блик меньше и границы его четче (характерно для металлов). А чем он же меньше, тем блик размазанней (характерно для матовых поверхностей).

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

С шариком вроде все. В следующий раз остановимся на лампочке.