53

FPS Magazine Issue 16

Embed Size (px)

DESCRIPTION

FPS is a free and open source Russian e-zine mainly dedicated to development of computer games.

Citation preview

Page 1: FPS Magazine Issue 16

Нас читают

gcupruВсе для начинающегои профессионального

разработчика игр

xtreme3dnarodruСайт движка Xtreme3D

make-gamesruПортал создания игр

gamer-clubucozcomВсе для создания игр без

программированияи не только

mizzysticruКрупнейший информационный

Game Maker портал

xbobratuaСоздание игр программ

музыки

portalgamenetruИгровой портал

dapfusФорум дизайнерови программистов

esateruМультимедиа-сообщество

wwwmobkioskcomМобильный киоск

dogamesruМастерская игр

gamecreateruСоздай свою игру

igrostroenienetruИгровые движки и ресурсы

gaconucozruCайт посвященный

разработке игр

gameoxnullnetРазработка игрна конструкторе

Game Maker

bigslava3dnruСообщество

творческих людей

game-creationtkПортал создания игр

antistarforcecomИгровой портал

copy 2008 - 2011 Редакция журнала FPS Все названия и логотипы являютсяинтеллектуальной собственностью их законных владельцев и не используются вкачестве рекламы продуктов или услуг Редакция не несет ответственности задостоверность информации в статьях и надежность всех упоминаемых URL-адресовМнение редакции может не совпадать с мнением авторов материаловМатериалы издания распространяются по лицензии Creative Commons AttributionNoncommercial Share Alike (CC-BY-NC-SA) если явно не указаны иные условияГлавный редактор Тимур ГафаровДизайн и верстка Тимур ГафаровПо вопросам сотрудничества обращаться по адресу gecko0307gmailcomОфициальный сайт журнала httpfpsmagzymichostcom

В этом выпуске

SIGGRAPH 2011Новости с выставки в Ванкувере3

3DWorld AwardsНаграды 2011 года в области CG8

BlenderНовости из мира Blender11

Нет дыма без огня14

Grease Scatter21

Cycles первые шаги25

Blender и архитектурное моделирование30

Язык DНовости34

Двоичное дерево36

Сопрограммы40

Python 2 или Python 3Что выбрать43

Модели освещенияКоэффициент Френеля44

Цифровая алхимияВ начале было Слово47

LinuxGlibc hell ищем выход51

1611

httpfpsmagzymichostcom mailtogecko0307gmailcom

В АВГУСТЕ этого года в Ванкувере (Канада)прошла самая известная и самая престижнаяконференция и выставка компьютернойграфики SIGGRAPH 2011 АббревиатураSIGGRAPH расшифровывается как SpecialInterest Group on Graphics and InteractiveTechniques (laquoСпециальная Группа по ВопросамГрафических и Интерактивных Технологиийraquo)Выставка проводится организацией ACMSIGGRAPH с 1974 года в Лос-Анджелесе НовомОрлеане Сиэтле Далласе Бостоне и другихгородах США Ежегодно на нее приезжаюттысячи людей со всего мира а в последниегоды к ним прибавилась многомиллионнаяаудитория зрителей в Интернете

На SIGGRAPH съезжаются представителикрупных компаний демонстрируя новейшиеразработки в области компьютерной графикии анонсируя новые версии выпускаемых имипродуктов Кроме того на SIGGRAPHприезжают специалисты из крупныхуниверситетов которые представляют статьина темы имеющие отношение к CG Наконецэто место где встречаются и проводятмастер-классы лучшие 3D-художники Врамках SIGGRAPH также проводится фести-валь анимации и еще множество другихмероприятий

По традиции на SIGGRAPH 2011 былапредставлена новая версия спецификацииOpenGL ndash 42 Она включает обновление GLGLдо 420 а также содержит новые функциирасширяющие доступную функциональностьдля разработчиков и увеличивающиепроизводительность приложений

Рабочая станция HP Z800 на выставкеодновременно обрабатывала 12 потоков FullHD видео Это стало возможным благодаряобъединению сил компаний Fusion-io NVidiaThinkbox Software и Tweak Software соз-давшими творческий тандем специально дляSIGGRAPH 2011 Разработчики оснастили HPZ800 видеоускорителем NVidia QuadroPlex7000 а также твердотельными нако-пителями ioDrive Duos В системе былиустановлены также модули Fusion ioMemoryРезультат предсказуем mdash рабочая станция безмалейших laquoтормозовraquo или потерь качествадействительно обрабатывала одновременно12 потоков несжатого FullHD видео да еще сцветокоррекцией Твердотельные накопителибыли объединены в RAID массив с высокойпроизводительностью ioDrive Duos показалаотличный результат ndash три гигабайта в секунду

Интересно что система подобная этоймногими рассматривается как достойныйинструмент для графических дизайнеров ndashособенно для тех кто работает с 3DS MaxMaya Softimage и другими ресурсоемкимиприложениями Представители ThinkboxSoftware создавшие набор модулей Krakatoa20 MX для 3ds Max тоже неплохо отозвалисьо системе

Side Effects Software Inc объявили чтоDreamWorks приобрели неограниченнуюлицензию на пакет Houdini Это являетсяпродолжением практики использованияHoudini студией DreamWorks для созданиявизуальных эффектов и персонажей в своиханимационных фильмах Частью соглашенияявляется принятие участи Dreamworks вразработке продукта что позволит упроститьобмен интеллектуальной собственностьюмежду компаниями и согласовать усилия висследованиях Это сотрудничество нацеленона привнесение передовых и проверенных впроизводстве технологий в будущие релизыHoudini

laquoМы гордимся что DreamWorks Animationвыбрали наш продукт как приоритетныйинструмент для анимацииraquo ndash сказал КимДэвидсон президент и исполнительныйдиректор SES ndash Это захватывающий моментрасширения наших партнерских отношенийМы надеемся работать бок о бок еще долгиегодыraquo

Работая совместно обе компании хотятнайти новые пути развития в искусстве и наукесоздания фильмов Основанная на узлахпроцедурная архитектура Houdini позволитDreamWorks внедрить свои технологии вконвеер чтобы соответствовать растущим скаждым годом запросам анимационных иVFX-проектов

На SIGGRAPH 2011 был анонсирован выходHoudini 111 который станет переходнойверсией к Houdini 12 Обещают чтоособенностями Houdini 12 станут скорость ипроизводительность Достичь этих целейпомогут новый движок для работы сгеометрией а также задействование пос-ледних возможностей OpenGL Будут улуч-шены модули для просчета жидкостей иимитации ткани представлена вторая версиямодуля Pyro FX 20 для создания дыма и огняПо заявлениям SES Houdini 12 будет самымважнейшим релизом пакета когда-либовыпущенным

За последние двадцать лет топовые студиииспользовали награжденный американскойКиноакадемией пакет Houdini для созданиявизуальных эффектов ndash как в кино так и ванимационных фильмах Houdini наиболееизвестен своим процедурным рабочимпроцессом который поддерживает кактворческие так и технические аспектыкомпьютерной графики

Компания Maxon представила 13-ю версиюсвоего 3D-редактора Cinema 4D Основныеособенности релиза ndash новая физическаякамера многопроходный OpenEXR встроен-ное 3D-стерео улучшенная работа свнешними ссылками Xrefs

Компания Smith Micro Software объявила опредстоящем релизе программ Poser 9 и PoserPro 2012 В новой версии добавлен просчетподповерхностного рассеивания улучшенапроизводительность визуализации появиласьподдержка Weight Map Rigging Такжедобавлен набор инструментов дляредактирования Vertex Weight Map Такжестал возможен предварительный просмотрсцен в режиме реального времени

На выставке также представлена новаяверсия бенчмарка SPECapc (SPEC ApplicationPerformance Characterization) для AutodeskMaya 2012 Тест производительности дляпоследней версии 3D-редактора планируетсявыпустить до конца года А в следующем годубудет обновлено приложение для оцениванияпроизводительности графической подсисте-мы SPECviewperf Двенадцатая версияSPECviewperf будет поддерживать оба API ndashOpenGL и Direct3D а также многиеинтерактивные приложения Его можно будетбез труда портировать на другиеоперационные системы а добавлениетекстовых файлов станет проще На сайтеSPECapc (httpwwwspecorg) можно найтибенчмарки для более ранних версий Maya3DS Max SolidWorks и других программ

Компания Autodesk продемонстрировалапакет дополнений Subscription Advantage Packдля Maya 2012 Основная особенность ndashподдержка OpenCL Кроме того интег-рирован новый плагин Bullet PhysicsОбеспечивается поддержка всех возмож-ностей новейших графических процессоров отAMD Для справки SAP ndash это дополнениедоступное только для пользователей кото-рые дополнительно приобрели подписку напродукт

Pixar представила новую версию плагинаRenderMan для Maya который являетсяполностью интегрированным в пакетрендером Программа отличается от другихпродуктов линейки Pixar (таких какRenderMan Pro Server и RenderMan Studio)более низкой стоимостью и сравнительнойпростотой использования Плагин сможетпорадовать пользователей всеми совре-менными опциями которые присутствуют вхороших визуализаторах возможностьюпросчета глобального освещения эффектаподповерхностного рассеивания размытияпри движении и тд Обещают что вRenderMan для Maya войдут все последниетехнологии представленные в RenderMan ProServer 160 В частности существенноулучшена технология трассировки добавленыновые средства для освещения и повторнойвизуализации которые использовались вlaquoИстории игрушек 3raquo и laquoТачки 2raquo

Cebas Visual Technology Inc продемон-стрировала работу новой версии рендераFinalRender 4GPU Она использует технологиюNVidia CUDA с поддержкой GPU для ускорениявычислений Напомним что программы Сebasуспешно использовались при создании такихфильмов как laquoГарри Поттер и Дары СмертиЧасть I и IIraquo laquoТрансформерыraquo laquoЗеленыйфонарьraquo laquo2012raquo laquoАлиса в стране чудесraquolaquoПерси Джексон и Олимпийцыraquo laquoКошмар наулице Вязовraquo и laquoЖелезный человек 2raquo

Компания Tweak Software продемон-стрировала возможности новой версии своегопродукта RV ndash мощного вьювера изображенийдля VFX-художников и аниматоров Ключевыевозможности программы включают новыйlaquoпрезентационныйraquo режим позволяющийпросматривать материал на одном монитореа управлять просмотром ndash с другогоподдержку стерео 3D TV для HDMI 14a и DVIподдержку JavaScript ARRI Alexa ARRIRAW иRED RAW спецификации ACES (Academy ColorEncoding Specification) и CDL

Компания Imagination Technologies объяви-ла о предстоящем выпуске нового релизадвижка рендеринга Brazil В новой версииBrazil был переписан с нуля для увеличенияскорости Теперь пользователи могутредактировать laquoна летуraquo все что есть насцене в том числе модели источники светаматериалы и шейдеры Brazil построен наиспользовании OpenRL и ImaginationsRaytracing API и может использоваться налюбом оборудовании Карты и материалысозданные в Brazil RS 20 будут корректнооткрываться в новой версии программы

Компания Organic Motion представилановую версию системы захвата движенияOpenStage Эта система motion captureинтересна тем что для ее работы нетребуются маркеры Система способна делатьточный захват движений актера в реальномвремени и ему для этого не нужно одеватьспециальный костюм Немаловажная особен-ность системы ndash быстрая настройка

Кинофестиваль SIGGRAPH ndash один изнемногих которые объявляют свои призы нев финале а до самого анимационного шоуПоэтому победители были известны заранее

laquoЛучший фильмraquolaquoThe Fantastic Flying Books of Mr MorrisLessmoreraquo (Уильям Джойс и БрендонОлденбург Moonbot Studios)

laquoСпецприз жюриraquolaquoPaths of Hateraquo (Демиен Нено Platige Image)

laquoЛучший студенческий проектraquolaquoFlamingo Prideraquo (Томер Эшед The Konrad WolfPotsdam-Babelsberg Film and TelevisionUniversity)

laquoСпециальное поощрение жюриraquolaquoEscape of the Gingerbread Manraquo (Тод ПольсонThe Monk Studios)laquoThe Experience of Fliehkraftraquo (Тилл НовакFrameboX)

laquoСпециальные поощрения жюри в кате-гории laquoстуденческий проектraquolaquoDreamgiverraquo (Тайлер Картер Brigham YoungUniversity)laquoSweater Dograquo (Джина Моффит RinglingCollege of Art and Design)

По завершении тридцатьвосьмого SIGGRAPH оргкоми-тет подвел итоги Согласноофициальным данным выс-тавку посетило около 16 тысячзарегистрированных участни-ков среди которых ученыепрограммисты художники имультипликаторы Это рекордза все время проведенияSIGGRAPH в Ванкувере Навыставе и конференции былигости из 74 стран мира Cвоюпродукцию представили более155 компаний Среди них IntelNVidia AMD Autodesk GoogleHP Pixologic Khronos GroupPixar Animation Studios CebasMAXON Computer NewTekNext Limit Technologies идругие

Следующая выставка прой-дет в Лос-Анджелесе с 5 по 9августа 2012 года СайтSIGGRAPH 2012 уже работаетlaquoзаглянуть в будущееraquo можнотут s2012siggraphorg

Geckogecko0307gmailcom

За предоставленнуюинформацию благодарим

портал 3domencom

- 8 -

3D World один из ведущих журналов в мире3D-графики в сентябре вручил целую серию наград залучшие достижения 2010-11 гг в области разработкипрограммного и аппаратного обеспечения а также затворческие успехи в области иллюстративной графикианимации спецэффектов и архитектурной визуализацииВыбор жюри во многом оказался довольно любопытнымВ частности Blender Foundation достались сразу двенаграды ndash технологическая и творческая

laquoПрикладная программа годаraquoЛучшей новой программой был признан новый пакет

виртуальной лепки Sculptris Изначально это была инди-видуальная разработка программиста Томаса Петерсонакоторой он занимался в индивидуальном порядке с декабря2009 г Впоследствии Петерсон получил работу в компанииPixologic которая разрабатывает аналогичную по наз-начению программу ZBrush В результате между Sculptris иZBrush была налажена определенная доля совместимости ndashпректы из первого можно быстро экспортировать во второй

httpwwwpixologiccomsculptrisМы польщены тем что Sculptris занял первое

место в номинации Спасибо всем проголосовавшимPixologic известна как инноватор в областицифрового искусства и разработка Sculptris согла-суется с нашим желанием помочь художникам тво-рить не ограничивая себя техническими барьерами

Джимми ГОЛДИНГначальник отдела маркетинга Pixologic

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 2: FPS Magazine Issue 16

В АВГУСТЕ этого года в Ванкувере (Канада)прошла самая известная и самая престижнаяконференция и выставка компьютернойграфики SIGGRAPH 2011 АббревиатураSIGGRAPH расшифровывается как SpecialInterest Group on Graphics and InteractiveTechniques (laquoСпециальная Группа по ВопросамГрафических и Интерактивных Технологиийraquo)Выставка проводится организацией ACMSIGGRAPH с 1974 года в Лос-Анджелесе НовомОрлеане Сиэтле Далласе Бостоне и другихгородах США Ежегодно на нее приезжаюттысячи людей со всего мира а в последниегоды к ним прибавилась многомиллионнаяаудитория зрителей в Интернете

