Как разбить лампочку в 3ds max
Качество исполнения того или иного трехмерного проекта, будь то анимационный фильм вроде "Динозавр" или компьютерная игрушка, принято оценивать субъективным "выглядит, как настоящее" или же "непохоже". При этом в большинстве случаев каждый из нас безошибочно может определить трехмерный ляп в неестественной походке главного героя, в несовпадении движений губ и речи персонажа и т.д. Одной из наиболее трудно решаемых проблем, которые возникают при создании трехмерных сцен, является моделирование реалистичной анимации, которая соответствовала бы законам физики. Так, например, если уронить на пол какой-нибудь хрупкий предмет, он разлетится на осколки, каждый из которых отскочит от места соударения в определенном направлении. Без специальных инструментов для просчета подобной анимации очень трудно предугадать, с какой скоростью и в каком направлении полетит каждый из осколков. Если же предмет должен не просто разбиться, а полететь на землю из-за взаимодействия с другими телами, вручную это сделать просто невозможно. Один из инструментов, позволяющих решить эту проблему — модуль reactor, который входит в состав 3ds max начиная с пятой версии программы. В этой небольшой статье мы покажем на примере работу с этим инструментом и попробуем разбить с помощью reactor трехмерную электрическую лампочку.
Но для начала, чтобы читатель, пожелавший повторить этот пример, не ломал голову над тем, где ему взять лампочку для экспериментов, мы расскажем, как создать этот несложный объект. Работать мы будем в 3ds max 7, поэтому, если у вас более старая версия, вы можете не найти некоторых инструментов, которые мы будем использовать.
Создание корпуса лампочки
Электрическая лампочка имеет грушеподобную форму и обладает осевой симметрией. Поэтому наиболее удобно для ее создания воспользоваться модификатором Lathe. Поскольку модификатор Lathe применяется исключительно к сплайновым формам, необходимо предварительно нарисовать в окне проекции сплайновый профиль будущей модели. Это можно сделать при помощи инструмента Line. Для редактирования формы сплайна переключитесь в режим редактирования Vertex и передвиньте вершины так, чтобы форма профиля была наиболее точной (рис. 1). Одно из условий корректного построения поверхности вращения в нашем случае — первая и последняя вершины сплайна должны иметь две общие координаты. Другими словами, точки должны лежать на оси. В противном случае после применения модификатора Lathe поверхность может содержать дефекты. Для того, чтобы убедиться в том, что координаты нужных точек совпадают, находясь в режиме редактирования Vertex, выделите одну из вершин, посмотрите ее координаты в строке состояния, затем выделите вторую вершину и в случае необходимости измените координаты, чтобы две из них совпадали. Это можно сделать, просто изменив число в соответствующих окошках. Теперь можно применить модификатор Lathe к объекту. В свитке Parameters настроек модификатора Lathe при помощи кнопки Y в области Direction выберите ось, вокруг которой будет происходить вращение сплайна. После этого в окне проекции сплайн превратится в фигуру вращения вокруг выбранной оси. Следует иметь в виду, что оси вращения — это координатные оси локальной системы координат. Их направление не совпадает с направлением координатных осей глобальной системы координат. Поэтому в нашем случае вращение производится вокруг локальной оси Y. Полученная модель не совсем похожа на объект, который нам необходимо создать. Усовершенствуем его. Определим положение для оси вращения. Для этого в области Align нажмите кнопку Mах. Выбранная ранее ось вращения будет автоматически смещена (рис. 2). Если созданная вами поверхность вращения приняла вывернутую форму, установите флажок Flip Normals.
Создание резьбы на цоколе
Мы получили модель, по форме приблизительно напоминающую электрическую лампочку. От настоящей лампочки ее отличает то, что на цоколе должна располагаться резьба, служащая для ее ввинчивания в патрон. Для ее создания можно использовать булевы операции вычитания, удаляя из корпуса лампочки объект Helix, который перед этим был конвертирован в редактируемую поверхность. Однако такой метод имеет ряд недостатков. Во-первых, необходимо точно подобрать настройки Helix и правильно расположить один объект относительного второго. Во-вторых, резьба, полученная таким способом, будет выглядеть слишком острой, в то время как на настоящей лампе она имеет сглаженные края. В этом случае лучший результат можно получить, используя модификатор Displace. Этот модификатор позволяет изменять геометрическую форму объекта, сдвигая каждую вершину полигональной поверхности, основываясь на заданном двухмерном изображении. Для того, чтобы выдавить резьбу с его помощью, необходимо определенным образом деформировать нижнюю часть модели. Для начала применим к модели модификатор Edit Poly. Это нужно для того, чтобы перед использованием модификатора Displace вы могли выделить ту область модели, к которой он будет применен. После применения модификатора Edit Poly переключитесь в режим редактирования Рolygon. Перейдите в окно проекции Front и выделите ту часть модели, на которую необходимо добавить резьбу. Выделенные полигоны станут красными (рис. 3). Проследите, чтобы в свитке настроек Selection был снят флажок Ignore Backfacing. В противном случае вам не удастся выделить поверхность объекта полностью, так как полигоны с обратной стороны останутся невыделенными. На выделенной поверхности для создания резьбы полигонов недостаточно. Если использовать модификатор Displace к такой области, форма полученной резьбы не будет соответствовать реальной. Поэтому необходимо, находясь в режиме редактирования Рolygon, перейти в свиток Edit Geometry и нажать кнопку Settings, расположенную справа от параметра Tesselate. В появившемся окне нужно установить переключатель в положение Edge. В результате этой операции плотность размещения полигонов будет увеличена. Теперь, не выходя из режима редактирования Рolygon, примените к выделенной области модификатор Displace. Искажать модель этим модификатором можно двумя способами: используя в качестве карты смещения черно-белый графический рисунок или же используя процедурную карту с такими параметрами, при которых она будет иметь подходящий рисунок.
Второй способ имеет несколько преимуществ: во-первых, при использовании процедурной карты отпадает необходимость прилагать к файлу сцены дополнительный графический файл. Во-вторых, вы можете легко управлять деформацией модели, изменяя параметры процедурной карты непосредственно в 3ds max. Для редактирования же графического файла вам понадобится дополнительное приложение. В-третьих, при изменении настроек процедурной карты вы имеете возможность сразу же наблюдать, как они влияют на форму объекта. В случае с графическим файлом придется создать как минимум несколько вариантов и загружать их по очереди, прежде чем вы добьетесь нужного результата.
В качестве процедурной карты смещения будем использовать стандартную карту Checker. Откройте Material Editor и выберите ее. Установите для карты следующие параметры: Tiling V — 2,3, Tiling W — 0, Blur — 100, Angle V — 13. Последнее действие позволит создать рисунок с косыми светлыми и темными полосками. Этот параметр будет определять угол, под которым будет расположена резьба на модели. Установите флажок напротив опции Tile. Переключатель, определяющий направление проецирования текстуры, установите в положение VW. Имейте в виду, что параметры являются ориентировочными и зависят от размеров области, к которой применен модификатор Displace. Вернемся в настройки модификатора Displace. В области Image, щелкнув на кнопке Map:None, установите в качестве карты смещения созданную вами карту Checker. Выберите тип проецирования карты искажения Cylindrical. После этого вы увидите, что в области воздействия модификатора появился габаритный цилиндр (рис. 4). Раскройте строку Displace в стеке модификаторов, щелкнув на значке плюса. Переключитесь в режим редактирования Gizmo и поверните габаритный цилиндр на 90 градусов. Для того, чтобы увидеть резьбу, в области Displacement задайте параметру Strength значение, равное 2,3. Для того, чтобы не было видно границ текстуры, значение параметра U Tile установите равным двум. После этого на лампочке появится желаемая резьба (рис. 5).
Разбивание лампочки
Теперь попробуем разбить лампочку средствами встроенного в 3ds max модуля для работы с динамикой reactor2. Поверхность вращения, созданная нами, не имеет реальной толщины. Поэтому reactor не сможет обработать в своих вычислениях такой объект, поскольку он не имеет массы. Для того, чтобы придать стенкам лампочки толщину, воспользуемся следующим приемом. Выделите модель в окне проекции и создайте его независимую копию. Для того, чтобы в дальнейшем вы могли работать с клонированным объектом, переключитесь в режим отображения Wireframe. Масштабируйте созданный объект до 91- го процента. При этом в окне проекции Front наблюдайте за тем, чтобы на цоколе не произошло пересечения между резьбой двух объектов (рис. 6). Выделите исходный объект и выберите объект Boolean. В свитке настроек Pick Boolean нажмите кнопку Pick Operand B и выберите второй объект. После выполнения булевой операции объект станет обладать толщиной. При ударе о землю лампочка должна рассыпаться на осколки. Для того, чтобы смоделировать такой эффект при помощи reactor, необходимо заранее создать объекты, которые будут участвовать в анимации. То есть нам необходимо разрезать трехмерную модель лампочки на отдельные осколки. Все эти объекты будут объединены инструментом Fracture и разлетятся, когда лампочка достигнет земли. Для создания осколков конвертируйте объект в Editable Poly. Переключитесь в режим редактирования Рolygon и выделите произвольную область лампочки. В свитке Edit Geometry нажмите кнопку Detach. В результате мы получим самостоятельный объект. Введите в появившемся окне его имя. Повторите операцию несколько раз, создав осколки разнообразной формы.
Теперь необходимо создать землю, о которую разобьется лампочка. Для ее создания используйте стандартный примитив Box. Расположите объект под лампочкой и задайте примитиву небольшую толщину и большую площадь. Выделите все элементы лампочки и слегка ее поверните. Это позволит получить более эффектное падение. Выделите все объекты в сцене. На панели инструментов reactor нажмите кнопку Create Rigid Body Collection. Вы увидите, что в окне проекции появилась пиктограмма вспомогательного объекта. Если выделить этот объект и перейти на вкладку Modify командной панели, можно увидеть, что в список твердых тел занесены все объекты, с которыми мы работаем. Перейдите на вкладку Utils командной панели и нажмите кнопку reactor. Выделите в окне проекции все осколки, перейдите в свиток Properties и установите для них значение параметра Mass. В зависимости от размеров вашего объекта и положения лампочки его значение может отличаться. В 3ds max 7 довольно часто встречаются физические величины. На первый взгляд, это усложняет работу, потому что не всегда на глаз можно определить, например, коэффициент трения или величину потерь энергии при ударе. Однако, с другой стороны, появляется возможность точно описать физическую задачу. Убедитесь, что в сцене выделены все осколки. На панели инструментов reactor нажмите кнопку Create Fracture. Вы увидите, что в окне проекции появилась пиктограмма вспомогательного объекта (рис. 7). Вместе с этим все осколки были занесены в список тел, подвергающихся разрушению. В случае необходимости для каждого из них можно указать тип разрушения. Для этого нужно выделить объект в списке Pieces и выбрать один из типов в области Selected Piece. Это может быть один из следующих вариантов разбиения:
. Normal — при некотором значении импульса элемент "отламывается";
. Unbreakable — элемент останется целым;
. Keystone — если импульс в момент удара будет достаточен для того, чтобы элемент был разрушен, то разломается все тело;
. Break at time — элемент будет разрушен в указанное пользователем время.
Основными параметрами разбиения являются Impulse и Energy Loss, характеризующий величину потери энергии при ударе. Осколки — это объекты сложной формы, поэтому для их просчета модулю требуется время. Чтобы ускорить процесс вычисления поставленной задачи, для каждого из осколков необходимо правильно указать форму поверхности, по которой будет происходить просчет взаимодействия. Сам процесс вычислений эффекта Fracture достаточно сложен. Программе приходится вычислять не только физически правильное падение тел, но и разлет осколков. Подобрать параметры трехмерной сцены, при которых осколки будут реалистично разлетаться, бывает не всегда просто. Поэтому для каждого из осколков желательно использовать оптимизацию, то есть просчитывать соударения, используя упрощенную модель объекта. Если же вы будете просчитывать сцену с учетом геометрии осколков, времени на это может уйти очень много. Кроме этого, просчитанная сцена может оказаться неудачной, и вам придется переделывать все заново. Перед конечным просчетом анимации reactor2 для предварительного просмотра результата можно использовать окно Real-Time Preview. Однако, если ваши объекты- осколки будут иметь слишком сложную полигональную структуру, в этом окне вы их не увидите. В этом случае при попытке вызова окна Real-Time Preview возникнет сообщение с пояснением того, почему объект не будет в нем отображаться.
Для оптимизации нужно попеременно выделить каждый объект и в свитке Properties настроек утилиты reactor2 в области Simulation Geometry выбрать тип оптимизации. После оптимизации вы сможете просмотреть анимацию в окне Real-Time Preview. Если результат, который вы видите в окне предварительного просмотра, вас устраивает, нажмите кнопку Create Animation. При отсутствии ошибок программа начнет просчет анимационной сцены. Если в свитке Preview & Animation установлен флажок Update Viewports, то на протяжении просчета вы сможете наблюдать изменение положения объектов в сцене. После обработки данных можно будет воспроизвести анимацию. Полученная анимация будет выглядеть следующим образом: лампочка летит, падает на землю и разбивается на осколки (рис. 8).
Сергей и Марина Бондаренко
Но для начала, чтобы читатель, пожелавший повторить этот пример, не ломал голову над тем, где ему взять лампочку для экспериментов, мы расскажем, как создать этот несложный объект. Работать мы будем в 3ds max 7, поэтому, если у вас более старая версия, вы можете не найти некоторых инструментов, которые мы будем использовать.
Создание корпуса лампочки
Электрическая лампочка имеет грушеподобную форму и обладает осевой симметрией. Поэтому наиболее удобно для ее создания воспользоваться модификатором Lathe. Поскольку модификатор Lathe применяется исключительно к сплайновым формам, необходимо предварительно нарисовать в окне проекции сплайновый профиль будущей модели. Это можно сделать при помощи инструмента Line. Для редактирования формы сплайна переключитесь в режим редактирования Vertex и передвиньте вершины так, чтобы форма профиля была наиболее точной (рис. 1). Одно из условий корректного построения поверхности вращения в нашем случае — первая и последняя вершины сплайна должны иметь две общие координаты. Другими словами, точки должны лежать на оси. В противном случае после применения модификатора Lathe поверхность может содержать дефекты. Для того, чтобы убедиться в том, что координаты нужных точек совпадают, находясь в режиме редактирования Vertex, выделите одну из вершин, посмотрите ее координаты в строке состояния, затем выделите вторую вершину и в случае необходимости измените координаты, чтобы две из них совпадали. Это можно сделать, просто изменив число в соответствующих окошках. Теперь можно применить модификатор Lathe к объекту. В свитке Parameters настроек модификатора Lathe при помощи кнопки Y в области Direction выберите ось, вокруг которой будет происходить вращение сплайна. После этого в окне проекции сплайн превратится в фигуру вращения вокруг выбранной оси. Следует иметь в виду, что оси вращения — это координатные оси локальной системы координат. Их направление не совпадает с направлением координатных осей глобальной системы координат. Поэтому в нашем случае вращение производится вокруг локальной оси Y. Полученная модель не совсем похожа на объект, который нам необходимо создать. Усовершенствуем его. Определим положение для оси вращения. Для этого в области Align нажмите кнопку Mах. Выбранная ранее ось вращения будет автоматически смещена (рис. 2). Если созданная вами поверхность вращения приняла вывернутую форму, установите флажок Flip Normals.
Создание резьбы на цоколе
Мы получили модель, по форме приблизительно напоминающую электрическую лампочку. От настоящей лампочки ее отличает то, что на цоколе должна располагаться резьба, служащая для ее ввинчивания в патрон. Для ее создания можно использовать булевы операции вычитания, удаляя из корпуса лампочки объект Helix, который перед этим был конвертирован в редактируемую поверхность. Однако такой метод имеет ряд недостатков. Во-первых, необходимо точно подобрать настройки Helix и правильно расположить один объект относительного второго. Во-вторых, резьба, полученная таким способом, будет выглядеть слишком острой, в то время как на настоящей лампе она имеет сглаженные края. В этом случае лучший результат можно получить, используя модификатор Displace. Этот модификатор позволяет изменять геометрическую форму объекта, сдвигая каждую вершину полигональной поверхности, основываясь на заданном двухмерном изображении. Для того, чтобы выдавить резьбу с его помощью, необходимо определенным образом деформировать нижнюю часть модели. Для начала применим к модели модификатор Edit Poly. Это нужно для того, чтобы перед использованием модификатора Displace вы могли выделить ту область модели, к которой он будет применен. После применения модификатора Edit Poly переключитесь в режим редактирования Рolygon. Перейдите в окно проекции Front и выделите ту часть модели, на которую необходимо добавить резьбу. Выделенные полигоны станут красными (рис. 3). Проследите, чтобы в свитке настроек Selection был снят флажок Ignore Backfacing. В противном случае вам не удастся выделить поверхность объекта полностью, так как полигоны с обратной стороны останутся невыделенными. На выделенной поверхности для создания резьбы полигонов недостаточно. Если использовать модификатор Displace к такой области, форма полученной резьбы не будет соответствовать реальной. Поэтому необходимо, находясь в режиме редактирования Рolygon, перейти в свиток Edit Geometry и нажать кнопку Settings, расположенную справа от параметра Tesselate. В появившемся окне нужно установить переключатель в положение Edge. В результате этой операции плотность размещения полигонов будет увеличена. Теперь, не выходя из режима редактирования Рolygon, примените к выделенной области модификатор Displace. Искажать модель этим модификатором можно двумя способами: используя в качестве карты смещения черно-белый графический рисунок или же используя процедурную карту с такими параметрами, при которых она будет иметь подходящий рисунок.
Второй способ имеет несколько преимуществ: во-первых, при использовании процедурной карты отпадает необходимость прилагать к файлу сцены дополнительный графический файл. Во-вторых, вы можете легко управлять деформацией модели, изменяя параметры процедурной карты непосредственно в 3ds max. Для редактирования же графического файла вам понадобится дополнительное приложение. В-третьих, при изменении настроек процедурной карты вы имеете возможность сразу же наблюдать, как они влияют на форму объекта. В случае с графическим файлом придется создать как минимум несколько вариантов и загружать их по очереди, прежде чем вы добьетесь нужного результата.
В качестве процедурной карты смещения будем использовать стандартную карту Checker. Откройте Material Editor и выберите ее. Установите для карты следующие параметры: Tiling V — 2,3, Tiling W — 0, Blur — 100, Angle V — 13. Последнее действие позволит создать рисунок с косыми светлыми и темными полосками. Этот параметр будет определять угол, под которым будет расположена резьба на модели. Установите флажок напротив опции Tile. Переключатель, определяющий направление проецирования текстуры, установите в положение VW. Имейте в виду, что параметры являются ориентировочными и зависят от размеров области, к которой применен модификатор Displace. Вернемся в настройки модификатора Displace. В области Image, щелкнув на кнопке Map:None, установите в качестве карты смещения созданную вами карту Checker. Выберите тип проецирования карты искажения Cylindrical. После этого вы увидите, что в области воздействия модификатора появился габаритный цилиндр (рис. 4). Раскройте строку Displace в стеке модификаторов, щелкнув на значке плюса. Переключитесь в режим редактирования Gizmo и поверните габаритный цилиндр на 90 градусов. Для того, чтобы увидеть резьбу, в области Displacement задайте параметру Strength значение, равное 2,3. Для того, чтобы не было видно границ текстуры, значение параметра U Tile установите равным двум. После этого на лампочке появится желаемая резьба (рис. 5).
Разбивание лампочки
Теперь попробуем разбить лампочку средствами встроенного в 3ds max модуля для работы с динамикой reactor2. Поверхность вращения, созданная нами, не имеет реальной толщины. Поэтому reactor не сможет обработать в своих вычислениях такой объект, поскольку он не имеет массы. Для того, чтобы придать стенкам лампочки толщину, воспользуемся следующим приемом. Выделите модель в окне проекции и создайте его независимую копию. Для того, чтобы в дальнейшем вы могли работать с клонированным объектом, переключитесь в режим отображения Wireframe. Масштабируйте созданный объект до 91- го процента. При этом в окне проекции Front наблюдайте за тем, чтобы на цоколе не произошло пересечения между резьбой двух объектов (рис. 6). Выделите исходный объект и выберите объект Boolean. В свитке настроек Pick Boolean нажмите кнопку Pick Operand B и выберите второй объект. После выполнения булевой операции объект станет обладать толщиной. При ударе о землю лампочка должна рассыпаться на осколки. Для того, чтобы смоделировать такой эффект при помощи reactor, необходимо заранее создать объекты, которые будут участвовать в анимации. То есть нам необходимо разрезать трехмерную модель лампочки на отдельные осколки. Все эти объекты будут объединены инструментом Fracture и разлетятся, когда лампочка достигнет земли. Для создания осколков конвертируйте объект в Editable Poly. Переключитесь в режим редактирования Рolygon и выделите произвольную область лампочки. В свитке Edit Geometry нажмите кнопку Detach. В результате мы получим самостоятельный объект. Введите в появившемся окне его имя. Повторите операцию несколько раз, создав осколки разнообразной формы.
Теперь необходимо создать землю, о которую разобьется лампочка. Для ее создания используйте стандартный примитив Box. Расположите объект под лампочкой и задайте примитиву небольшую толщину и большую площадь. Выделите все элементы лампочки и слегка ее поверните. Это позволит получить более эффектное падение. Выделите все объекты в сцене. На панели инструментов reactor нажмите кнопку Create Rigid Body Collection. Вы увидите, что в окне проекции появилась пиктограмма вспомогательного объекта. Если выделить этот объект и перейти на вкладку Modify командной панели, можно увидеть, что в список твердых тел занесены все объекты, с которыми мы работаем. Перейдите на вкладку Utils командной панели и нажмите кнопку reactor. Выделите в окне проекции все осколки, перейдите в свиток Properties и установите для них значение параметра Mass. В зависимости от размеров вашего объекта и положения лампочки его значение может отличаться. В 3ds max 7 довольно часто встречаются физические величины. На первый взгляд, это усложняет работу, потому что не всегда на глаз можно определить, например, коэффициент трения или величину потерь энергии при ударе. Однако, с другой стороны, появляется возможность точно описать физическую задачу. Убедитесь, что в сцене выделены все осколки. На панели инструментов reactor нажмите кнопку Create Fracture. Вы увидите, что в окне проекции появилась пиктограмма вспомогательного объекта (рис. 7). Вместе с этим все осколки были занесены в список тел, подвергающихся разрушению. В случае необходимости для каждого из них можно указать тип разрушения. Для этого нужно выделить объект в списке Pieces и выбрать один из типов в области Selected Piece. Это может быть один из следующих вариантов разбиения:
. Normal — при некотором значении импульса элемент "отламывается";
. Unbreakable — элемент останется целым;
. Keystone — если импульс в момент удара будет достаточен для того, чтобы элемент был разрушен, то разломается все тело;
. Break at time — элемент будет разрушен в указанное пользователем время.
Основными параметрами разбиения являются Impulse и Energy Loss, характеризующий величину потери энергии при ударе. Осколки — это объекты сложной формы, поэтому для их просчета модулю требуется время. Чтобы ускорить процесс вычисления поставленной задачи, для каждого из осколков необходимо правильно указать форму поверхности, по которой будет происходить просчет взаимодействия. Сам процесс вычислений эффекта Fracture достаточно сложен. Программе приходится вычислять не только физически правильное падение тел, но и разлет осколков. Подобрать параметры трехмерной сцены, при которых осколки будут реалистично разлетаться, бывает не всегда просто. Поэтому для каждого из осколков желательно использовать оптимизацию, то есть просчитывать соударения, используя упрощенную модель объекта. Если же вы будете просчитывать сцену с учетом геометрии осколков, времени на это может уйти очень много. Кроме этого, просчитанная сцена может оказаться неудачной, и вам придется переделывать все заново. Перед конечным просчетом анимации reactor2 для предварительного просмотра результата можно использовать окно Real-Time Preview. Однако, если ваши объекты- осколки будут иметь слишком сложную полигональную структуру, в этом окне вы их не увидите. В этом случае при попытке вызова окна Real-Time Preview возникнет сообщение с пояснением того, почему объект не будет в нем отображаться.
Для оптимизации нужно попеременно выделить каждый объект и в свитке Properties настроек утилиты reactor2 в области Simulation Geometry выбрать тип оптимизации. После оптимизации вы сможете просмотреть анимацию в окне Real-Time Preview. Если результат, который вы видите в окне предварительного просмотра, вас устраивает, нажмите кнопку Create Animation. При отсутствии ошибок программа начнет просчет анимационной сцены. Если в свитке Preview & Animation установлен флажок Update Viewports, то на протяжении просчета вы сможете наблюдать изменение положения объектов в сцене. После обработки данных можно будет воспроизвести анимацию. Полученная анимация будет выглядеть следующим образом: лампочка летит, падает на землю и разбивается на осколки (рис. 8).
Сергей и Марина Бондаренко
Компьютерная газета. Статья была опубликована в номере 07 за 2006 год в рубрике софт