На SIGGRAPH съезжаются представителикрупных компаний демонстрируя новейшиеразработки в области компьютерной графикии анонсируя новые версии выпускаемых имипродуктов Кроме того на SIGGRAPHприезжают специалисты из крупныхуниверситетов которые представляют статьина темы имеющие отношение к CG Наконецэто место где встречаются и проводятмастер-классы лучшие 3D-художники Врамках SIGGRAPH также проводится фести-валь анимации и еще множество другихмероприятий

По традиции на SIGGRAPH 2011 былапредставлена новая версия спецификацииOpenGL ndash 42 Она включает обновление GLGLдо 420 а также содержит новые функциирасширяющие доступную функциональностьдля разработчиков и увеличивающиепроизводительность приложений

Рабочая станция HP Z800 на выставкеодновременно обрабатывала 12 потоков FullHD видео Это стало возможным благодаряобъединению сил компаний Fusion-io NVidiaThinkbox Software и Tweak Software соз-давшими творческий тандем специально дляSIGGRAPH 2011 Разработчики оснастили HPZ800 видеоускорителем NVidia QuadroPlex7000 а также твердотельными нако-пителями ioDrive Duos В системе былиустановлены также модули Fusion ioMemoryРезультат предсказуем mdash рабочая станция безмалейших laquoтормозовraquo или потерь качествадействительно обрабатывала одновременно12 потоков несжатого FullHD видео да еще сцветокоррекцией Твердотельные накопителибыли объединены в RAID массив с высокойпроизводительностью ioDrive Duos показалаотличный результат ndash три гигабайта в секунду

Интересно что система подобная этоймногими рассматривается как достойныйинструмент для графических дизайнеров ndashособенно для тех кто работает с 3DS MaxMaya Softimage и другими ресурсоемкимиприложениями Представители ThinkboxSoftware создавшие набор модулей Krakatoa20 MX для 3ds Max тоже неплохо отозвалисьо системе

Side Effects Software Inc объявили чтоDreamWorks приобрели неограниченнуюлицензию на пакет Houdini Это являетсяпродолжением практики использованияHoudini студией DreamWorks для созданиявизуальных эффектов и персонажей в своиханимационных фильмах Частью соглашенияявляется принятие участи Dreamworks вразработке продукта что позволит упроститьобмен интеллектуальной собственностьюмежду компаниями и согласовать усилия висследованиях Это сотрудничество нацеленона привнесение передовых и проверенных впроизводстве технологий в будущие релизыHoudini

laquoМы гордимся что DreamWorks Animationвыбрали наш продукт как приоритетныйинструмент для анимацииraquo ndash сказал КимДэвидсон президент и исполнительныйдиректор SES ndash Это захватывающий моментрасширения наших партнерских отношенийМы надеемся работать бок о бок еще долгиегодыraquo

Работая совместно обе компании хотятнайти новые пути развития в искусстве и наукесоздания фильмов Основанная на узлахпроцедурная архитектура Houdini позволитDreamWorks внедрить свои технологии вконвеер чтобы соответствовать растущим скаждым годом запросам анимационных иVFX-проектов

На SIGGRAPH 2011 был анонсирован выходHoudini 111 который станет переходнойверсией к Houdini 12 Обещают чтоособенностями Houdini 12 станут скорость ипроизводительность Достичь этих целейпомогут новый движок для работы сгеометрией а также задействование пос-ледних возможностей OpenGL Будут улуч-шены модули для просчета жидкостей иимитации ткани представлена вторая версиямодуля Pyro FX 20 для создания дыма и огняПо заявлениям SES Houdini 12 будет самымважнейшим релизом пакета когда-либовыпущенным

За последние двадцать лет топовые студиииспользовали награжденный американскойКиноакадемией пакет Houdini для созданиявизуальных эффектов ndash как в кино так и ванимационных фильмах Houdini наиболееизвестен своим процедурным рабочимпроцессом который поддерживает кактворческие так и технические аспектыкомпьютерной графики

Компания Maxon представила 13-ю версиюсвоего 3D-редактора Cinema 4D Основныеособенности релиза ndash новая физическаякамера многопроходный OpenEXR встроен-ное 3D-стерео улучшенная работа свнешними ссылками Xrefs

Компания Smith Micro Software объявила опредстоящем релизе программ Poser 9 и PoserPro 2012 В новой версии добавлен просчетподповерхностного рассеивания улучшенапроизводительность визуализации появиласьподдержка Weight Map Rigging Такжедобавлен набор инструментов дляредактирования Vertex Weight Map Такжестал возможен предварительный просмотрсцен в режиме реального времени

На выставке также представлена новаяверсия бенчмарка SPECapc (SPEC ApplicationPerformance Characterization) для AutodeskMaya 2012 Тест производительности дляпоследней версии 3D-редактора планируетсявыпустить до конца года А в следующем годубудет обновлено приложение для оцениванияпроизводительности графической подсисте-мы SPECviewperf Двенадцатая версияSPECviewperf будет поддерживать оба API ndashOpenGL и Direct3D а также многиеинтерактивные приложения Его можно будетбез труда портировать на другиеоперационные системы а добавлениетекстовых файлов станет проще На сайтеSPECapc (httpwwwspecorg) можно найтибенчмарки для более ранних версий Maya3DS Max SolidWorks и других программ

Компания Autodesk продемонстрировалапакет дополнений Subscription Advantage Packдля Maya 2012 Основная особенность ndashподдержка OpenCL Кроме того интег-рирован новый плагин Bullet PhysicsОбеспечивается поддержка всех возмож-ностей новейших графических процессоров отAMD Для справки SAP ndash это дополнениедоступное только для пользователей кото-рые дополнительно приобрели подписку напродукт

Pixar представила новую версию плагинаRenderMan для Maya который являетсяполностью интегрированным в пакетрендером Программа отличается от другихпродуктов линейки Pixar (таких какRenderMan Pro Server и RenderMan Studio)более низкой стоимостью и сравнительнойпростотой использования Плагин сможетпорадовать пользователей всеми совре-менными опциями которые присутствуют вхороших визуализаторах возможностьюпросчета глобального освещения эффектаподповерхностного рассеивания размытияпри движении и тд Обещают что вRenderMan для Maya войдут все последниетехнологии представленные в RenderMan ProServer 160 В частности существенноулучшена технология трассировки добавленыновые средства для освещения и повторнойвизуализации которые использовались вlaquoИстории игрушек 3raquo и laquoТачки 2raquo

Cebas Visual Technology Inc продемон-стрировала работу новой версии рендераFinalRender 4GPU Она использует технологиюNVidia CUDA с поддержкой GPU для ускорениявычислений Напомним что программы Сebasуспешно использовались при создании такихфильмов как laquoГарри Поттер и Дары СмертиЧасть I и IIraquo laquoТрансформерыraquo laquoЗеленыйфонарьraquo laquo2012raquo laquoАлиса в стране чудесraquolaquoПерси Джексон и Олимпийцыraquo laquoКошмар наулице Вязовraquo и laquoЖелезный человек 2raquo

Компания Tweak Software продемон-стрировала возможности новой версии своегопродукта RV ndash мощного вьювера изображенийдля VFX-художников и аниматоров Ключевыевозможности программы включают новыйlaquoпрезентационныйraquo режим позволяющийпросматривать материал на одном монитореа управлять просмотром ndash с другогоподдержку стерео 3D TV для HDMI 14a и DVIподдержку JavaScript ARRI Alexa ARRIRAW иRED RAW спецификации ACES (Academy ColorEncoding Specification) и CDL

Компания Imagination Technologies объяви-ла о предстоящем выпуске нового релизадвижка рендеринга Brazil В новой версииBrazil был переписан с нуля для увеличенияскорости Теперь пользователи могутредактировать laquoна летуraquo все что есть насцене в том числе модели источники светаматериалы и шейдеры Brazil построен наиспользовании OpenRL и ImaginationsRaytracing API и может использоваться налюбом оборудовании Карты и материалысозданные в Brazil RS 20 будут корректнооткрываться в новой версии программы

Компания Organic Motion представилановую версию системы захвата движенияOpenStage Эта система motion captureинтересна тем что для ее работы нетребуются маркеры Система способна делатьточный захват движений актера в реальномвремени и ему для этого не нужно одеватьспециальный костюм Немаловажная особен-ность системы ndash быстрая настройка

Кинофестиваль SIGGRAPH ndash один изнемногих которые объявляют свои призы нев финале а до самого анимационного шоуПоэтому победители были известны заранее

laquoЛучший фильмraquolaquoThe Fantastic Flying Books of Mr MorrisLessmoreraquo (Уильям Джойс и БрендонОлденбург Moonbot Studios)

laquoСпецприз жюриraquolaquoPaths of Hateraquo (Демиен Нено Platige Image)

laquoЛучший студенческий проектraquolaquoFlamingo Prideraquo (Томер Эшед The Konrad WolfPotsdam-Babelsberg Film and TelevisionUniversity)

laquoСпециальное поощрение жюриraquolaquoEscape of the Gingerbread Manraquo (Тод ПольсонThe Monk Studios)laquoThe Experience of Fliehkraftraquo (Тилл НовакFrameboX)

laquoСпециальные поощрения жюри в кате-гории laquoстуденческий проектraquolaquoDreamgiverraquo (Тайлер Картер Brigham YoungUniversity)laquoSweater Dograquo (Джина Моффит RinglingCollege of Art and Design)

По завершении тридцатьвосьмого SIGGRAPH оргкоми-тет подвел итоги Согласноофициальным данным выс-тавку посетило около 16 тысячзарегистрированных участни-ков среди которых ученыепрограммисты художники имультипликаторы Это рекордза все время проведенияSIGGRAPH в Ванкувере Навыставе и конференции былигости из 74 стран мира Cвоюпродукцию представили более155 компаний Среди них IntelNVidia AMD Autodesk GoogleHP Pixologic Khronos GroupPixar Animation Studios CebasMAXON Computer NewTekNext Limit Technologies идругие

Следующая выставка прой-дет в Лос-Анджелесе с 5 по 9августа 2012 года СайтSIGGRAPH 2012 уже работаетlaquoзаглянуть в будущееraquo можнотут s2012siggraphorg

Geckogecko0307gmailcom

За предоставленнуюинформацию благодарим

портал 3domencom

- 8 -

3D World один из ведущих журналов в мире3D-графики в сентябре вручил целую серию наград залучшие достижения 2010-11 гг в области разработкипрограммного и аппаратного обеспечения а также затворческие успехи в области иллюстративной графикианимации спецэффектов и архитектурной визуализацииВыбор жюри во многом оказался довольно любопытнымВ частности Blender Foundation достались сразу двенаграды ndash технологическая и творческая

laquoПрикладная программа годаraquoЛучшей новой программой был признан новый пакет

виртуальной лепки Sculptris Изначально это была инди-видуальная разработка программиста Томаса Петерсонакоторой он занимался в индивидуальном порядке с декабря2009 г Впоследствии Петерсон получил работу в компанииPixologic которая разрабатывает аналогичную по наз-начению программу ZBrush В результате между Sculptris иZBrush была налажена определенная доля совместимости ndashпректы из первого можно быстро экспортировать во второй

httpwwwpixologiccomsculptrisМы польщены тем что Sculptris занял первое

место в номинации Спасибо всем проголосовавшимPixologic известна как инноватор в областицифрового искусства и разработка Sculptris согла-суется с нашим желанием помочь художникам тво-рить не ограничивая себя техническими барьерами

Джимми ГОЛДИНГначальник отдела маркетинга Pixologic

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 3: FPS Magazine Issue 16

Интересно что система подобная этоймногими рассматривается как достойныйинструмент для графических дизайнеров ndashособенно для тех кто работает с 3DS MaxMaya Softimage и другими ресурсоемкимиприложениями Представители ThinkboxSoftware создавшие набор модулей Krakatoa20 MX для 3ds Max тоже неплохо отозвалисьо системе

Side Effects Software Inc объявили чтоDreamWorks приобрели неограниченнуюлицензию на пакет Houdini Это являетсяпродолжением практики использованияHoudini студией DreamWorks для созданиявизуальных эффектов и персонажей в своиханимационных фильмах Частью соглашенияявляется принятие участи Dreamworks вразработке продукта что позволит упроститьобмен интеллектуальной собственностьюмежду компаниями и согласовать усилия висследованиях Это сотрудничество нацеленона привнесение передовых и проверенных впроизводстве технологий в будущие релизыHoudini

laquoМы гордимся что DreamWorks Animationвыбрали наш продукт как приоритетныйинструмент для анимацииraquo ndash сказал КимДэвидсон президент и исполнительныйдиректор SES ndash Это захватывающий моментрасширения наших партнерских отношенийМы надеемся работать бок о бок еще долгиегодыraquo

Работая совместно обе компании хотятнайти новые пути развития в искусстве и наукесоздания фильмов Основанная на узлахпроцедурная архитектура Houdini позволитDreamWorks внедрить свои технологии вконвеер чтобы соответствовать растущим скаждым годом запросам анимационных иVFX-проектов

На SIGGRAPH 2011 был анонсирован выходHoudini 111 который станет переходнойверсией к Houdini 12 Обещают чтоособенностями Houdini 12 станут скорость ипроизводительность Достичь этих целейпомогут новый движок для работы сгеометрией а также задействование пос-ледних возможностей OpenGL Будут улуч-шены модули для просчета жидкостей иимитации ткани представлена вторая версиямодуля Pyro FX 20 для создания дыма и огняПо заявлениям SES Houdini 12 будет самымважнейшим релизом пакета когда-либовыпущенным

За последние двадцать лет топовые студиииспользовали награжденный американскойКиноакадемией пакет Houdini для созданиявизуальных эффектов ndash как в кино так и ванимационных фильмах Houdini наиболееизвестен своим процедурным рабочимпроцессом который поддерживает кактворческие так и технические аспектыкомпьютерной графики

Компания Maxon представила 13-ю версиюсвоего 3D-редактора Cinema 4D Основныеособенности релиза ndash новая физическаякамера многопроходный OpenEXR встроен-ное 3D-стерео улучшенная работа свнешними ссылками Xrefs

Компания Smith Micro Software объявила опредстоящем релизе программ Poser 9 и PoserPro 2012 В новой версии добавлен просчетподповерхностного рассеивания улучшенапроизводительность визуализации появиласьподдержка Weight Map Rigging Такжедобавлен набор инструментов дляредактирования Vertex Weight Map Такжестал возможен предварительный просмотрсцен в режиме реального времени

На выставке также представлена новаяверсия бенчмарка SPECapc (SPEC ApplicationPerformance Characterization) для AutodeskMaya 2012 Тест производительности дляпоследней версии 3D-редактора планируетсявыпустить до конца года А в следующем годубудет обновлено приложение для оцениванияпроизводительности графической подсисте-мы SPECviewperf Двенадцатая версияSPECviewperf будет поддерживать оба API ndashOpenGL и Direct3D а также многиеинтерактивные приложения Его можно будетбез труда портировать на другиеоперационные системы а добавлениетекстовых файлов станет проще На сайтеSPECapc (httpwwwspecorg) можно найтибенчмарки для более ранних версий Maya3DS Max SolidWorks и других программ

Компания Autodesk продемонстрировалапакет дополнений Subscription Advantage Packдля Maya 2012 Основная особенность ndashподдержка OpenCL Кроме того интег-рирован новый плагин Bullet PhysicsОбеспечивается поддержка всех возмож-ностей новейших графических процессоров отAMD Для справки SAP ndash это дополнениедоступное только для пользователей кото-рые дополнительно приобрели подписку напродукт

Pixar представила новую версию плагинаRenderMan для Maya который являетсяполностью интегрированным в пакетрендером Программа отличается от другихпродуктов линейки Pixar (таких какRenderMan Pro Server и RenderMan Studio)более низкой стоимостью и сравнительнойпростотой использования Плагин сможетпорадовать пользователей всеми совре-менными опциями которые присутствуют вхороших визуализаторах возможностьюпросчета глобального освещения эффектаподповерхностного рассеивания размытияпри движении и тд Обещают что вRenderMan для Maya войдут все последниетехнологии представленные в RenderMan ProServer 160 В частности существенноулучшена технология трассировки добавленыновые средства для освещения и повторнойвизуализации которые использовались вlaquoИстории игрушек 3raquo и laquoТачки 2raquo

Cebas Visual Technology Inc продемон-стрировала работу новой версии рендераFinalRender 4GPU Она использует технологиюNVidia CUDA с поддержкой GPU для ускорениявычислений Напомним что программы Сebasуспешно использовались при создании такихфильмов как laquoГарри Поттер и Дары СмертиЧасть I и IIraquo laquoТрансформерыraquo laquoЗеленыйфонарьraquo laquo2012raquo laquoАлиса в стране чудесraquolaquoПерси Джексон и Олимпийцыraquo laquoКошмар наулице Вязовraquo и laquoЖелезный человек 2raquo

Компания Tweak Software продемон-стрировала возможности новой версии своегопродукта RV ndash мощного вьювера изображенийдля VFX-художников и аниматоров Ключевыевозможности программы включают новыйlaquoпрезентационныйraquo режим позволяющийпросматривать материал на одном монитореа управлять просмотром ndash с другогоподдержку стерео 3D TV для HDMI 14a и DVIподдержку JavaScript ARRI Alexa ARRIRAW иRED RAW спецификации ACES (Academy ColorEncoding Specification) и CDL

Компания Imagination Technologies объяви-ла о предстоящем выпуске нового релизадвижка рендеринга Brazil В новой версииBrazil был переписан с нуля для увеличенияскорости Теперь пользователи могутредактировать laquoна летуraquo все что есть насцене в том числе модели источники светаматериалы и шейдеры Brazil построен наиспользовании OpenRL и ImaginationsRaytracing API и может использоваться налюбом оборудовании Карты и материалысозданные в Brazil RS 20 будут корректнооткрываться в новой версии программы

Компания Organic Motion представилановую версию системы захвата движенияOpenStage Эта система motion captureинтересна тем что для ее работы нетребуются маркеры Система способна делатьточный захват движений актера в реальномвремени и ему для этого не нужно одеватьспециальный костюм Немаловажная особен-ность системы ndash быстрая настройка

Кинофестиваль SIGGRAPH ndash один изнемногих которые объявляют свои призы нев финале а до самого анимационного шоуПоэтому победители были известны заранее

laquoЛучший фильмraquolaquoThe Fantastic Flying Books of Mr MorrisLessmoreraquo (Уильям Джойс и БрендонОлденбург Moonbot Studios)

laquoСпецприз жюриraquolaquoPaths of Hateraquo (Демиен Нено Platige Image)

laquoЛучший студенческий проектraquolaquoFlamingo Prideraquo (Томер Эшед The Konrad WolfPotsdam-Babelsberg Film and TelevisionUniversity)

laquoСпециальное поощрение жюриraquolaquoEscape of the Gingerbread Manraquo (Тод ПольсонThe Monk Studios)laquoThe Experience of Fliehkraftraquo (Тилл НовакFrameboX)

laquoСпециальные поощрения жюри в кате-гории laquoстуденческий проектraquolaquoDreamgiverraquo (Тайлер Картер Brigham YoungUniversity)laquoSweater Dograquo (Джина Моффит RinglingCollege of Art and Design)

По завершении тридцатьвосьмого SIGGRAPH оргкоми-тет подвел итоги Согласноофициальным данным выс-тавку посетило около 16 тысячзарегистрированных участни-ков среди которых ученыепрограммисты художники имультипликаторы Это рекордза все время проведенияSIGGRAPH в Ванкувере Навыставе и конференции былигости из 74 стран мира Cвоюпродукцию представили более155 компаний Среди них IntelNVidia AMD Autodesk GoogleHP Pixologic Khronos GroupPixar Animation Studios CebasMAXON Computer NewTekNext Limit Technologies идругие

Следующая выставка прой-дет в Лос-Анджелесе с 5 по 9августа 2012 года СайтSIGGRAPH 2012 уже работаетlaquoзаглянуть в будущееraquo можнотут s2012siggraphorg

Geckogecko0307gmailcom

За предоставленнуюинформацию благодарим

портал 3domencom

- 8 -

3D World один из ведущих журналов в мире3D-графики в сентябре вручил целую серию наград залучшие достижения 2010-11 гг в области разработкипрограммного и аппаратного обеспечения а также затворческие успехи в области иллюстративной графикианимации спецэффектов и архитектурной визуализацииВыбор жюри во многом оказался довольно любопытнымВ частности Blender Foundation достались сразу двенаграды ndash технологическая и творческая

laquoПрикладная программа годаraquoЛучшей новой программой был признан новый пакет

виртуальной лепки Sculptris Изначально это была инди-видуальная разработка программиста Томаса Петерсонакоторой он занимался в индивидуальном порядке с декабря2009 г Впоследствии Петерсон получил работу в компанииPixologic которая разрабатывает аналогичную по наз-начению программу ZBrush В результате между Sculptris иZBrush была налажена определенная доля совместимости ndashпректы из первого можно быстро экспортировать во второй

httpwwwpixologiccomsculptrisМы польщены тем что Sculptris занял первое

место в номинации Спасибо всем проголосовавшимPixologic известна как инноватор в областицифрового искусства и разработка Sculptris согла-суется с нашим желанием помочь художникам тво-рить не ограничивая себя техническими барьерами

Джимми ГОЛДИНГначальник отдела маркетинга Pixologic

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 4: FPS Magazine Issue 16

Компания Maxon представила 13-ю версиюсвоего 3D-редактора Cinema 4D Основныеособенности релиза ndash новая физическаякамера многопроходный OpenEXR встроен-ное 3D-стерео улучшенная работа свнешними ссылками Xrefs

Компания Smith Micro Software объявила опредстоящем релизе программ Poser 9 и PoserPro 2012 В новой версии добавлен просчетподповерхностного рассеивания улучшенапроизводительность визуализации появиласьподдержка Weight Map Rigging Такжедобавлен набор инструментов дляредактирования Vertex Weight Map Такжестал возможен предварительный просмотрсцен в режиме реального времени

На выставке также представлена новаяверсия бенчмарка SPECapc (SPEC ApplicationPerformance Characterization) для AutodeskMaya 2012 Тест производительности дляпоследней версии 3D-редактора планируетсявыпустить до конца года А в следующем годубудет обновлено приложение для оцениванияпроизводительности графической подсисте-мы SPECviewperf Двенадцатая версияSPECviewperf будет поддерживать оба API ndashOpenGL и Direct3D а также многиеинтерактивные приложения Его можно будетбез труда портировать на другиеоперационные системы а добавлениетекстовых файлов станет проще На сайтеSPECapc (httpwwwspecorg) можно найтибенчмарки для более ранних версий Maya3DS Max SolidWorks и других программ

Компания Autodesk продемонстрировалапакет дополнений Subscription Advantage Packдля Maya 2012 Основная особенность ndashподдержка OpenCL Кроме того интег-рирован новый плагин Bullet PhysicsОбеспечивается поддержка всех возмож-ностей новейших графических процессоров отAMD Для справки SAP ndash это дополнениедоступное только для пользователей кото-рые дополнительно приобрели подписку напродукт

Pixar представила новую версию плагинаRenderMan для Maya который являетсяполностью интегрированным в пакетрендером Программа отличается от другихпродуктов линейки Pixar (таких какRenderMan Pro Server и RenderMan Studio)более низкой стоимостью и сравнительнойпростотой использования Плагин сможетпорадовать пользователей всеми совре-менными опциями которые присутствуют вхороших визуализаторах возможностьюпросчета глобального освещения эффектаподповерхностного рассеивания размытияпри движении и тд Обещают что вRenderMan для Maya войдут все последниетехнологии представленные в RenderMan ProServer 160 В частности существенноулучшена технология трассировки добавленыновые средства для освещения и повторнойвизуализации которые использовались вlaquoИстории игрушек 3raquo и laquoТачки 2raquo

Cebas Visual Technology Inc продемон-стрировала работу новой версии рендераFinalRender 4GPU Она использует технологиюNVidia CUDA с поддержкой GPU для ускорениявычислений Напомним что программы Сebasуспешно использовались при создании такихфильмов как laquoГарри Поттер и Дары СмертиЧасть I и IIraquo laquoТрансформерыraquo laquoЗеленыйфонарьraquo laquo2012raquo laquoАлиса в стране чудесraquolaquoПерси Джексон и Олимпийцыraquo laquoКошмар наулице Вязовraquo и laquoЖелезный человек 2raquo

Компания Tweak Software продемон-стрировала возможности новой версии своегопродукта RV ndash мощного вьювера изображенийдля VFX-художников и аниматоров Ключевыевозможности программы включают новыйlaquoпрезентационныйraquo режим позволяющийпросматривать материал на одном монитореа управлять просмотром ndash с другогоподдержку стерео 3D TV для HDMI 14a и DVIподдержку JavaScript ARRI Alexa ARRIRAW иRED RAW спецификации ACES (Academy ColorEncoding Specification) и CDL

Компания Imagination Technologies объяви-ла о предстоящем выпуске нового релизадвижка рендеринга Brazil В новой версииBrazil был переписан с нуля для увеличенияскорости Теперь пользователи могутредактировать laquoна летуraquo все что есть насцене в том числе модели источники светаматериалы и шейдеры Brazil построен наиспользовании OpenRL и ImaginationsRaytracing API и может использоваться налюбом оборудовании Карты и материалысозданные в Brazil RS 20 будут корректнооткрываться в новой версии программы

Компания Organic Motion представилановую версию системы захвата движенияOpenStage Эта система motion captureинтересна тем что для ее работы нетребуются маркеры Система способна делатьточный захват движений актера в реальномвремени и ему для этого не нужно одеватьспециальный костюм Немаловажная особен-ность системы ndash быстрая настройка

Кинофестиваль SIGGRAPH ndash один изнемногих которые объявляют свои призы нев финале а до самого анимационного шоуПоэтому победители были известны заранее

laquoЛучший фильмraquolaquoThe Fantastic Flying Books of Mr MorrisLessmoreraquo (Уильям Джойс и БрендонОлденбург Moonbot Studios)

laquoСпецприз жюриraquolaquoPaths of Hateraquo (Демиен Нено Platige Image)

laquoЛучший студенческий проектraquolaquoFlamingo Prideraquo (Томер Эшед The Konrad WolfPotsdam-Babelsberg Film and TelevisionUniversity)

laquoСпециальное поощрение жюриraquolaquoEscape of the Gingerbread Manraquo (Тод ПольсонThe Monk Studios)laquoThe Experience of Fliehkraftraquo (Тилл НовакFrameboX)

laquoСпециальные поощрения жюри в кате-гории laquoстуденческий проектraquolaquoDreamgiverraquo (Тайлер Картер Brigham YoungUniversity)laquoSweater Dograquo (Джина Моффит RinglingCollege of Art and Design)

По завершении тридцатьвосьмого SIGGRAPH оргкоми-тет подвел итоги Согласноофициальным данным выс-тавку посетило около 16 тысячзарегистрированных участни-ков среди которых ученыепрограммисты художники имультипликаторы Это рекордза все время проведенияSIGGRAPH в Ванкувере Навыставе и конференции былигости из 74 стран мира Cвоюпродукцию представили более155 компаний Среди них IntelNVidia AMD Autodesk GoogleHP Pixologic Khronos GroupPixar Animation Studios CebasMAXON Computer NewTekNext Limit Technologies идругие

Следующая выставка прой-дет в Лос-Анджелесе с 5 по 9августа 2012 года СайтSIGGRAPH 2012 уже работаетlaquoзаглянуть в будущееraquo можнотут s2012siggraphorg

Geckogecko0307gmailcom

За предоставленнуюинформацию благодарим

портал 3domencom

- 8 -

3D World один из ведущих журналов в мире3D-графики в сентябре вручил целую серию наград залучшие достижения 2010-11 гг в области разработкипрограммного и аппаратного обеспечения а также затворческие успехи в области иллюстративной графикианимации спецэффектов и архитектурной визуализацииВыбор жюри во многом оказался довольно любопытнымВ частности Blender Foundation достались сразу двенаграды ndash технологическая и творческая

laquoПрикладная программа годаraquoЛучшей новой программой был признан новый пакет

виртуальной лепки Sculptris Изначально это была инди-видуальная разработка программиста Томаса Петерсонакоторой он занимался в индивидуальном порядке с декабря2009 г Впоследствии Петерсон получил работу в компанииPixologic которая разрабатывает аналогичную по наз-начению программу ZBrush В результате между Sculptris иZBrush была налажена определенная доля совместимости ndashпректы из первого можно быстро экспортировать во второй

httpwwwpixologiccomsculptrisМы польщены тем что Sculptris занял первое

место в номинации Спасибо всем проголосовавшимPixologic известна как инноватор в областицифрового искусства и разработка Sculptris согла-суется с нашим желанием помочь художникам тво-рить не ограничивая себя техническими барьерами

Джимми ГОЛДИНГначальник отдела маркетинга Pixologic

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 5: FPS Magazine Issue 16

Cebas Visual Technology Inc продемон-стрировала работу новой версии рендераFinalRender 4GPU Она использует технологиюNVidia CUDA с поддержкой GPU для ускорениявычислений Напомним что программы Сebasуспешно использовались при создании такихфильмов как laquoГарри Поттер и Дары СмертиЧасть I и IIraquo laquoТрансформерыraquo laquoЗеленыйфонарьraquo laquo2012raquo laquoАлиса в стране чудесraquolaquoПерси Джексон и Олимпийцыraquo laquoКошмар наулице Вязовraquo и laquoЖелезный человек 2raquo

Компания Tweak Software продемон-стрировала возможности новой версии своегопродукта RV ndash мощного вьювера изображенийдля VFX-художников и аниматоров Ключевыевозможности программы включают новыйlaquoпрезентационныйraquo режим позволяющийпросматривать материал на одном монитореа управлять просмотром ndash с другогоподдержку стерео 3D TV для HDMI 14a и DVIподдержку JavaScript ARRI Alexa ARRIRAW иRED RAW спецификации ACES (Academy ColorEncoding Specification) и CDL

Компания Imagination Technologies объяви-ла о предстоящем выпуске нового релизадвижка рендеринга Brazil В новой версииBrazil был переписан с нуля для увеличенияскорости Теперь пользователи могутредактировать laquoна летуraquo все что есть насцене в том числе модели источники светаматериалы и шейдеры Brazil построен наиспользовании OpenRL и ImaginationsRaytracing API и может использоваться налюбом оборудовании Карты и материалысозданные в Brazil RS 20 будут корректнооткрываться в новой версии программы

Компания Organic Motion представилановую версию системы захвата движенияOpenStage Эта система motion captureинтересна тем что для ее работы нетребуются маркеры Система способна делатьточный захват движений актера в реальномвремени и ему для этого не нужно одеватьспециальный костюм Немаловажная особен-ность системы ndash быстрая настройка

Кинофестиваль SIGGRAPH ndash один изнемногих которые объявляют свои призы нев финале а до самого анимационного шоуПоэтому победители были известны заранее

laquoЛучший фильмraquolaquoThe Fantastic Flying Books of Mr MorrisLessmoreraquo (Уильям Джойс и БрендонОлденбург Moonbot Studios)

laquoСпецприз жюриraquolaquoPaths of Hateraquo (Демиен Нено Platige Image)

laquoЛучший студенческий проектraquolaquoFlamingo Prideraquo (Томер Эшед The Konrad WolfPotsdam-Babelsberg Film and TelevisionUniversity)

laquoСпециальное поощрение жюриraquolaquoEscape of the Gingerbread Manraquo (Тод ПольсонThe Monk Studios)laquoThe Experience of Fliehkraftraquo (Тилл НовакFrameboX)

laquoСпециальные поощрения жюри в кате-гории laquoстуденческий проектraquolaquoDreamgiverraquo (Тайлер Картер Brigham YoungUniversity)laquoSweater Dograquo (Джина Моффит RinglingCollege of Art and Design)

По завершении тридцатьвосьмого SIGGRAPH оргкоми-тет подвел итоги Согласноофициальным данным выс-тавку посетило около 16 тысячзарегистрированных участни-ков среди которых ученыепрограммисты художники имультипликаторы Это рекордза все время проведенияSIGGRAPH в Ванкувере Навыставе и конференции былигости из 74 стран мира Cвоюпродукцию представили более155 компаний Среди них IntelNVidia AMD Autodesk GoogleHP Pixologic Khronos GroupPixar Animation Studios CebasMAXON Computer NewTekNext Limit Technologies идругие

Следующая выставка прой-дет в Лос-Анджелесе с 5 по 9августа 2012 года СайтSIGGRAPH 2012 уже работаетlaquoзаглянуть в будущееraquo можнотут s2012siggraphorg

Geckogecko0307gmailcom

За предоставленнуюинформацию благодарим

портал 3domencom

- 8 -

3D World один из ведущих журналов в мире3D-графики в сентябре вручил целую серию наград залучшие достижения 2010-11 гг в области разработкипрограммного и аппаратного обеспечения а также затворческие успехи в области иллюстративной графикианимации спецэффектов и архитектурной визуализацииВыбор жюри во многом оказался довольно любопытнымВ частности Blender Foundation достались сразу двенаграды ndash технологическая и творческая

laquoПрикладная программа годаraquoЛучшей новой программой был признан новый пакет

виртуальной лепки Sculptris Изначально это была инди-видуальная разработка программиста Томаса Петерсонакоторой он занимался в индивидуальном порядке с декабря2009 г Впоследствии Петерсон получил работу в компанииPixologic которая разрабатывает аналогичную по наз-начению программу ZBrush В результате между Sculptris иZBrush была налажена определенная доля совместимости ndashпректы из первого можно быстро экспортировать во второй

httpwwwpixologiccomsculptrisМы польщены тем что Sculptris занял первое

место в номинации Спасибо всем проголосовавшимPixologic известна как инноватор в областицифрового искусства и разработка Sculptris согла-суется с нашим желанием помочь художникам тво-рить не ограничивая себя техническими барьерами

Джимми ГОЛДИНГначальник отдела маркетинга Pixologic

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 6: FPS Magazine Issue 16

Кинофестиваль SIGGRAPH ndash один изнемногих которые объявляют свои призы нев финале а до самого анимационного шоуПоэтому победители были известны заранее

laquoЛучший фильмraquolaquoThe Fantastic Flying Books of Mr MorrisLessmoreraquo (Уильям Джойс и БрендонОлденбург Moonbot Studios)

laquoСпецприз жюриraquolaquoPaths of Hateraquo (Демиен Нено Platige Image)

laquoЛучший студенческий проектraquolaquoFlamingo Prideraquo (Томер Эшед The Konrad WolfPotsdam-Babelsberg Film and TelevisionUniversity)

laquoСпециальное поощрение жюриraquolaquoEscape of the Gingerbread Manraquo (Тод ПольсонThe Monk Studios)laquoThe Experience of Fliehkraftraquo (Тилл НовакFrameboX)

laquoСпециальные поощрения жюри в кате-гории laquoстуденческий проектraquolaquoDreamgiverraquo (Тайлер Картер Brigham YoungUniversity)laquoSweater Dograquo (Джина Моффит RinglingCollege of Art and Design)

По завершении тридцатьвосьмого SIGGRAPH оргкоми-тет подвел итоги Согласноофициальным данным выс-тавку посетило около 16 тысячзарегистрированных участни-ков среди которых ученыепрограммисты художники имультипликаторы Это рекордза все время проведенияSIGGRAPH в Ванкувере Навыставе и конференции былигости из 74 стран мира Cвоюпродукцию представили более155 компаний Среди них IntelNVidia AMD Autodesk GoogleHP Pixologic Khronos GroupPixar Animation Studios CebasMAXON Computer NewTekNext Limit Technologies идругие

Следующая выставка прой-дет в Лос-Анджелесе с 5 по 9августа 2012 года СайтSIGGRAPH 2012 уже работаетlaquoзаглянуть в будущееraquo можнотут s2012siggraphorg

Geckogecko0307gmailcom

За предоставленнуюинформацию благодарим

портал 3domencom

- 8 -

3D World один из ведущих журналов в мире3D-графики в сентябре вручил целую серию наград залучшие достижения 2010-11 гг в области разработкипрограммного и аппаратного обеспечения а также затворческие успехи в области иллюстративной графикианимации спецэффектов и архитектурной визуализацииВыбор жюри во многом оказался довольно любопытнымВ частности Blender Foundation достались сразу двенаграды ndash технологическая и творческая

laquoПрикладная программа годаraquoЛучшей новой программой был признан новый пакет

виртуальной лепки Sculptris Изначально это была инди-видуальная разработка программиста Томаса Петерсонакоторой он занимался в индивидуальном порядке с декабря2009 г Впоследствии Петерсон получил работу в компанииPixologic которая разрабатывает аналогичную по наз-начению программу ZBrush В результате между Sculptris иZBrush была налажена определенная доля совместимости ndashпректы из первого можно быстро экспортировать во второй

httpwwwpixologiccomsculptrisМы польщены тем что Sculptris занял первое

место в номинации Спасибо всем проголосовавшимPixologic известна как инноватор в областицифрового искусства и разработка Sculptris согла-суется с нашим желанием помочь художникам тво-рить не ограничивая себя техническими барьерами

Джимми ГОЛДИНГначальник отдела маркетинга Pixologic

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 7: FPS Magazine Issue 16

- 8 -

3D World один из ведущих журналов в мире3D-графики в сентябре вручил целую серию наград залучшие достижения 2010-11 гг в области разработкипрограммного и аппаратного обеспечения а также затворческие успехи в области иллюстративной графикианимации спецэффектов и архитектурной визуализацииВыбор жюри во многом оказался довольно любопытнымВ частности Blender Foundation достались сразу двенаграды ndash технологическая и творческая

laquoПрикладная программа годаraquoЛучшей новой программой был признан новый пакет

виртуальной лепки Sculptris Изначально это была инди-видуальная разработка программиста Томаса Петерсонакоторой он занимался в индивидуальном порядке с декабря2009 г Впоследствии Петерсон получил работу в компанииPixologic которая разрабатывает аналогичную по наз-начению программу ZBrush В результате между Sculptris иZBrush была налажена определенная доля совместимости ndashпректы из первого можно быстро экспортировать во второй

httpwwwpixologiccomsculptrisМы польщены тем что Sculptris занял первое

место в номинации Спасибо всем проголосовавшимPixologic известна как инноватор в областицифрового искусства и разработка Sculptris согла-суется с нашим желанием помочь художникам тво-рить не ограничивая себя техническими барьерами

Джимми ГОЛДИНГначальник отдела маркетинга Pixologic

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 8: FPS Magazine Issue 16

- 9 -

laquoОбновление годаraquoЛучшим обновлением ПО была по праву признана новая

версия Blender 25 поднявшая этот пакет на ступень выше ипоставив в один ряд с профессиональными коммерческимианалогами Blender ndash прекрасный пример удачного подхода кразработке программного обеспечения истинный шедеврсовременного свободного ПО

httpblenderorg

Мы получили множество положительных

отзывов за этот проект по пересмотрупользовательского интерфейса и инструментовпакета Это была сложная задача более трех летработы ndash далеко не все бесплатные и открытыепроекты могут похвастаться подобным Офици-альное признание со стороны 3D World мывоспринимаем как жест благодарности за этоттруд

Тон РОЗЕНДАЛЬглава Blender Foundation

laquoПлагин годаraquoЗвание лучшего плагина досталось физическому движку

Lagoa Multiphysics

httpwwwvimeocomchannelslagoausersМы довольны признанием и поддержкой которую

получил Lagoa Multiphysics Огромное спасибо всем кто далнам возможность внести свой вклад в индустрию

Тьяго КОСТАпрограммист Lagoa Technologies

laquoПолнометражный фильм годаraquoПобедителем в этой номинации стал мультфильм Гора

Вербински laquoРангоraquo (ILMParamount Pictures) с ДжонниДеппом озвучивающим главного героя ndash хамелеона покличке Ранго

httpwwwrangomoviecomБольшое спасибо 3D World за эту награду laquoРангоraquo

стал уникальным опытом для ILM Этот фильм помог намизучить все тонкости работы над крупным проектом Я хочупоздравить всех художников студии и поблагодарить за ихвклад

Тим АЛЕКСАНДЕРответственный за визуальные эффекты

Industrial Light amp Magic

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 9: FPS Magazine Issue 16

- 10 -

laquoКороткометражный фильм годаraquoЭта награда досталась третьему открытому фильму

Blender Foundation ndash laquoСинтелraquo (режиссер Колин Леви)который в очередной раз доказал что Blender отличноподходит для серьезного кинематографа

httpwwwsintelorgНаши открытые фильмы всегда были

захватывающими экспериментами попыткойрасширить границы для Blender В случае с laquoСинтелraquoавторы к тому же получили дополнительныйвызов ndash использовать альфа-версию Blender 25находившуюся в разработке Технически фильмсодержит кое-какие недоработки но с творческойточки зрения ndash это весьма выдающаяся работаСпасибо вам за награду

Тон РОЗЕНДАЛЬглава Blender Foundation

продюсер laquoСинтелraquo

laquoПрограммной инновацией годаraquo названа платформаGenesis для пакета DAZ Studio 4 Моделированиечеловекоподобных фигур ndash достаточно трудное занятие иGenesis представляет собой очередное средство экономииусилий во время этого процесса

laquoАппаратной инновацией годаraquo признаны процессорыIntel Core i7 столь полюбившиеся всем laquoтрехмерщикамraquo

laquoЛучший игровой трейлер годаraquo ndash дебютный ролик кTomb Raider Turning Point Трехминутное видео более годасоздавалось на студии Visual Works расположенной в Токиои принадлежайщей Square Enix

Ну и напоследок laquoЛучшая игровая графика годаraquo ndashCrysis 2 Кто-то удивлен

httpwww3dworldmagcom

Тимур ГАФАРОВtgafaroffgmailcom

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 10: FPS Magazine Issue 16

- 11 -

BlenderНовости

СВОБОДНЫЙ пакет трехмерного моделирования Blenderстремительно развивается и обновляется Этим летом наSIGGRAPH 2011 глава Blender Foundation Тон Розендальогласил планы по дальнейшему развитию программыохватывающие технические и организационные вопросы

Во-первых было решено начать работу по подготовкеновой версии Blender 26 В первую очередь в нее былавнесена laquoперечнаяraquo ветка SVN (Pepper branch) котораявключает несколько проектов Google Summer of Code 2011Основные особенности релиза

Поддержка трехмерного звука Интернационализация (поддержка нелатинских алфавитов) Улучшенная поддержка формата COLLADA Библиотека поиска пути Recast amp Detour для BGE Множество улучшений в редакторе узлов в системеанимации инструментах развесовки и тд

Вторым знаковым проектом является переписываниесистемы композитинга за которое взялся Йерун БаккерИспользующий OpenCL прототип был продемонстрированпрошлой осенью на Blender Conference и вызвал настолькоживой отклик что спустя несколько месяцев Баккер заручился

финансовой поддержкой сообщества и приступил к работеразбив реализацию проекта на несколько этапов На первом ивтором этапах система композитинга в Blender превратилась вмозаичную Если раньше расссчет узла выполнялся толькопосле того как был полностью рассчитан предыдущий тосейчас данные передаются по мере готовности каждого тайлаСамо собой мозаичная система также заметно упрощаетбалансировку нагрузки На третьем и четвертом этапах наOpenCL переписываются основные узлы На последнем пятомвсе прочие

Важность этого проекта оказалась так велика что фондBlender ускорил внедрение системы ежемесячной подпискипри которой пользователи сами выбирают как много денегони жертвуют проекту Поступающие в фонд средствараспределяются по критически важным проектам и новаясистема композитинга ndash один из них

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 11: FPS Magazine Issue 16

- 12 -

В долгосрочной перспективе также находится интеграцияBmesh и других не менее интересных разработок в числекоторых новая система рендеринга Cycles инструментвоксельной лепки Unlimited Clay поддержка физическогодвижка Bullet для оффлайн-рендеринга новые инструментыдля работы с кривыми (Nurbana) и булевыми операциями(Carve-booleans) NPR-рендеринг (Freestyle) и многое другоеЭто также предусматривает внесение кода прошлых инынешних проектов GSoC в основную ветку программы

Система Bmesh является одним из самых востребованныхэкспериментальных проектов разрабатываемых для BlenderЭто по сути новое ядро полигонального моделированияпредставляющее собой улучшенный подход к операциямредактирования полигональной сетки Множество такихопераций ранее были либо принципиально недоступны вBlender либо опирались на laquoкостылиraquo и пользоваться имибыло практически невозможно К этому относится напримеротсутствие прямой поддержки полигонов с более чемчетырьмя вершинами Хотя наличие таких элементов вфинальной геометрии как правило не приветствуется впроцессе создания топологии возможность манипулированияразличными многоугольниками освобождает моделлера отрутинного (и совсем необязательного в процессе творчества)laquoпричесыванияraquo сетки Bmesh призван исправить эту ситуациювнося полноценную поддержку N-гонов и всех необходимыхопераций над ними Для полигонального моделлинга Bmeshявляется очень значительным шагом вперед он без сомненияупростит и ускорит работу с геометрией что привлечет кBlender немало новых пользователей

Проект по laquoглубокойraquo интеграции Bullet носящий названиеBullet Construction Toolkit ставит целью упрощениеиспользования физики при рендеринге а также более тесноеее связывание с системой анимации Напомним что в текущейверсии Blender физика напрямую поддерживается только врамках игрового движка BGE

Маркетинговая часть нововведений Blender Foundationподразумевает начало выпуска ежеквартального техническогожурнала laquoBlender Proceedingsraquo в котором будет подробноосвещаться что происходит в проекте какие новые функциидобавлены какие изменения внесены в API и т д Ожидаетсячто финансирование этого проекта будет осуществляться засчет платной подписки на издание

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 12: FPS Magazine Issue 16

- 13 -

Кроме того был анонсирован новый открытый фильм ndashпроект Mango На данный момент о нем мало что сообщаетсяизвестно лишь что это будет короткометражный фильм вжанре научной фантастики с участием реальных актеров ииспользованием Blender для создания спецэффектов Ввидусложности проекта предполагается сократить длительностьфильма с обычных 10 до 5-6 минут Режиссер картины ndash ЯнХьюберт текущей работой которого является Project London ndashфанастический фильм снятый с применением Blender инаходящийся в настоящий момент на этапе пост-продакшн Повсей видимости именно это стало решающим фактором привыборе режиссера для проекта Mango Кстати многиеизвестные разработчики из сообщества Blender уже выразилизаинтересованность в участии в проекте Среди них ndash НиколасБишоп Сергей Шарыбин Брехт ван Ломмель КэмпбеллБартон и Йерун Баккер

Наконец был запланирован запуск профессиональнойсоциальной сети Blender Network ndash партнерской программыглавная задача которой состоит в упрощении поискаразработчиков для коммерческих разработок на основеBlender Эта концепция была предложена еще на BlenderConference 2010 Планируется три типа аккаунтов дляучащихся фрилансеров и профессионалов (последние два ndashплатные за счет этих средств будут окупаться техническиезатраты и поддержка) Участники сети (художники аниматорыпрограммисты консультанты специалисты по спецэффектам)смогут выполнять оплачиваемые задания различнойсложности

Вы разрабатываете перспективный проект Открылиинтересный сайт Хотите laquoраскрутитьraquo свою команду илистудию Мы Вам поможем

Спецпредложение от laquoFPSraquo

laquoFPSraquo предлагает уникальную возможность совершенно БЕСПЛАТНОразместить на страницах журнала рекламу Вашего проекта При этом от Вастребуется минимум

Соответствие рекламируемого общей тематике журнала Это можетбыть игра программное обеспечение для разработчиков какой-либо движокили SDK а также любой другой ресурс в рамках игростроя (включая сайты попрограммированию графике звуку и тд) Заявки не отвечающие этомутребованию рассматриваться не будут

Готовый баннер или рекламный лист Для баннеров приемлемоеразрешение 800x200 (формат JPG сжатие 100) Для рекламных листов mdash1000x700 (формат JPG сжатие 90) Содержание mdash произвольное но невыходящее за рамки общепринятого и соответствующее грамматическимнормам Совет к созданию рекламного листа рекомендуем отнестисьответственно Если не можете сами качественно оформить рекламу найдитеподходящего художника laquoГолыйraquo текст без графики и оформления непринимается

Краткое описание Вашего проекта и mdash обязательно mdash ссылка насоответствующий сайт (рекламу без ссылки не публикуем)

Заявки на рекламу принимаются на почтовый ящик редакцииgecko0307gmailcom (просьба в качестве темы указывать laquoСотрудничество сFPSraquo а не просто laquoРекламаraquo так как письмо может отсеять спам-фильтр)

Прикрепленные материалы (рекламный лист информация и пр) могут бытькак прикреплены к письму так и загружены на какой-либо надежный сервер(убедительная просьба не использовать RapidShare DepositFiles Letitbit идругие подобные файлохранилища mdash загружайте файлы на свой сайт илиftp-сервер и присылайте статические ссылки) Все материалы желательноархивировать в формате zip rar 7z targz tarbz2 или tarlzma

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 13: FPS Magazine Issue 16

- 14 -

laquoНет дыма без огняraquoСимуляция огня в Blender

В laquoFPSraquo 10 (10) мы рассмотрели нашумевшую новинку вBlender 25 ndash симуляцию дыма Эту же систему можноиспользовать для самых разных эффектов и не в последнююочередь ndash для создания красивого реалистичного огня Ранееогонь приходилось моделировать только при помощи обычныхчастиц без учета физики ndash это разумеется сказывалось накачестве результата не самым лучшим образом

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

1 В качестве источника огня лучше использовать какой-нибудьсравнительно сложный объект На первых порах для этой целисойдет примитив Сьюзанн Добавьте объект и в настройкахфизики сделайте его источником дыма (система частиц появитсяавтоматически) Добавьте также на сцену domain-куб

2 Для системы частиц можно использовать следующиенастройки 100000 частиц продолжительность жизни 6 кадровЗатем настройки ускорения Velocity нужно уменьшить ускорениепо нормали (Normal) и добавить случайного (Random) Лучше неиспользовать слишком большие значения так как симулятордыма в этом отношении весьма чувствителен Я выставил Emission-gt Random на 05 Velocity -gt Normal на 024 и Velocity -gt Randomна 01

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 14: FPS Magazine Issue 16

- 15 -

Теперь уберите гравитацию в настройках Field Weightsпоставьте Render на None ndash и Display по своему вкусу

3 Теперь настроим источник дыма Чтобы получить быстроподнимающийся огонь можно увеличить Smoke -gt Temp Diff до20 Его можно понизить чтобы получить эффект замедленностидвижения (slow motion) Это значение также зависит от размерамоделируемого пламени Включите также Smoke -gt Initial Velocity(наша система частиц заточена для получения начальногоускорения)

4 Теперь настройки domain-куба Самое важное здесь ndashвключить опцию Smoke -gt Dissolve Это заставит дым медленнорассеиваться создавая очень похожий на огонь эффект Япоставил Smoke -gt Time на 5 Вы можете менять это значениеосновываясь на том насколько мал источник огня и наскольковысокое нужно пламя Разрешение симуляции (Smoke HighResolution -gt Resolution) остается за вами Для теста напримерсойдет небольшое значение ndash 3 или 4 Обратите внимание чторазрешение серьезно влияет на внешний вид эффекта Поэтомупостоянное использование высокого разрешения ndash не лучшийвариант Высокое разрешение создает много маленьких язычковпламени что порой выглядит не реалистично Поэтомууменьшайте или увеличивайте разрешение в зависимости отразмера огня

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 15: FPS Magazine Issue 16

- 16 -

Не менее важно для создания огня переключить методсимуляции на FFT В некоторых сборках FFT почему-то нет (впоследней используемой мною версии ndash 260 rc1 ndash она есть) Нарисунке вы можете видеть сравнение между методами Wavelet иFFT Во многих случаях они почти идентичны ndash но FFT немногорезче и поэтому лучше для огня

5 Самое интересное ndash подобрать правильный материал дляогня Хитрость в том чтобы использовать значение плотностидыма (density) в качестве значения свечения (emission) Дымисчезает настолько быстро что не успевает потерять форму ndash втакой ситуации он очень похож на пламя

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 16: FPS Magazine Issue 16

- 17 -

В настройках материала domain-куба я использовалдостаточно небольшие значения Density -gt Density Scale иShading -gt Scattering ndash 4 и 06 соответственно Density -gt Densityвыставьте на 0 Shading -gt Emission установите между 2 и 10 взависимости от того насколько яркий огонь вы хотите

6 Настроим текстуру огня Добавьте такую же текстуру какуюиспользуют для создания дыма Она будет влиять только наплотность

Затем добавьте еще одну текстуру которая будетконтролировать яркость и цвет свечения Тип текстуры тот же(Voxel Data с объектом дыма Cube) На вкладке Influenceвключите только Emission и Emission Color Поменяйте Blend наMultiply ndash так мы можем уменьшить свечение там где плотностьнизкая и увеличить ndash где высокая Таким образом яркость огняосновывается на плотности

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 17: FPS Magazine Issue 16

- 18 -

Теперь самое важное На вкладке Colors включите Rampчтобы использовать градиент для контроля яркости и цвета огняВыставьте цвета примерно как на скриншоте

Левая сторона градиента равна нулю плотности а правая ndashединице Там где плотность высокая огонь будет яркий иlaquoгорячийraquo а там где низкая ndash уже laquoхолоднееraquo Вы можетепередвинуть левую сторону градиента вправо чтобы добавитьдыма Если вы остановитесь на середине то все с плотностьюниже 05 будет рендериться как обычный дым без какого-либосвечения

7 Включите воспроизведение анимации и дождитесь покадым поднимется повыше После этого можно остановитьвоспроизведение и отрендерить кадр

8 Для пущей красоты можно добавить пост-обработку Вредакторе узлов включите композитные узлы (CompositingNodes)

Эффектом пост-обработки который мы добавим будетпростое свечение которое сделает наш огонь ярче Я такжеиспользовал два узла блеска (Glare) чтобы создатьсбалансированный но приятный эффект сияния

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 18: FPS Magazine Issue 16

- 19 -

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 19: FPS Magazine Issue 16

- 20 -

Кстати если вы переключите тип предпросмотра материала наlaquoКубraquo то увидите маленькое изображение того что творитсявнутри domain Это может быть полезно при настройке градиентана цветовой рампе Одно плохо ndash его нельзя увеличить

Справа ndash законченный результат работы Желаю вам твор-ческих успехов

Geckogecko0307gmailcom

Оригинал урокаwwwmiikahwebcom

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 20: FPS Magazine Issue 16

- 21 -

Grease ScatterВ Blender есть один малоизвестный но любопытный

инструмент ndash Grease Pencil (laquoВосковый карандашraquo) Он позволяетсвободно рисовать прямо на трехмерной сцене произвольныепометки стрелки аннотации схемы подсказки и т д

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

Название laquoGrease Pencilraquo было взято в дань уважениявосковым мелкам которыми первые CG-аниматоры пользовалисьдля рисования плановых пометок на своих CRT Восковыйкарандаш также может пригодиться как инструмент руководителядля замечаний и правки а также в качестве инструментапреподавателей ndash как своеобразная laquoклассная доскаraquo Наброскисделанные Восковым карандашом могут быть преобразованы вкривые и даже в трехмерную модель

Оригинальное применение Восковый карандаш получил внедавно вошедшем в состав Blender дополнении Grease Scatter

Оно изначально было разработано для работы над фильмомlaquoСинтелraquo С его помощью можно моделировать разбросанныемелкие предметы ndash камешки осколки зерно стружку конфетти итд Такие детали могут значительно повысить реалистичностьсцен особенно тех которые воспроизводят открытыепространства ndash ведь редко встретишь такое место на улице где небыло бы всякого мелкого мусора Это дополнение используетштрихи Grease Pencil для управления laquoразбрасываниемraquo

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 21: FPS Magazine Issue 16

- 22 -

1 Активируйте дополнениеUser Preferences -gt Addons -gt Object -gt Grease Scatter Objects

2 Создайте несколько простых по форме объектов которыебудут служить частицами нашего будущего laquoмусораraquo

3 Выделите их и нажмите Ctrl+G чтобы сгруппироватьОбъекты при этом будут обведены зеленым контуром На панелиинструментов введите имя для группы ndash это важно так как GreaseScatter принимает его в качестве параметра

4 Теперь нужна какая-то основа на которой будут разбросаныобъекты Отодвиньте их в сторону и создайте что-нибудьнаподобие фрагмента стены со сложной конфигурацией Назовемее условно laquoархитектуройraquo Масштаб пока соблюдатьнеобязательно

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 22: FPS Magazine Issue 16

- 23 -

5 Нажмите N в окне 3D-вида чтобы вызвать панель свойствНа вкладке Grease Pencil создайте новый слой рисования (кнопкаNew Layer) Drawing Settings переключите на Surface чтобыштрихи ложились на поверхность меша На панели инстурментов(под указателем laquoGrease Pencilraquo) нажмите Draw и активируйтережим Use Sketching Sessions чтобы наносить несколько штриховподряд

6 Не снимая выделение с laquoархитектурыraquo нарисуйте в окне3D-вида штрихи которые должны обозначать местаразбрасывания Это как правило углы и участки вдоль стен ndashименно там обычно скапливается мусор При этом вы можете какобычно поворачивать и перемещать точку обзора при помощимыши Обратите внимание что штрихи Воскового карандашабудут автоматически проецироваться на поверхность объекта

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 23: FPS Magazine Issue 16

- 24 -

7 Теперь (опять-таки не снимая выделение) нажмите Ctrl+A ивыберите Mesh -gt Grease Pencil Scatter Введите имя группы вполе Group и нажмите OK

Теперь можно уменьшить объекты laquoмусораraquo до нужногоразмера ndash все изменения объектов-источников коснутся ихвиртуальных копий Выделять их удобно из менеджера объектов(Outliner)

8 Можно изменить материалы объектов-источников добавитьим модификаторы сглаживания и тд

Geckogecko0307gmailcom

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 24: FPS Magazine Issue 16

- 25 -

Cycles Первые шагиМногие пользователи Blender наверняка уже знают что в

последнее время активно ведется разработка Cycles ndashдолгосрочного проекта по созданию новой системы рендеринга назамену устаревающему Blender Internal Основной laquoкозырьraquo Cyclesподдержка аппаратного ускорения на GPU которое в идеалепозволяет рендерить практически в реальном времени сминимальными задержками между итерациями при редак-тировании сцены По признанию автора Cycles Брехта ванЛоммеля который ради этого проекта вернулся на постояннуюработу в Blender Foundation новый рендер являетсяпромежуточным эволюционным звеном между безком-промиссным трассировщиком и полностью программируемымдвижком в стиле RenderMan В частности в Cycles есть физическикорректная система шейдинга полностью основанная на узлах

В настоящее время Cycles использует NVidia CUDA и OpenCLАрхитектура нового движка подразумевает возможностьодновременного использования разных устройств ndash от GPU досетевых рендер-ферм Ожидается что работа по интеграции Cyclesв Blender будет вестись до конца этого года после чего Брехтпереключится сначала на оптимизацию скорости работы а затемна реализацию прочей запланированной функциональностиlaquoПобочным эффектомraquo этого проекта является реорганизация APIрендеринга которая позволит еще теснее интегрировать внешниеподключаемые движки ndash такие как LuxRender Aqsis Mitsuba иYafaRay

На данный момент Cycles нестабилен и находится на стадииранней альфа-версии Однако попробовать его в действии можетлюбой желающий скачав соответствующую сборку Blender сзамечательного сервиса GraphicAllorg Я к примеру скачалBlender 2593 r40422 для Linuxi386 (httpgraphicallorg645)

Для запуска сборки на моей системе мне пришлось снабдитьпрограмму более свежей версией glibc а также написать такойshell-скрипт

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=blender

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

PYTHONPATH=$BF_DIST_BIN259python

PYTHONHOME=$BF_DIST_BIN259python

BLENDER_SYSTEM_SCRIPTS=$BF_DIST_BIN259scripts

export LD_LIBRARY_PATH PYTHONPATH PYTHONHOME

export BLENDER_SYSTEM_SCRIPTS

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Этот скрипт можно запускать по символьной ссылке иликнопкой запуска с рабочего стола GNOME

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 25: FPS Magazine Issue 16

- 26 -

В этой статье мы рассмотрим основные принципы Cyclesглобальное освещение и BSDF Для тех кто не в курсе глобальноеосвещение (global illumination GI) ndash это алгоритмы которыеиспользуются при рендеринге для более реалистичной имитациисвета Они учитывают не только прямой свет от источника (directillumination) но и отраженный свет от различных поверхностей(indirect illumination) В Blender Internal есть несколько laquoфокусовraquoдля имитации GI (в частности environment lighting) но они далекиот совершенства В Blender 24x был правда движок radiocityпозволявший запекать фотонное проецирование в текстуруоднако он был довольно плохо интегрирован в существующуюсистему рендеринга ndash после любых изменений сцены приходилосьрассчитывать GI заново а это требовало дополнительныхтелодвижений перед тем как нажать заветную клавишу F12Любителям фотореализма оставалось использовать YafaRayLuxRender и другие внешние трассировщики ndash но и там были своиlaquoподводные камниraquo Блендеру был нужен встроенный движок GI ndashтакой как например mental ray в 3ds Max В этой ситуациипоявление Cycles оказалось как нельзя кстати

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 26: FPS Magazine Issue 16

- 27 -

С первого раза Cycles немного непривычен и что называетсяlaquoнеинтуитивенraquo Настройки рендеринга по умолчанию не даютсколько-нибудь качественного результата ndash поначалу это сбивает столку

Общая тусклость ndash оттого что источник света сцены поумолчанию не работает в Cycles Выделите его и в настройкахLamp включите Use Nodes на вкладке Surface Выберите Emissionцвет сделайте белым параметр Strenght увеличьте до несколькихсотен (700-900) Качество картинки можно повысить увеличивчисло сэмплов на пиксель В настройках рендеринга (на вкладкеIntegrator) увеличьте Samples -gt Render до 50 Кроме того можноиспользовать пресет Full Global Illimination

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 27: FPS Magazine Issue 16

- 28 -

Пока вы используете точечный источник света вы будетеполучать четкие тени Для более реалистичного результатаследует заменить его объемным Для этого можно использоватьикосферу (Icosphere) Сделайте ее дочерней для лампы иуменьшите до нужного размера В настройках материалавыставьте те же настройки что и для лампы Саму лампу можноотключить для рендеринга в Outlinerе

Один точечный источник света создает резкую теньОбъемный источник света создает области полутени и тени Приэтом область тени меньше чем в случае с точечным источникомсвета

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 28: FPS Magazine Issue 16

- 29 -

Чтобы сделать изображение в целом посветлее можноувеличить яркость фонового свечения

В Cycles есть различные модели освещения для материалов (втерминологии движка ndash BSDF Bidirectional scattering distributionfunction ndash двунаправленная функция распределения рассеивания)Их пока не так много но минимальный набор уже имеетсяНапример здесь я применил к красной сфере модель Бекмана(Beckmann) ndash подробнее о ней вы можете узнать в FPS 14 11

Конечно Cycles пока носит экспериментальный характерМаловато настроек нет предпросмотра материалов Но разра-ботка не стоит на месте laquoофициальнуюraquo интеграцию движкаобещают уже в Blender 261 в декабре месяце На мой взгляд естьвсе основания для оптимизма

Geckogecko0307gmailcom

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 29: FPS Magazine Issue 16

- 30 -

В последние годы растет популярность Blender какинструмента архитекторов О реальном применениипрограммы для градостроительного проектирования можнобыло прочитать уже пять лет назад а развитие LuxRender иYafaRay сделало Blender конкурентоспособным инстру-ментом архитектурной визуализации Темпы роста интересак программе тем не менее сдерживаются не тольконекоторыми ограничениями в самом приложении но ипроблемами с возможностью открывать в Blender файлыпроприетарного ПО

Молодой нидерландский архитектор и программистТомас Крийнен (Thomas Krijnen) начал в этом году проектIfcOpenShell представляющий собой библиотеку для чтенияи записи файлов IFC ndash открытого формата наряду с gbXMLиспользуемого в методологии информационного модели-рования зданий (BIM) Эта методология интерес к которой виндустрии тоже растет позволяет использовать в рабочихпроцессах произвольное ПО что повышает шансы Blender назанятие более прочной позиции в индустрии

Томас уже взаимодействует с участниками проектовBIMserver и osBIM но в своем собственном проекте он покачто один Поэтому несколько недель назад разработчикопубликовал обращение к сообществу в котором попросилпосильно поучаствовать в проекте Его интересуют не толькопатчи но и сообщения об ошибках тестовые файлы и тд

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

Расскажи немного о себе

Меня зовут Томас Крийнен Помимо проекта IfcOpenShellя работаю над степенью магистра в техническомуниверситете города Эйндховен Нидерланды Мой основнойучебный курс объединяет архитектуру и IT

В этом году ты начал новый проект IfcOpenShell ВBlender уже есть поддержка формата gbXML(предоставляемая к примеру проектом BlendME наряду сдругими laquoстроительнымиraquo дополнениями) Откуда интерск IFC Это как-то связано с твоими коммерческимипроектами

В индустрии AEC (Architecture Engineering andConstruction) долгое время были распространены закрытыеформаты файлов а способность к взаимодействию междуПО была так себе Так что у свободного ПО было крайнемало шансов стать инструментарием архитекторов истроителей Насколько я моуг судить в какой-то моментиндустрия сделала шаг навстречу открытым стандартамтаким как IFC и gbXML (или только собирается сделать аможет быть все же сделала но еще передумает) Этистандарты как и методология BIM (Building Information

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 30: FPS Magazine Issue 16

- 31 -

Modeling информационное моделирование зданий) делаютвозможным модульное использование ПО что дляUNIX-систем является нормой вот уже несколько десятковлет

Я представляю себе экосистему взаимодействующегомодульного софта где каждое приложение выполняет четкоопределенную задачу Например в ней может бытьинновационное приложение X для генеративного дизайнасоздающее контуры которые затем рассматриваются впрограмме для структурного анализа Y на основе чего впрограмме Z рисуется остальная часть здания которая затемрендерится в программе W чертится в программе Vхранится и анализируется на предмет ошибок в Uпросматривается клиентами в T ну и тд Каждое из нихпередает данные без потери информации и пользовательсам выбирает какое приложение использовать в каждомслучае ndash закрытое или свободное А еще я думаю что вот-вотрак на горе свистнет )

Уже существуют некоторые открытые решения дляработы с IFC Автор блога cad-3dblogspotcom недавно ихкратко расcмотрел Какое место среди них занимает твойIfcOpenShell и каким ты видишь его будущее

Наиболее важным для описанной выше экосистемы ясчитаю полную поддержку геометрии в IFC поскольку намархитекторам нравится работать с формами а в AEC мыимеем дело с весьма реальными объектами Мне показалосьнаиболее разумным задействовать для поддержки IFCплатформу Open CASCADE предназначенную длятвердотельного параметрического моделирования Ну апоскольку в Open CASCADE уже есть поддержка STEP на базе

которого построен IFC реализация большинствагеометрических операций IFC не составляет особыхсложностей

Писать собственный код разбора файлов с нуля быловероятно не самой удачной идеей но я надеюсь в конечномсчете обеспечить прозрачную поддержку всех форматов IFC(кроме основанного на STEP есть еще и формат на базе XML)Существующие открытые библиотеки для работы с IFC этогопока не могут IfcOpenShell правда пока что тоже ndash какговорится оцените иронию Надеюсь что IfcOpenShell станетполнофункциональной библиотекой для чтения и записифайлов IFC с акцентом на геометрию и метаданные (вродесвойств материалов)

Судя по журналу SVN ты сейчас единственныйразработчик в проекте Полагаю отсюда и обращение ксообществу У тебя есть что-нибудь вроде плана развитияпроекта на который любой потенциальный участник могбы опереться

Вы правы насчет количества участников Тем не менее ячувствую поддержку как со стороны проекта osBIM которыйболее официально запустится в октябре этого года так и состороны коллег в университете Плана работы пока нет нокогда я писал этот призыв то в том числе надеялсяпромотивировать потенциальных участников кразмышлению как именно можно использовать подобнуюсвободную реализацию IFC Некоторые интересные идеиперечислены в трекере на SourceForge но желающиепоучаствовать могут их спокойно проигнорировать ипредложить что-то свое вне зависимости от того хотят лиони использовать IfcOpenShell в закрытом или открытом ПО

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 31: FPS Magazine Issue 16

- 32 -

Blender и свободные визуализаторы вроде LuxRenderи YafaRay понемногу становятся совершенно полно-правными инструментами в профессиональной архи-тектурной визуализации Какие преимущества у них тывидишь как архитектор

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

Есть и чисто технические преимущества такие как ранняяреализация новых наработок из академической среды(посмотрим к примеру на разные недавние новшества вLuxRender) Подобный функционал дает вам конкурентноепреимущество Ну и кроме того вы сохраняете полныйконтроль над своей работой поскольку формат храненияданных открыт и задокументирован И конечно жесвободное ПО работает на любых платформах

Наконец мне как человеку который никак не решитархитектором ему стать или программистом весьмаимпонирует то что разработчики относятся к пользователямкак к потенциальным участникам проекта и поощряют ихактивное участие в улучшении софта

Ты все еще используешь закрытое ПО в своей работеЕсли да то почему

Иногда я использую 3ds Max и Revit что объясняетсяглавным образом необходимостью открывать присылаемыеколлегами dwg и rvt Кроме того (чего уж скрывать) вобласти AEC свободное ПО не всегда оказывается на одномкачественном уровне с коммерческим

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

На мой лично взгляд Blender нужно продолжать делатьто что он умеет делать лучше всего Я не вижу особойнеобходимости в каких-то глобальных измененияхПереработанный в 25х интерфейс как мне кажется сделалнеактуальной основную критику в адрес проекта С другойстороны не помешало бы больше внимания уделятьсовместимости обеспечить максимальную поддержкуCOLLADA ну и может быть даже IFC

Насколько пристально ты следишь за развитием 25х атеперь уже и 26х А за совершенствованием GPU-версииLuxRender Какие новшества для тебя наиболееактуальны

На самом деле хотелось бы следить повнимательнееПросто сейчас у меня есть только быстро перегревающийсялэптоп и 16-ядерный сервер без монитора и GPU Инымисловами часть новинок оказывается как бы не в тему

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 32: FPS Magazine Issue 16

- 33 -

А вот развитие нового Python API в Blender 25 меня какраз очень интересует Собственно главным образом завозможность писать сценарии на Python я и полюбилBlender ведь с ним мне не приходится выбирать междуискусством и программированием

В одном из своих проектов ты использовал метасферы(metaballs) для создания естественных органическихформ Насколько я могу судить для архитектуры этонесколько нетипичное решение Что из недавнихизобретений может быть совершенно безумных иэкспериментальных кажется тебе потенциально инте-ресным для архитектуры

В таком контексте единственная сравнительно новаятехнология которую я могу сейчас назвать достаточноочевидна и вовсе не экстремальна Мне очень интересно какскажется на архитектуре быстро растущий тренд CAM(Computer Aided Manufacturing) и личных трехмерныхпринтеров особенно в масштабе целых зданий То есть яговорю не о печати отдельных блоков на фабрике а обуправляемых компьютером устройствах слой за слоемпечатающих бетоном целые здания

Все это может привести к смене представлений о том какличная самоидентификация выражается через жилищепоскольку исчезнет сама причина строительства одинаковыхдомов

Интервью взял Александр ПРОКУДИНИсточник httplinuxgraphicsru

Доступно на условиях GNU Free Documentation License

Blenderнастольная книга

laquoBlender Настольная книгаraquo ndash это проект от журналаlaquoFPSraquo по созданию полноценного русскоязычногоэлектронного руководства по основам работы в Blender25 и 26 Целевая аудитория mdash начинающиепользователи программы (как перешедшие со старыхверсий так и начинающие знакомство с Blender laquoс нуляraquo)Книга будет представлять собой сборник статейохватывающих различные аспекты использованияBlender скомпонованных по принципу laquoот простого ксложномуraquo

Издание будет распространятся бесплатно полицензии Creative Commons BY SA На данный моментактивно ведется подготовка текста книги

К работе над книгой приглашаются все желающие Напочтовый ящик редакции (gecko0307gmailcom)принимаются статьи и уроки а также общие советы ипредложения Кроме того книге нужны графическиематериалы авторские художественные работыинтересные скриншоты демонстрационные рендерысхемы диаграммы и тд Весь Ваш вклад в книгуобязательно будет учтен и Ваше имя будет указано всписке авторов

Подробности на сайте проекта

httpfpsmagzymichostcombook

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 33: FPS Magazine Issue 16

- 34 -

Язык D новостиD вернулся в top-20 ежемесячного рейтинга TIOBE

Programming Community Index Рейтинг публикуетсякомпанией TIOBE которая занимается мониторингом иоценкой качества программного обеспечения в том числе ndashсоставляет рейтинг популярности языков программированияисходя из числа просмотров веб-страниц Подсчетвыполняется при помощи поисковых систем Google Bing иYahoo а также других популярных ресурсов имеющихразделы по разработке ПО ndash например Wikipedia YouTube иBaidu

Впервые с середины 2009 года в двадцатку Tiobeвернулся язык D который занял 20-е место Как полагают вTIOBE возможная причина возвращения D в laquoтопraquo ndash выходкниги Андрея Александреску laquoЯзык программирования Draquo виюне прошлого года D вытеснил из двадцатки язык Fкоторый на короткое время впервые попал в нее в августе

Номером один в списке Tiobe остается Java а за ним идутC C++ C и PHP Язык Objective-C добрался до шестогоместа C в свою очередь поднялся с шестого на четвертоеместо а PHP переместился с четвертого на пятое Вдвадцатку также попали Visual Basic Python Perl JavaScriptRuby DelphiObject Pascal Lua Lisp Transact-SQL PascalPL-SQL Ada и RPG (OS400) Java сохраняет первое место ужедесять лет за исключением нескольких месяцев когдадвадцатку возглавлял C

D на пути к включению в состав GCC Разработчикиязыка D сообщили об урегулировании вопроса с передачейФонду свободного ПО (Free Software Foundation)имущественных прав на код фронтэнда компилятора GDCПередача прав на код является одним из основных условийтребуемых для включения новых фронтэндов в GCC Вдальнейшем остается согласовать некоторыенезначительные технические вопросы и обеспечитьгарантию что после включения в состав GCC код будетподдерживаться в актуальном состоянии

DigitalMars еще в прошлом году заявила о желаниивключить GDC в состав GCC но процесс остановился из-занежелания терять права на код Предложенный вариант сфорком кода GDC и передачей прав только на форк былотвергнут разработчиками GCC После чего был предложенеще один вариант Digital Mars передает права на код FSF ndashно FSF в ответ тут же предоставляет неограниченнуюлицензию позволяющую делать с кодом все что захочетсяПодробности того как удалось согласовать данный вопросне сообщаются Судя по всему Фонд СПО согласился натретий вариант связанный с предоставлением фондунеограниченной лицензии на код

Будем надеяться что поддержка со стороны FSF иразработчиков GCC помогут D выйти наконец изlaquoандеграундаraquo и занять достойное место в индустрии

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 34: FPS Magazine Issue 16

- 35 -

Значимые релизы за последние два месяца

gt В конце октября обновился компилятор DMD для D1 и D2 ndashдо версий 1071 и 2056 соответственно Релиз включаетбольшое количество багфиксов Компилятор доступен подвсе основные операционные системы (Win32 Linux Mac OS XFreeBSD) для i386 и x86_64httpwwwdigitalmarscomddownloadhtml

gt Visual D (проект по интеграции D в среду разработкиMicrosoft Visual Studio) обновился до версии 0328Исправлено много ошибок добавлены новые опциинастроек и другие мелкие доработкиhttpwwwdsourceorgprojectsvisualdhttpwwwmicrosoftcomvisualstudioru-ru

gt Вышел DDT (D Development Tools) 050 ndash плагин поддержкиD для среды разработки Eclipsehttpcodegooglecomaeclipselabsorgpddthttpwwweclipseorg

gt Разработчики wxD ndash биндинга к популярной библиотекеwxWidgets ndash выпустили новую версию библиотеки wxD 016теперь компилируется LDC 092 и DMD 2054 поддерживаетwxWidgets 292 Cocoahttpwxdsourceforgenethttpwwwwxwidgetsorg

gt GtkD тулкит для разработки графических приложений на Dс использованием популярной библиотеки GTK+ обновилсядо версии 15 Эта версия полностью поддерживает GTK+222x со всеми сопутствующими библиотеками (glib cairopango и тд) Обновлен биндинг к Gstreamer добавленинтерфейс к GtkBuildable Кроме того была улучшена работас памятьюhttpwwwdsourceorgprojectsgtkdhttpwwwgtkorg

gt Вышла бета-версия Orange 100 ndash свободной библиотекисериализации (перевода структур данных в после-довательность битов) Orange поддерживает все доступныетипы в языке D имеет раздельный сериализатор иархиватор Библиотека работает на D1 и D2 Tango и Phobosраспространяется по лицензии Boosthttpdsourceorgprojectsorange

gt Для D появился парсер языка разметки YAML ПроектDYAML ставит целью создание полноценной YAML-библиотеки для D2Phobos В октябре вышла версия 02этого проектаhttpsgithubcomkiith-saD-YAML

Geckogecko0307gmailcom

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 35: FPS Magazine Issue 16

- 36 -

Двоичное дерево хешированиеи ассоциативный массив

Язык D в числе прочего привлекает множествомвстроенных алгоритмов из которых наиболее частоиспользуются средства работы с массивами Особенноинтересны ассоциативные массивы которые принимают вкачестве индекса любое значение Можно просто ихиспользовать не вдаваясь в технические подробности ndashоднако меня всегда интересовало как они реализуются Вэтой статье я привожу простую реализацию ассоциативногомассива на основе двоичного дерева

Двоичное дерево (binary tree) как правило используетсядля ускорения поиска значений Вместо того чтобыперебирать все возможные варианты мы приходим кнужному результату laquoкратчайшим путемraquo Двоичное деревопредставляет собой структуру из пар laquoключ-значениеraquo гдеключ ndash некий уникальный номер (необязательно поряд-ковый) Каждая такая пара представляет собой отдельныйузел дерева Узлы могут иметь двух потомков ndash условноlaquoлевогоraquo и laquoправогоraquo Ключ левого потомка всегда меньшеключа родителя а ключ правого ndash больше

Таким образом рекурсивный алгоритм поиска значенияпо ключу заключается в следующем если заданный ключменьше ключа текущего узла опрашивается левый потомокесли больше ndash правый Поиск продолжается пока заданныйключ не будет равен ключу текущего узла либо пока мы неокажемся laquoв тупикеraquo

Базовый интерфейс двоичного дерева поиска состоит изтрех операций

find(key) ndash поиск узла в котором хранится пара (key value)insert(key value) ndash добавление в дерево пары (key value)remove(key) ndash удаление узла с ключом key

По сути двоичное дерево поиска mdash это структура данныхспособная хранить таблицу пар (key value) и поддер-живающая три операции find insert remove

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 36: FPS Magazine Issue 16

- 37 -

Ниже приведена реализация двоичного дерева поиска ввиде шаблона класса

class BST(T)

public this()

protected

BST left = null

BST right = null

int key = 0

T value

protected this(int k T v)

key = k

value = v

public void insert(int k T v)

if (k lt key)

if (left is null) left = new BST(k v)

else leftinsert(k v)

else if (k gt key)

if (right is null) right = new BST(k v)

else rightinsert(k v)

else value = v

public BST find(int k)

if (k lt key)

if (left is null) return leftfind(k)

else return null

else if (k gt key)

if (right is null) return rightfind(k)

else return null

else return this

Дерево в его текущем состоянии можно использоватьнапример для хранения имен и фамилий поидентификационным номерам

auto bst = new BSTstring

bstinsert(12608 Dmitry Egorov)

bstinsert(67045 Ivan Petrov)

assert( bstfind(12608)value == Dmitry Egorov )

Для удаления узлов можно использовать следующийалгоритм если у узла нет обоих потомков удаляем узел иобнуляем ссылку на него у родителя если у узла всего одинпотомок копируем его пару laquoключ-значениеraquo в родителя иудаляем Если у узла есть оба потомка то находим узелявляющийся крайним левым узлом правого потомкакопируем из него данные и рекурсивно удаляем

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 37: FPS Magazine Issue 16

- 38 -

private BST findLeftMost()

if (left is null) return this

else return leftfindLeftMost()

public void remove(int k BST par = null)

if (k lt key)

if (left is null) leftremove(k this)

else return

else if (k gt key)

if (right is null) rightremove(k this)

else return

else

if (left is null ampamp right is null)

auto m = rightfindLeftMost()

key = mkey

value = mvalue

rightremove(key this)

else if (this == parleft)

parleft = (left is null) left right

delete this

else if (this == parright)

parright = (left is null) left right

delete this

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

Хэширование ndash это преобразование входного массиваданных произвольной длины в выходную битовую строкуфиксированной длины Результат такого преобразованияназывают дайджестом (digest) Существует множествоалгоритмов хэширования с различными характеристиками(разрядность вычислительная сложность криптостойкость итп) Выбор той или иной хэш-функции определяетсяспецификой решаемой задачи Простейшими примерамихэш-функций могут служить контрольная сумма и CRC

pure int hash(string key int tableSize = 5381)

int hashVal = 0

for (int x = 0 x lt keylength ++x)

hashVal ^= (hashVal ltlt 5)+(hashVal gtgt 2)+key[x]

return hashVal tableSize

Таким образом мы можем передавать в методы insert иfind контрольную сумму строки ndash результат функции hash Всвязи с этим не лишним будет перегрузить операторыиндексирования чтобы класс внешне был больше похож намассив Для этого проще будет объявить новыйкласс-враппер наследующий от BST

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 38: FPS Magazine Issue 16

- 39 -

class AArray(T) BST(T)

public

this()

void opIndexAssign(T v string i)

insert(hash(i) v)

T opIndex(string i)

auto node = find(hash(i))

assert (node is null)

return nodevalue

T opIn_r (string i)

auto node = find(hash(i))

if (node is null) return ampnodevalue

else return null

void remove(string i)

superremove(hash(i))

Пример использования

auto aa = new AArraystring

aa[sysadmin] = Dmitry Egorov

aa[programmer] = Ivan Petrov

assert (aa[sysadmin] == Dmitry Egorov)

if (programmer in aa)

aaremove(programmer)

assert (programmer in aa)

Реализации ассоциативных массивов основанные наразличных деревьях поиска наиболее популярны Такнапример в STL контейнер map реализован на основекрасно-черного дерева В Ruby Tcl и Python используетсяодин из вариантов хэш-таблицы Существуют и другиеварианты

У каждой реализации есть свои достоинства и недостаткиВажно чтобы все три операции выполнялись как в среднемтак и в худшем случае за время O (log n) где n ndash текущееколичество хранимых пар

Тимур ГАФАРОВtgafaroffgmailcom

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 39: FPS Magazine Issue 16

- 40 -

Сопрограммы в языке DСопрограмма (coroutine) ndash компонент программы обоб-

щающий понятие подпрограммы (функции) Сопрограмма можетиметь не одну а несколько входных точек ее можноостанавливать и продолжать с сохранением ее внутреннегосостояния

Сопрограммы являются более гибкими и обобщенными чемподпрограммы но реже используются на практике Подпрограммаимеет всегда одну входную точку сопрограмма имеет стартовуюточку входа и размещенные внутри последовательность возвратови следующих за ними точек входа Подпрограмма можетвозвращаться только однажды сопрограмма может возвращатьуправление несколько раз Любую подпрограмму можнореализовать как сопрограмму По утверждению Дональда Кнутаlaquoподпрограмма является частным случаем сопрограммыraquo

Изначально применение сопрограмм являлось методикойассемблера и практиковалось лишь в некоторых высоко-уровневых языках (Simula Modula-2) Большинство современныхпопулярных языков программирования включая C и егопроизводные не имеют прямой поддержки сопрограмм в языкеили стандартной библиотеке Это обусловлено большей частьютребованиями к стековой реализации подпрограмм Изпопулярных языков со встроенной поддержкой сопрограммможно отметить C Python Ruby Perl 6 Io Go Lua Modula-2Simula Tcl

Сопрограммы полезны для реализации модели акторов Этоматематическая модель параллельных вычислений котораятрактует понятие laquoакторraquo как универсальный примитивчисленного расчета в ответ на сообщения которые он получаетактор может принимать локальные решения создавать новыхакторов посылать свои сообщения а также устанавливать какследует реагировать на последующие сообщения Изначально этаконцепция использовалась как основа для понимания исчисленияпроцессов и как теоретическая база для ряда практическихреализаций параллельных систем

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 40: FPS Magazine Issue 16

- 41 -

Во многих языках сопрограммы реализуются в виде волокон(fiber) Волокно ndash это laquoлегковесныйraquo вариант потока (thread)Подобно потокам волокна используют общее адресноепространство Однако волокна используют кооперативнуюмногозадачность в то время как потоки ndash вытесняющую потоки восновном зависят от планировщика задач который приоста-навливает одну и дает выполняться другой волокна же передаютуправление другим волокнам

По сути волокна описывают те же концепции что исопрограммы Разница если она есть состоит в том чтосопрограммы ndash это конструкции языкового уровня а волокна ndashсистемного Взаимное переключение между волокнами выглядиткак безадресный переход между внутренними участками кодасопрограмм Волокна могут рассматриваться как реализациясопрограмм или же в качестве основы на которой реализуютсясопрограммы

В языке D волокна поддерживаются в Phobos ndash какдополнительный laquoбонусraquo в виде класса Fiber в corethread Возвратиз сопрограммы осуществляется при помощи статического методаFiberyield

import corethread

import stdstdio

void hello()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

Fiber fiber = new Fiber(amphello)

fibercall()

fibercall()

fibercall()

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

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 41: FPS Magazine Issue 16

- 42 -

class MyFiber Fiber

this()

super(amprun)

void run()

writeln(Hello world)

Fiberyield()

writeln(How are you)

Fiberyield()

writeln(Bye)

Fiberyield()

void main()

auto fiber = new MyFiber()

fibercall()

fibercall()

fibercall()

После полного завершения волокно необходимо сброситьчтобы использовать его повторно Это можно сделать методомreset

Текущее состояние волокна (HOLD EXEC или TERM ndashlaquoприостановленоraquo laquoвыполняетсяraquo или laquoзавершеноraquo) можноузнать из поля State

while (fiberstate = FiberStateTERM)

if (fiberstate == FiberStateHOLD)

fibercall()

fiberreset()

Волокнам требуется меньшая поддержка со стороныоперационной системы чем для потоков Если в программеиспользуется много однотипных потоков то целесообразносоздавать волокна так как они значительно экономят ресурсы

Тимур ГАФАРОВtgafaroffgmailcom

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 42: FPS Magazine Issue 16

- 43 -

Python 2 или Python 3Многим известно что в последние годы активно

разрабатывается третья версия замечательного языкапрограммирования Python Многие продукты находящиеся вавангарде свободного ПО (например Blender) уже перешли нанее Но немало софта все еще пишется под Python 2x Да и какбыть с громадной базой кода накопленной за годы для старойветки языка Начинающим знакомство с Python можнопредложить несколько советов которые помогут имопределиться с выбором версии языка

Если кратко Python 2 ndash это статус-кво Язык стабиленнасколько это возможно и после релиза 27 никакихкардинальных изменений и нововведений в нем уже непредвидится Поддержка 2x по всей видимости будетсохраняться еще несколько лет поскольку перевод ужесуществующих программ на новую версию Python требуетзначительных трудозатрат и не всякий производитель станет этимзаниматься Однако нет никаких причин не использовать Python 3для абсолютно новых проектов написанных с нуля (как напримерв случае с Blender 25)

Итак вам рекомендуется выбрать Python 2 если вы

работаете в среде которую не можете контролироватьполностью (например в проприетарном приложении или сетевойинфраструктуре) В этом случае вам и не предоставляется свободавыбора ndash придется писать на той версии языка какая есть

используете специфическую библиотеку или инстру-ментарий написанный на Python 2x и не поддерживающий третьюверсию языка (к примеру PyGTK)

планируете изучение языка по книге или справочнойдокументации Таких материалов очень много для Python 2x ипока маловато для Python 3x Точно такая же ситуация и вонлайн-сообществах Python где поддержка второй ветки языкакак правило гораздо лучше

При этом необходимо помнить что многие новыевозможности Python 3x были обратно портированы на Python 2xКак следствие число вещей которые вы можете сделать в Python3x и не можете в старых версиях не так уж и велико Хорошонаписанный код для 2x будет мало чем отличаться от таковогодля 3x Если писать код с учетом эволюции языка не используяdeprecated-особенности портировать его с одной версии надругую будет гораздо проще Тем более что для этой целисуществуют специальные утилиты ndash например 2to3 котораяпоставляется в комплекте с Python 3

Конечно портирование кода ndash идеальный вариант Но если этоневозможно наиболее разумным решением будет как нистранно вовсе отказаться от старых библиотек Необходимопонимать что legacy-код ndash это якорь тормозящий движение иразвитие проектов Старайтесь писать такие программы которыеможно при необходимости легко переписать на любом языке

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 43: FPS Magazine Issue 16

- 44 -

Модели освещения

Коэффициент Френеля

Для получения реалистичных отражений (равно как ипреломлений) необходимо учитывать тот факт что доляотраженной и преломленной световой энергии не являетсяпостоянной величиной ndash она зависит от угла падения

Например если смотреть на воду под большим углом (сверху)то можно увидеть дно А если смотреть под малым углом(например с берега озера на горизонт) то дна уже не видно ndashводная поверхность будет отражать небо В компьютернойграфике при моделировании отражающих материалов этотпереход как правило описывается коэффициентом Френеля(Fresnel)

Огюстен Жан Френель (1788-1827) ndash французский физик одиниз создателей волновой теории света Переоткрыв 1815 г принципинтерференции Френель дополнил известный принцип Гюйгенсавведя понятие о когерентности световых волн и ихинтерференции (принцип Гюйгенса-Френеля) На основе этих двухпринципов он разработал теорию дифракции света Такжеизобрел несколько интерференционных приборов ndash зеркалоФренеля бипризму Френеля линзу Френеля

Коэффициент Френеля определяет соотношение отраженнойи преломленной энергии на границе двух сред с разнымипоказателями преломления Количество отраженной энергиивыражается следующей формулой

R( θ ) = 12 ( g minus c

g + c )2 (1 + ( c(g + c) minus (ηi ηt)2

c(g minus c) minus (ηi ηt)2 )2)

c = cos θ (ηi ηt)

g = 1 + c2 minus (ηi ηt)2

где ηi η

t ndash показатели преломления сред θ ndash угол между

нормалью и падающим лучом

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

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 44: FPS Magazine Issue 16

- 45 -

Существуют оптически анизотропные вещества в которыхпоказатель преломления зависит еще и от направления иполяризации света Это например все кристаллы с достаточнонизкой симметрией кристаллической решетки а также веществаподвергнутые механической деформации

Показатели преломления различных веществ

Воздух - 10002926 Кварц - 1544Вода - 1332986 Топаз - 163Стекло - 152 Лед - 131Кремний - 4010 Сахар - 156Алмаз - 2419 Этиловый спирт - 136

Ацетон - 136 Мед - 1484Бензол - 15 Молоко - 135Глицерин - 1473 Пиво - 1345Водка - 1363 Сахарный сироп - 149Скипидар - 1472 Масло - 1535

Нейлон - 153 Роговица глаза - 138Обсидиан - 150 Пластмасса - 1460-155Хрусталь - 2000 Оргстекло - 1488Соль - 1516 Слюда - 156-160

Точная формула Френеля обычно не используется ввиду еевычислительной сложности Есть несколько ее приближенийчасто применяемых для вычислений в реальном времени ndashнапример аппроксимация Шлика В приведенной нижереализации используется laquoчестнаяraquo формула с постояннымзначением (η

t)

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 45: FPS Magazine Issue 16

- 46 -

Реализация на GLSL

Вершинная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

void main(void)

gl_Position = ftransform()

V_eye = gl_ModelViewMatrix gl_Vertex

L_eye = gl_LightSource[0]position - V_eye

N_eye = vec4(gl_NormalMatrix gl_Normal 10)

V_eye = -V_eye

- предполагается что в приложении уже включены и настроенысоответствующие параметры OpenGL (позиция источника светасвойства материала и др) Приведенная реализация в целях упрощенияне учитывает интенсивность источника света Исходный кодпредоставлен как общественное достояние (Public Domain) и можетбыть использован для любых целей безо всяких ограничений

Фрагментная программа

varying vec4 V_eye

varying vec4 L_eye

varying vec4 N_eye

const float etha = 066 10003152

const float ethasqr = etha etha

void main (void)

vec4 refractColor = gl_FrontMaterialdiffuse

vec4 reflectColor = gl_FrontMaterialspecular

vec3 V = normalize(vec3(V_eye))

vec3 L = normalize(vec3(L_eye))

vec3 N = normalize(vec3(N_eye))

float NV = dot(NV)

float c = NV etha

float g = sqrt(10 + c c - ethasqr)

float gc = (g - c)(g + c)

float f = (c(g-c) - ethasqr) (c(g+c) - ethasqr)

float R = 05 gc gc (1 + f f)

gl_FragColor = mix(refractColor reflectColor R)

gl_FragColora = 10

Geckogecko0307gmailcom

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 46: FPS Magazine Issue 16

- 47 -

Алхимия

Что такое алхимия Для современного человека ndash этосвоеобразная laquoматьraquo химии средневековая наука о превращенииметаллов в золото Однако в общем смысле алхимия ndash этофилософское учение о взаимосвязи Материи и Духа отрансформации материального и духовного Целью алхимиковявляется осуществление качественных изменений внутриодушевленного или неодушевленного объекта его перерождениеи переход на новый уровень бытия

Родиной алхимии считается Древний Египет Алхимики велиначало своей науки от Гермеса Трисмегиста (он же египетский богТот) и поэтому алхимическое искусство также называлосьгерметическим Свои сосуды они запечатывали печатью сизображением Гермеса (отсюда выражение laquoгерметическизакрытыйraquo)

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

Огонь вода воздух земля

Вся алхимия базируется на теории четырех элементов Воснове ее лежит платоновский принцип единой материи котораяпринимая различные формы создает многообразие живой инеживой природы Из этой первичной материи произошли четыреэлемента (или стихии) Огонь Вода Воздух и Земля Эти элементысоответствуют четырем агрегатным состояниям вещества земля ndashтвердое вещество вода ndash жидкость воздух ndash газ огонь ndashраскаленный газ плазма

Позднее был добавлен пятый элемент ndash квинтэссенция (от латquinta essentia ndash laquoпятая сущностьraquo) эфир или anima mundi (laquoдушамираraquo) ndash тонкая божественная стихия пронизывающая всюВселенную

Сера соль ртуть

Tria Prima алхимиков Соль ndash универсальная субстанция ртуть ndashвездесущий дух сера ndash флегма бальзам жизни Идея о единствесеры ртути и соли происходит из теории о подобии микрокосма имакрокосма Человек в ней рассматривается как мир в миниатюрекак отражение Космоса со всеми присущими тому качествамиОтсюда и значение элементов Соль ndash Тело Ртуть ndash Дух Сера ndashЖизнь Таким образом Космос и Человек состоят из одних и техже элементов

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 47: FPS Magazine Issue 16

- 48 -

Философский камень

Практическая задача алхимии ndash превращение (трансмутация)неблагородных металлов в благородные Эта идея базируется напредставлениях греческой философии о том что материальныймир состоит из одного или нескольких laquoпервоэлементовraquoкоторые при определенных условиях могут переходить друг вдруга Вещество способное к трансмутации носит названиефилософского камня Различают два камня один ndash белыйпревращающий металлы в серебро (laquoбелая тинктураraquo) другой ndashкрасный превращающий их в золото (laquoкрасная тинктураraquo)

Алхимия как игра

Алхимия ndash очень обширная область имеющая пересечения састрологией магией эзотерикой Будучи хорошей laquoпищей дляумаraquo в наши дни она получила оригинальное вополщение в видекомпьютерных игр

Идея игры на основе алхимических принципов существует ужедостаточно давно Одной из первых была Alchemy для DOS иWindows 9x цель которой заключается в создании целого мира наоснове четырех элементов ndash Воды Земли Воздуха и ОгняКомбинируя их игрок создает новые субстанции и переходит наболее высокие ступени развития Вся прелесть заключается в томчто таких комбинаций необычайно много и их число растет помере прохождения Развиваться можно в разные области химиюфизику флору фауну Можно развивать технологии ndash ядернуюэнергию химическую промышленность и тд

У игры есть современные римейки Один из самых известных ndashотечественная laquoАлхимияraquo (httpalchemygameru) Это браузернаяигра на JavaScript которая изначально имела текстово-табличныйинтерфейс (впоследствии появились и графические варианты)Появившись в 2010 г игра наделала шума вызвала много эмоцийи обсуждений Было предложено несколько вариантов развитиягеймплея После волны обсуждения появилось несколько полныхклонов и версий с улучшениями ndash с увеличеснным количествомэлементов и с более удобным интерфейсом Стало ясно что играперспективная и будет развиваться

В базовой версии laquoАлхимииraquo предлагается открыть всевозможные элементы (их количество варьируется от версии кверсии) путем соединения ndash реагирования Так соединив Воздух иОгонь получаем Энергию соединив Воду и Землю ndash Болото Еслисоединить Болото и Энергию ndash получим Жизнь затем соединяемее снова с Водой ndash получаем Водоросли

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 48: FPS Magazine Issue 16

- 49 -

Таким образом совершается эволюционный цикл от бактерийдо laquoвенца творенияraquo ndash Человека который оказывается способенизменять окружающий мир создавая орудия труда материалы имашины Можно также создавать различные химикатынематериальные субстанции и даже мифические существа(Дракон Голем Вампир Призрак)

Логика в игре не совсем прямая То есть реакция ndash это невсегда смешивание объектов в прямом смысле а скореесмешивание их свойств Это вносит в игровой процесс элементхаоса и угадывания Как следствие ndash в laquoАлхимииraquo немалоюмористических моментов Например

Человек + Человек = Секс

Человек + Шерсть = Обезьяна

Человек + Гриб = Шаман

Человек + Горох = Пук

Человек + Трава = РастаманРыба + Стекло = АквариумРастаман + Аквариум = БГ

Множество других интересных рецептов можно найти вИнтернете Есть в игре и философский камень которыйпревращает любые другие элементы в золото Как получить его ndashоставляю на ваше усмотрение

Открыв новый элемент вы получаете доступ к нему черезменю Удалить элементы можно перетащив их в специальнопредусмотренную Бездну В последних версиях игры можносоединять три и более элементов просто выделите мышкойнесколько штук ndash и они попробуют среагировать В laquoАлхимииraquoпредусмотрено сохранениезагрузка на сервере Можно сохранитьигру на одном компьютере а загрузить на другом поиграв наработе вам не придется дома начинать все заново Есть подсказкивы можете видеть что можно получить из открытых элементов ndash изнать к чему стремиться а не перебирать все комбинацииНаконец есть список рецептов для записи laquoформулraquo удачныхреакций

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 49: FPS Magazine Issue 16

- 50 -

Самое мнетерсное есть модкит для тех кто хочет создатьсвою laquoАлхимиюraquo Любой желающий может либо создать с нулясвой набор реакций либо добавить что-то к существующимФанатами уже было создано огромное количество модовтекстовых и графических на самые разные темы ndash химия физикафилософия магия кулинария садоводство животноводстводетективы мистика На сайте игры также имеется возможностьзадать вопрос по игре внести свое предложение или новую идею

Стоит добавить что laquoАлхимияraquo не только здорово затягивает иотлично помогает убить время ndash эта игра развивает память итворческое мышление

Официальный сайт laquoАлхимииraquo httpalchemygameru Базовая версия игры (мод 1) httpalchemygamerumods1play laquoАлхимияraquo с картинками (мод laquoЧародейraquo) httpalchemygamerumods1402play Приложение ВКонтакте httpvkontakteruapp1912160 Приложение для Google Chrome httpschromegooglecomwebstoredetailinhhkggcjkbodpgnjehhckiihdgpgbkj Для Android Скачать можно с сайта автора http0xffmealchemyapk или на Android Market httpsmarketandroidcomdetailsid=mezed_0xffandroidalchemy

Для iPhone Скачать можно с сайта автора httpavaloidcomdoodle-god или на App Store httpitunesapplecomusappdoodle-godid376374689mt=8 Классическая Alchemy для DOS httphomepagesbicosdesteinrueckenalchemy

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 50: FPS Magazine Issue 16

- 51 -

Glibc hell ищем выход

glibc (GNU C Library) ndash стандартная библиотека языка С котораяобеспечивает системные вызовы и основные функции такие какprintf open malloc и тд Она является одним из ключевыхкомпонентов операционной системы GNULinux и используетсяпрактически всеми динамически скомпонованными программами

Иногда необходимо например на системе с glibc 28 запуститьпрограмму собранную с glibc 211 Если просто ввести в консолиltимя программыgt вы получите грозное сообщение laquoversionGLIBC_211 not foundraquo Такая проблема конечно не стоит дляпользователей которые устанавливают пакеты исключительно изофициального репозитория своего дистрибутива Однако и они незастрахованы во-первых версия дистрибутива может банальноустареть и мейнтейнер прекратит ее поддержку ndash пакеты простобудет неоткуда брать

В этом случае обычно советуют установить новую версиюсистемы но в некоторых случаях это не представляетсявозможным Например если вы не являетесь владельцемкомпьютера на котором работаете и не имеете полномочийобновлятьпереустанавливать ОС

Тогда предлагают самый laquoправильныйraquo выход собратьпрограмму из исходников под вашу версию glibc Но как бытьесли программа проприетарная и исходники недоступны Илидоступны но сборка сопряжена с громадными трудностями изатратами времени (представьте себе например скомпилировать

OpenOfficeorg) ndash не говоря уже о том что это подчас оченьнепростой процесс требующий определенных знаний всехтонкостей GNU-утилит autotools GCC и тд

Cборка программы практически никогда не ограничиваетсяпростым laquosudo configure ampamp make ampamp make installraquo ndash здесь ирешение зависимостей вручную и проблемы с совместимостьюразных версий библиотек и много других нюансов Наконецпрограмма может быть написана не на традиционном C а налюбом из десятков современных языков ndash так что придетсясначала устанавливать нужный компилятор а это вообщеотдельная история Обычный пользователь все это явно неосилит

Казалось бы ndash вот она темная сторона Linux и свободного ПОПостоянно меняющийся и обновляющийся laquoзоопаркraquo дистри-бутивов и версий зачастую работает против вас В Windowsбольшинство пользователей никогда не видели никакихисходников и не знают даже слов laquoкомпиляторraquo и laquoрепозиторийraquo ndashони привыкли ставить софт в готовом бинарном виде при помощиинсталлятора с диска или с сайта разработчика Все годамиработают на старой XP или даже Win2k устанавливаютсовременные версии программ ndash и у всех все работает (иногда сгрехом пополам но ведь работает) Думаю что не погрешу противистины предположив что именно из-за этого некоторыеразочаровываются в Linux и возвращаются обратно на WindowsПечально Отнюдь Как всегда выход есть

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 51: FPS Magazine Issue 16

- 52 -

Секрет в том что программу надо вызывать особым образомСначала надо где-то взять собственно glibc 211 Можно напримерпоискать в репозитории для более свежей версии дистрибутива (аможно и из исходников собрать) Ее файлы необходимо поместитьв какой-нибудь каталог ndash например в папку lib в вашей домашнейдиректории Тогда запускать требующую glibc 211 программупридется так

$ LD_LIBRARY_PATH=~lib ~libld-linuxso2 myprogram

Сначала устанавливается переменная LD_LIBRARY_PATH ndash мыговорим что библиотеки нужно искать в папке ~lib (если выпоместили их в другое место поменяйте путь) Затем запускаетсядинамический загрузчик ld-linuxso2 который загружаетпрограмму myprogram вместе с необходимыми ей библиотеками

Технический смысл здесь следующий При обычном запускелюбой программы система незаметно для пользователя запускаетlibld-linuxso2 загружающий все нужные библиотеки Можно этоделать самостоятельно но обычно этого не требуется - система итак знает что запускать его надо из lib (точнее это указано всамом исполняемом файле) Но если мы используемнестандартную (то есть отличную от установленной в lib) версиюglibc мы должны использовать соответствующую версиюld-linuxso2 Для этого и приходится указывать путь к немувручную

Описанный метод лично мне помог запустить на моейустаревающей системе несколько свежих игр и сборок Blender ссайта GraphicAllorg Напоследок привожу shell-скрипт которыйпозволяет запускать такие программы из меню или с рабочегостола (просто отредактируйте его под себя поместите в папку спрограммой и создайте кнопку запуска ссылающуюся на этотскрипт)

binsh

BF_DIST_BIN=`dirname $0`

BF_PROGRAM=myprogram

LD_LIBRARY_PATH=$BF_DIST_BINlib$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

$BF_DIST_BINlibld-linuxso2 $BF_DIST_BIN$BF_PROGRAM

Примечание скрипт написан с учетом того что новая версияglibc находится в папке lib в директории с программой

Тимур ГАФАРОВtgafaroffgmailcom

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom

Page 52: FPS Magazine Issue 16

Это все

Надеемся номер вышел интересным Если так поддержитеFPS Отправляйте статьи обзоры интервью и прочее на любыетемы касающиеся игр графики звука программирования и тд наgecko0307gmailcom

httpfpsmagzymichostcom