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

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

Одним из наиболее удобных и быстрых способов моделирования является создание трехмерных объектов при помощи булевых операций.

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

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

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

Поскольку в 3ds max основной акцент делается на моделирование неорганических объектов, то есть архитектурную визуализацию и разработку компьютерных игр, то булевыe операции - это незаменимый инструмент для каждого пользователя 3ds max.

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

Рассмотрим булевыe операции. На рис. 3.51 представлено исходное изображение. В 3ds max 7 доступны четыре типа булевых операций.

  • Union (Сложение). Результатом булевого сложения двух объектов будет служить поверхность, образованная поверхностями объектов, участвующих в данной операции (рис. 3.52).
  • Intersection (Пересечение). Результатом булевого пересечения двух объектов будет поверхность, состоящая из общих участков этих объектов (рис. 3.53).
  • Subtraction (Исключение). Результатом булевого исключения двух объектов будет поверхность, состоящая из поверхностей первого и второго объектов, но не включающая в себя общие участки этих объектов (рис. 3.54).

Рис. 3.51. Расположение объектов перед выполнением булевых операций

Рис. 3.52. Объекты после выполнения булевой операции Union (Сложение)

Рис. 3.53. Объекты после выполнения булевой операции Intersection (Пересечение)

Рис. 3.54. Объекты после выполнения булевой операции Subtraction (Исключение)

  • Cut (Вычитание). Результатом булевого вычитания двух объектов будет служить поверхность, образованная исключением из поверхности одного объекта участков, занятых вторым объектом (рис. 3.55).

Рис. 3.55. Объекты после выполнения булевой операции Cut (Вычитание)

Булевы операции выполняются следующим образом.

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

2. Перейдите на вкладку Create (Создание) командной панели, выберите в категории Geometry (Геометрия) строку Compound Objects (Составные объекты) и нажмите кнопку Boolean (Булева операция) (рис. 3.56).

3. Установите параметры булевой операции.

4. Воспользуйтесь кнопкой Pick Operand В (Выбрать операнд), чтобы выбрать второй объект, который будет участвовать в операции.

Рис. 3.56. Настройки объекта Boolean (Булева операция)

ПРИМЕЧАНИЕ

Несмотря на то что булевыe операции 3ds max 7 широко применяются при создании трехмерных проектов, они имеют ряд недостатков, и построение оболочки результирующей модели нередко происходит с ошибками. По этой причине многие разработчики трехмерной графики используют в своих проектах дополнительный модуль Power Booleans . Он позволяет создавать модели с более точной геометрией, чем те, которые можно получить, используя стандартные средства, а также быстрее строит полигональную сетку. Это особенно заметно при работе с объектами, имеющими большое количество полигонов.

Моделирование с использованием булевых операций подробно рассмотрено в разд. «Урок 6. Моделирование винта».

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

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

Рис. 6.6.1. Два исходных тела

Рис. 6.6.2. Объединение тел

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

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

На рис. 6.6.1 приведены исходные для булевой операции тела. На рис. 6.6.2 приведен результат операции объединения тел, на рис. 6.6.3 приведен результат операции пересечения, на рис. 6.6.4 и 6.6.5 приведены результаты операции вычитания тел.

Операцию вычитания тел можно свести к операции пересечения тел; для этого нужно вывернуть второе тело наизнанку и найти точки его объема, одновременно принадлежащие и объему первого тела. Вывернутое наизнанку тело S будем обозначать

Рис. 6.6.3. Пересечение тел

Рис. 6.6.4. Разность тел

Рис. 6.6.5. Разность тел

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

Объединение тел.

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

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

Пусть грани первого тела описываются поверхностями

а грани второго тела описываются поверхностями

На базе линий пересечения граней первого и второго тел

(6.6.3)

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

Ребра пересечения должны быть построены так, чтобы они полностью лежали внутри циклов граней исходных тел. Ребра пересечения могут подходить к границам грани только своими концами. В точках А, В и С (рис. 6.6.6) старые ребра граней должны быть разбиты каждое на два ребра, так как в результирующее тело войдет только часть исходной грани.

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

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

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

Если разрезаемое ребро базируется на кривой пересечения, заданной отдельными точками (двухмерные линии являются ломаными и точно совпадают в пространстве только в характеристических точках), то прежде чем разрезать такую кривую, нужно в обе линии вставить дополнительные точки, соответствующие точки пересечения трех поверхностей - двух поверхностей, лежащих по обе стороны разрезаемого ребра, и поверхности грани другого исходного тела. Например, если режется линия пересечения поверхностей поверхностью , то в линии нужно вставить дополнительные двухмерные характеристические точки, соответствующие пересечению поверхностей . Задача пересечения трех поверхностей сводится к решению системы шести скалярных уравнений (4.12.5) относительно шести параметров . Начальное приближение решения известно достаточно точно.

Так как каждое ребро исходных тел входит в циклы двух смежных граней, то после резки ребер исходных тел необходимо произвести корректировку этих циклов с учетом разрезанных ребер.

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

Третий этап завершает булеву операцию. Для того чтобы каждую из показанных на рис. 6.6.6 граней разрезать на части, нужно перестроить ее циклы и в соответствии с циклами изменить контуры, описывающие область определения параметров поверхности грани. На рис. 6.6.7 показаны две пересекшиеся грани (тонкими линиями со стрелками показано направление циклов граней исходных тел) и ребро пересечения. На рис. 6.6.8 показаны те части граней, которые войдут в объединение тел.

Рис. 6.6.7. Исходные грани тела

Рис. 6.6.8. Обрезанные грани

Стрелками показано направление перестроенных циклов граней тел. Каждый цикл представляет собой список ребер в порядке их следования и список флагов ориентации этих ребер в цикле.

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

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

Рассмотрим одну из двух пересекшихся граней, принадлежащих первому телу. Берем любое ребро пересечения рассматриваемой грани и начинаем с него составлять список ребер цикла. Ребро пересечения должно войти в цикл грани первого тела с отрицательным флагом, следовательно, цикл будет иметь направление, противоположное первому ребру. Для продолжения цикла среди ребер пересечения и среди старых ребер грани ищем все ребра, стыкующиеся с данным ребром в его начальной вершине. Среди найденных ребер выберем то, которое лежит слева от остальных (заворачивает влево на больший угол по сравнению с другими найденными ребрами, если смотреть вдоль цикла с наружной стороны грани). Выбранное ребро ставим в список цикла. Если выбранное ребро является старым, то оно сохраняет свой флаг в цикле. Если выбранное ребро есть ребро пересечения, то оно получит отрицательный флаг. Ребра пересечения обладают преимущественным правом по отношению к старым ребрам быть выбранными. То есть, если левее других оказались два совпадающих ребра, одно из которых является старым, а другое - ребром пересечения, то для продолжения цикла должно быть выбрано ребро пересечения.

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

Поиск стыкующихся ребер и определение угла поворота в точке стыка удобно выполнять по двухмерным кривым ребер грани. При этом можно работать даже с такими ребрами, которые в пространстве стянуты в точку (например, ребро в вершине конуса или полюсе сферы). На рис. 6.6.9 показано, что с новым ребром В А в точке А стыкуются несколько ребер. В данном случае для продолжения цикла, начатого с ребра пересечения В А, следует выбрать ребро АС.

Вновь построенные циклы рассортируем по группам, каждая из которых состоит из внешнего цикла и входящих в него внутренних циклов. У рассматриваемой грани могут остаться нетронутыми один или несколько старых циклов. Нетронутыми мы будем называть старые циклы грани, ни одно ребро которых не вошло в перестроенные циклы. Среди старых нетронутых циклов отберем те, которые необходимо включить в состав описания перестроенной грани. Ими являются старые внутренние циклы грани, лежащие внутри новых внешних циклов. Еще нужно определить, не потребуется ли включить в результат старый внешний цикл грани, если он остался нетронутым. Это необходимо сделать, если для некоторых новых внутренних циклов не найден новый внешний цикл и они лежат внутри старого внешнего цикла. Сортировку циклов удобно выполнять с помощью двухмерных контуров, соответствующих каждому циклу.

Если в результате сортировки внешних циклов получилось больше одного, то это означает, что из исходной грани в результате операции образовалось несколько граней. На рис. 6.6.10 а - 6.6.13 а приведены варианты исходных граней первого тела.

На рис. 6.6.10 б-6.6.13 б. приведены грани с добавлением ребер пересечения (ребра пересечения выделены). На рис. 6.6.10 в-6.6.13 в приведены грани, которые получились в результате операции.

Рис. 6.6.10. Исходная грань (а), грань с. добавлением ребер пересечения (б), результат операции (б)

Рис. 6.6.11. Исходная грань (а), грань с добавлением ребер пересечения (б), результат операции (в)

Рис. 6.6.12. Исходная грань (а), грань с добавлением ребер пересечения (б), результат операции (в)

Рис. 6.6.13. Исходная грань (а), грань с добавлением ребер пересечения (б), результат операции (в)

На рис. 6.6.10 грань с двумя циклами была разрезана и получилась одна грань с одним циклом. На рис. 6.6.11 грань с двумя циклами дала две грани. В примере, приведенном на рис. 6.6.12, потребовалось использовать старый внешний и внутренний циклы. На рис. 6.6.13 из одной грани получено две грани, причем для одной из них потребовалось использовать старый внешний цикл.

Описанное перестроение циклов выполняется для каждой пересекшейся грани первого тела.

С пересекшимися гранями второго тела поступим аналогично тому, как мы поступили с гранями первого тела, но с одной небольшой разницей. Ребра пересечения должны войти в перестроенные циклы граней второго тела с положительным флагом (в перестроенные циклы граней первого тела они вошли с отрицательным флагом). В этом состоит отличие перестроения циклов граней второго тела. Все остальные действия над гранями первого и второго объединяемых тел одинаковы.

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

Пересечение тел.

Коротко суть булевой операции пересечения тел можно описать следующим образом: нужно найти линии пересечения тел, удалить ту часть первого тела, которая не попала внутрь второго, и ту часть второго тела, которая не попала внутрь первого, а из всего остального построить новое тело.

Эта операция имеет много общего с операцией объединения тел. Вернемся к рис. 6.6.6. На нем приведены пересекающиеся грани: одна грань первого тела и две грани второго тела. Грани режут друг друга, так что в результирующую оболочку войдут только части этих граней.

В пересечение тел войдет часть грани первого тела, лежащая внутри второго тела, и часть грани второго тела, лежащая внутри первого тела (рис. 6.6.14) (в объединение тел вошла часть грани первого тела, лежащая вне второго тела, и часть грани второго тела, лежащая вне первого тела).

Рис. 6.6.14. Исходные грани

Рис. 6.6.15. Перестроенные грани пересечения тел

В этом и состоит основное отличие операций объединения и пересечения тел.

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

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

Разность тел.

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

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

Пересекающиеся ребра.

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

В большинстве случаев новые ребра не пересекают друг друга, но в некоторых частных случаях это возможно. На рис. 6.6.16 показаны два цилиндрических тела одинакового диаметра, оси которых пересекаются - крест из цилиндров. При булевом объединении этих тел возможна ситуация, когда будут построены всего два замкнутых ребра пересечения. Такие ребра имеют две точки пересечения: А и В, по крайней мере, одна из которых не будет совпадать с вершинами ребер, а будет лежать где-то на ребре. Точки пересечения ребер лежат в точках касания цилиндров. Эти ребра должны быть разрезаны в точках А и В и у их частей должна быть уточнена ориентация, так как при прохождении точки касания поверхностей в данном случае векторное произведение нормалей к ним, по которому ориентируются новые ребра, меняет свое направление на противоположное. Обнаружить пересечение новых ребер можно по пересечению кривых на поверхностях, из которых состоит линия пересечения.

Рис. 6.6.16. В точках А и В нормали граней совпадают

Совпадающие ребра.

Описанный алгоритм выполнения булевых операций работает корректно, если ребра пересечения не совпадают с ребрами исходных тел. В противном случае он нуждается в уточнении. Рассмотрим примеры.

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

Правило для ребер пересечения.

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

Рис. 6.6.17. Совпадение ребер пересечения с ребрами меньшего тела

Рис. 6.6.18. Пересечение граней

Рис. 6.6.19. Пересечение граней по ребру

Если грань не имеет продолже ния за ребро пересечения (ребро пересечения частично или полностью совпадает с ребром тела), то соответствующий вектор положим равным нулю (рис. 6.6.19). Используя векторы и нормали мы можем определить, будет ли данное ребро пересечения использовано в операции или оно должно быть опущено. Обратим внимание на следующее обстоятельство.

В операции объединения тел грань первого тела мы сможем перестроить, еслиона имеет продолжение справа от ребра пересечения вне второго тела, а грань второго тела мы сможем перестроить, если она имеет продолжение слева от ребра пересечения вне первого тела.

Таким образом, в булевой операции объединения тел для ребра пересечения должны быть выполнены условия

В противном случае рассматриваемое ребро пересечения в булевой операции объединения тел строить не следует (если оно построено, то должно быть опущено).

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

В противном случае рассматриваемое ребро пересечения в булевой операции пересечения тел строить не следует (если оно построено, то должно быть опущено).

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

То точка принадлежит внутреннему пространству тела. В противном случае - нет.

Перекрывающиеся грани.

В булевых операциях довольно часто можно встретить случаи частичного совпадения некоторых граней двух исходных тел. На рис. 6.6.20 приведены два тела, некоторые грани которых частично перекрывают друг друга.

Рис. 6.6.20. Совпадающие грани тел

Рис. 6.6.21. Объединение тел

В данном случае не все ребра пересечения граней войдут в булев результат; некоторые ребра должны быть опущены (или не должны строиться). Результат объединения тел приведен на рис. 6.6.21.

Аналогичная ситуация возникает при выполнении булевой операции над двумя соосными цилиндрами одинакового радиуса и еще во многих случаях. Грани могут перекрываться полностью, частично или всего лишь по одной линии.. Нормали частично перекрывающихся граней должны быть одинаково направлены в общих точках. Перекрывающимися являются грани, которые можно перенести на одну общую поверхность. Таких граней может быть больше двух. При наличии у тел-операндов перекрывающихся граней все ребра пересечения этих граней должны быть проверены на предмет присутствия их в булевом результате. В операции объединения тел нам потребуются только те ребра пересечения перекрывающихся граней, смежные грани которых имеют продолжение вне одного из тел. В операции пересечения тел нам потребуются только те ребра пересечения перекрывающихся граней, смежные грани которых имеют продолжение внутрь одного из тел.

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

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

Тела с несколькими оболочками.

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

Дерево построения тел.

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

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

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

Рис. 6.6.22. Дерево построения тела

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

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

В некоторых языках программирования названия операторов, соответствующих логическим и побитовым логическим операциям, похожи. Кроме того, язык программирования может допускать неявное приведение числового типа к логическому и наоборот. В таких языках программирования необходимо внимательно следить за использованием логических и побитовых операций, перемешивание которых может привести к ошибкам. Например, в C++ результатом выражения «2 && 1» (логическое И ) является булево значение true , а результатом выражения «2 & 1» (побитовое И ) - целое значение 0 .

Побитовое отрицание (NOT) [ | ]

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

НЕ 01
10

Побитовое «И» (AND) [ | ]

Второе название - тем, что действительно является сложением в кольце вычетов по модулю два, из чего следуют некоторые интересные свойства. Например, в отличие от вышеописанных «И» и «ИЛИ», данная операция является обратимой, или инволютивной: (x ⊕ y) ⊕ y = x {\displaystyle (x\oplus y)\oplus y=x} .

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

Другие побитовые логические операции [ | ]

В распространённых языках программирования встроенными средствами реализуются только четыре побитовые логические операции: И, ИЛИ, НЕ и исключающее ИЛИ . Для задания произвольной побитовой логической операции вполне достаточно перечисленных, и, более того, как следует из теории булевых функций, можно ограничиться ещё меньшим набором базовых операций. Есть также языки программирования, где существует встроенная возможность выполнить любую бинарную логическую операцию побитово. Например, в PL/I есть встроенная функция BOOL, третий аргумент которой предназначен для указания произвольной логической операции, которую необходимо побитово применить к первым двум аргументам .

Битовые сдвиги [ | ]

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

Также различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).

Логический сдвиг [ | ]

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

Арифметический сдвиг [ | ]

Арифметический сдвиг аналогичен логическому, но число считается знаковым, представленным в дополнительном е. Так, при правом сдвиге старший бит сохраняет своё значение. Левый арифметический сдвиг идентичен логическому.

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

Циклический сдвиг [ | ]

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

Также различают циклический сдвиг через бит переноса - при нём первый бит по направлению сдвига получает значение из бита переноса, а значение последнего бита сдвигается в бит переноса.

В языках программирования [ | ]

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

Язык НЕ И ИЛИ Искл. ИЛИ Сдвиг влево Сдвиг вправо Другие
/С++ , Java , , Ruby , Python ~ & | ^ << >>
Pascal not and or xor shl shr
Kotlin inv
PL/I INOT IAND IOR IEOR BOOL
¬ & | ¬
Prolog \ /\ \/

В теории сложности алгоритмов [ | ]

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

Связь с другими науками [ | ]

Битовые операции и математическая логика [ | ]

Битовые операции очень близки (хотя и не тождественны) логическим связкам в классической логике . Бит можно рассматривать как логическое суждение - его значениями являются 1 «истина» и 0 «ложь». При такой интерпретации известные в логике связки конъюнкции , дизъюнкции , импликации , отрицания и другие имеют представление на языке битов. И наоборот, битовые операции легко описываются на языке исчисления высказываний .

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

Обобщение операций на булеву алгебру [ | ]

Вместо одиночных битов мы можем рассмотреть векторы из фиксированного количества битов (в программировании их называют регистрами), например, байты . В программировании регистры рассматривают как двоичное разложение целого числа: b = b 0 + 2 b 1 + 2 2 b 2 + . . . + 2 N − 1 b N − 1 {\displaystyle b=b_{0}+2b_{1}+2^{2}b_{2}+...+2^{N-1}b_{N-1}} , где N - количество битов в регистре.

Тем не менее, ничто не мешает рассматривать эти регистры именно как битовые векторы и проводить булевые операции покомпонентно (бит номер k значения есть результат операции от битов номер k аргументов). Кстати, математически говоря, булевы операции распространяются таким образом на произвольную булеву алгебру . Таким образом мы получаем операции побитового И, ИЛИ, НЕ, искл. ИЛИ и т. д. Как арифметические, данные операции не обладают хорошими свойствами за исключением побитового НЕ, которое для чисел в дополнительном е совпадает с вычитанием из −1 (~x == -1-x). Однако, они очень полезны в программировании.

2-адическая интерпретация [ | ]

Целое число, записанное (в дополнительном е) в бесконечный (в сторону положительных степеней двойки) двоичный регистр является естественным объектом для теории p-адических чисел при p = 2 {\displaystyle p=2} . Множество целых 2-адических чисел (то есть произвольных бесконечных битовых последовательностей) может быть рассмотрено как булева алгебра точно так же как и множество значений битового регистра конечной длины. Все вышеперечисленные битовые операции оказываются непрерывными отображениями . Хотя практическое программирование не располагает регистрами бесконечной длины, это не мешает использовать данный теоретический факт в криптографии для создания быстродействующих алгоритмов шифрования.

Битовые операции как основа цифровой техники [ | ]

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

Практические применения [ | ]

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

  1. увеличение размера регистров, в которых битовые операции выполняются не по одной, а сразу на множестве 8, 16, 32, 64 битах
  2. экспериментальные устройства, где обобщают битовые операции с двоичной системы, на троичные и прочие системы счисления (так например, разработана теория работы с четверичной системой (

БУЛЕВА ОПЕРАЦИЯ

Булева операция предназначена для создания нового тела на основе двух или нескольких уже существующих тел. В результате выполнения операции создается новое тело, являющееся комбинацией исходных тел. Существуют три способа комбинирования исходных тел: сложение, вычитание и пересечение. Результатом операции “сложение” будет тело, включающее в себя часть, которая есть только у первого тела, часть, которая есть только у второго тела, и часть, которая является общей для обоих тел. Результатом операции “вычитание” будет тело, которое является вычитанием второго тела из первого, и будет состоять из части, которая есть только у первого тела. Результатом операции “пересечение” будет тело, которое является пересечением двух тел, и будет состоять только из части, которая является общей для обоих тел.

Задание булевой операции

Для задания булевой операции используется команда “3B:Создать Булеву операцию” . Вызов команды:

После вызова команды становится возможным выбор одной из двух опций:

Выбрать несколько операций.

Каждая опция, определяет способ создания булевой операции. Существует два способа

- создание булевой операции на основе двух тел (опция )

- создание булевой операции на основе нескольких тел (опция )

При вызове команды всегда активизирована опция “Выбрать первое тело”.

Существует еще один способ вызова команды: Подведите курсор к одной из операций модели и

нажмите , в появившемся меню выберите пункт “Создать”. Появится список возможных команд, которые можно вызвать при выборе операции. Выберите пункт “Создать булеву операцию”, при этом выбранное тело будет являться первым выбранным элементом команды.

Трёхмерное моделирование

В этом случае можно создать операцию только на основе двух тел.

Создание булевой операции на основе двух тел

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

1. Выбрать первое тело.

2. Выбрать второе тело.

3. Выбрать тип операции (сложение, вычитание, пересечение).

4. Завершить ввод.

Выбор первого тела осуществляется с помощью опции

Выбрать первое тело.

После выбора первого тела становятся доступны следующие опции

Выбрать второе тело.

Отменить выбор второго операнда булевой операции.

Булева операция

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

На нижнем рисунке слева показан результат операции вычитания, а справа – пересечения.

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

Создание копий исходных операций

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

Создать копию исходных операций.

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

Трёхмерное моделирование

Если была вызвана опция "Создать копию", то перед выполнением булевой операции производится выполнение специального действия. В результате этого действия создаются тела - копии исходных тел, которые в дальнейшем можно использовать. Поясним вышесказанное на примере. На рисунке показаны исходные 2D построения и две созданные булевы операции.

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

Создание булевой операции на основе нескольких тел

После вызова команды в автоменю становится доступной опция

Выбрать несколько операций.

Данная опция устанавливает режим создания булевой операции на основе нескольких тел. А также делает доступной опцию

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

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

Отменить выбор всех операций можно опцией

<К> Отменить выбор операций.

Термин «булева операция» в математике используется для обозначения операций сравнения между множествами. В 3D Studio MAX аналогичные операции сравнения применяются в отношении совмещающихся или перекрывающихся геометрических объектов сцены. Булева операция осуществляется путем создания булева составного объекта из двух существующих объектов — данные объекты называются операндами и обязательно должны пересекаться в некоторой области пространства. Операнды представлены в виде отдельных объектов на всей стадии редактирования булева составного объекта, что позволяет при необходимости выбирать и модифицировать их и даже выполнять анимацию.

Теоретические основы булева моделирования

В 3D Studio MAX предусмотрены пять типов булевых операций (рис. 1):

  • Union (Объединение) — результатом операции является объект, который получается вследствие объединения двух исходных объектов; при этом части объектов, оказавшиеся внутри общего внешнего объема, удаляются;
  • Intersection (Пересечение) — полученный объект является результатом пересечения двух исходных объектов; при этом части объектов, оказавшиеся вне общего внутреннего объема, удаляются;
  • (Вычитание (A-B)/Вычитание (B-A)) — результатом является объект, полученный посредством вычитания одного объекта из второго, все части которого отсекаются объемом первого и удаляются;
  • Cut (Вырезание) — полученный объект является результатом вырезания на поверхности первого объекта в местах пересечения со вторым объектом соответствующих отверстий и проемов.

Булевы объекты являются разновидностью составных объектов и поэтому принадлежат к группе Compound Objects (Составные Объекты) из категории Geometry (Геометрия) на панели Create (Создать). Технология создания булева объекта состоит из двух этапов — предварительной подготовки исходных объектов и последующего применения к ним требуемой булевой операции, причем перед применением последней один из исходных объектов обязательно должен быть выделен, иначе операция Boolean окажется недоступной.

Существует несколько методов создания булевых объектов:

  • Copy (Копия) — при создании булева объекта сохраняется оригинал операнда В;
  • Move (Перенос) — при создании булева объекта оригинал операнда В не сохраняется;
  • Instance (Образец) — создается Boolean-объект и одновременно сохраняется копия операнда В; при изменении копии булев объект будет изменяться, а при изменении булева объекта будет меняться копия;
  • Reference (Ссылка) — создается Boolean-объект и одновременно сохраняется копия В-операнда; если при этом изменять оригинал, то Boolean-объект тоже изменится; если же изменять Boolean-объект, то оригинал при этом изменяться не будет.
  • Результат булевой операции не всегда оказывается удачным, поэтому следует соблюдать ряд условий:
  • исходные объекты должны пересекаться в некоторой области пространства, причем характер пересечения нужно тщательно отрегулировать в окнах проекций;
  • исходные объекты должны иметь достаточное количество сегментов и быть сглаженными, иначе результат окажется слишком грубым или совсем не соответствующим задуманному;
  • каркасы должны быть построены правильно — грани, совместно использующие ребро, должны совместно использовать и две вершины, а ребро может совместно использоваться только двумя гранями. Для редактируемых сеток может потребоваться объединение совпадающих вершин вручную в режиме Edit Mesh .

Для примера попробуйте создать булеву операцию вычитания на примере трех перекрывающихся сфер (рис. 2). Выделите центральную сферу, на панели Create установите категорию объектов Geometry , в списке типов объектов укажите тип Compound Objects (Составные Объекты), щелкните по кнопке Boolean и установите операцию Subtraction (A-B) . Обратите внимание, что в начальный момент оказывается определенным лишь операнд A (рис. 3), поэтому для указания операнда B щелкните по кнопке Pick Operand B (Выбрать операнд B), а затем укажите мышью самую большую из сфер. В итоге в сфере, использованной в качестве операнда A, появится выемка (рис. 4). Если операнд B был задан неправильно, не следует сразу же вновь щелкать по кнопке Pick Operand B и указывать другой объект (хотя программа это позволяет), поскольку объект, неудачно выбранный как операнд B , не восстановится (рис. 5). В таких ситуациях нужно сначала отменить предыдущий выбор операнда B командой Undo и только потом сделать новый выбор.

Моделирование при помощи булева объединения

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

Для примера попробуем последовательно объединить три стандартных примитива — две сферы и цилиндр — в форму гантели. Создайте исходные объекты и разместите их по отношению друг к другу нужным образом (рис. 6 и 7). Выделите цилиндр, активируйте булеву операцию Union , для определения операнда B щелкните по кнопке Pick Operand B (Выбрать операнд B ), а затем укажите мышью одну из сфер. В итоге цилиндр и сфера станут единым объектом. Выделите объединенный объект, активизируйте режим создания булевых объектов, щелкните по кнопке Pick Operand B (Выбрать операнд B ) и укажите вторую сферу. Результатом станет получение одного единственного булева объекта (рис. 8).

Моделирование при помощи булева вычитания

Булевы операции вычитания наиболее широко используются при моделировании. Чаще всего они применяются для создания закруглений и углублений на первом из исходных объектов, а также выемок и сквозных отверстий в нем, и потому второй объект условно можно считать своеобразной стамеской или фрезой, которая создает желобок на первом объекте или выбирает какую-то его часть. В качестве «режущих инструментов» могут быть задействованы самые разные объекты, в частности объекты, полученные из криволинейных сплайнов путем лофтинга или вращения.

На первом этапе воспользуемся булевой операцией вычитания для формирования цилиндрического отверстия внутри шара. Создайте исходные объекты в виде шара и цилиндра (радиус сечения цилиндра должен быть меньше радиуса шара, а его длина — больше радиуса шара) и выровняйте их друг в отношении друга по осям X, Y и Z, применив операцию Align (Выровнять) (рис. 9). Проведите рендеринг и сразу же скорректируйте параметры объектов так, чтобы они оказались достаточно гладкими, особенно в области пересечения; если этого не сделать, то созданный булев объект тоже не будет иметь надлежащей гладкости. В данном случае видно (рис. 10), что степень гладкости требуется увеличить — это достигается путем повышения плотности объектов: увеличения количества сегментов и сторон сегментов и уменьшения размера сегментов (рис. 11). В то же время при работе со сложными моделями для ускорения процесса моделирования в ряде случаев лучше увеличивать плотность объектов, задействованных в качестве операндов, не перед созданием булевой операции, а после — в ходе редактирования операндов на уровне объектов.

Выделите цилиндр, установите режим создания булевых объектов, установите операцию Subtraction (B-A) (Вычитание B-A), для указания операнда B щелкните по кнопке Pick Operand B (Выбрать операнд B ) и укажите сферу. Это приведет к удалению внутренней части сферы точно по размеру исходного цилиндра таким образом, что в сфере появится сквозное отверстие (рис. 12).

Формируемые при помощи булева вычитания отверстия могут иметь самую разную форму, а результат зависит не только от размеров и формы объектов, но и от положения их в отношении друг друга, а также от того, какой из объектов был указан первым. Возьмите в качестве исходных объектов куб и шар и разместите их показанным на рис. 13 образом. Выделите куб, установите в режиме создания булевых объектов операцию Subtraction (A-B) и в качестве операнда B укажите сферу — результатом станет появление в ней соответствующего углубления (рис. 14), а потом сохраните результат (он нам позже потребуется). Отмените созданную булеву операцию и примените к исходным объектам булево вычитание Subtraction (A-B) , но в качестве первого операнда укажите сферу — и вместо куба с углублением итогом операции окажется шар, в котором как бы вырезана одна из его четвертей (рис. 15). Стоит отметить, что для получения того же самого результата совсем не обязательно было менять местами операнды: с таким же успехом можно было вместо операции Subtraction (A-B) выбрать операцию Subtraction (B-A) . Подобная взаимозамена операций Subtraction (A-B) и Subtraction (B-A) очень удобна, так как при неверном выборе операнда A не потребуется отменять операцию, а достаточно лишь переключиться с одной операции вычитания на другую.

Как было отмечено, форма получающейся выемки определяется вторым операндом. Попробуйте вместо шара создавать выемки и углубления другими объектами. Например, при применении объекта Hose (Шланг) (рис. 16) может быть получена резьбообразная выемка (рис. 17). Если же взять в качестве операнда B граненую призму Gengon (рис. 18), то выемка окажется многогранной (рис. 19), а при использовании веретена Spindle — скошенной (рис. 20 и 21) и т.п.

Булева операция Intersection (Пересечение) является обратной к булевым операциям Subtraction (A-B)/Subtraction (B-A) (Вычитание (А-В)/Вычитание (В-А), так как получаемые с ее помощью булевы объекты представляют собой фрагменты операндов A и B, которые удаляются при операции булева вычитания, если ее провести в отношении тех же самых объектов. Возьмите в качестве исходных рассмотренные выше куб и шар, выберите куб в качестве операнда A , а затем проведите булеву операцию Intersection (Пересечение) — результатом будет получение четверти шара, которая ранее оказывалась вырезанной в ходе операции Subtraction (B-A) (рис. 22).

Рис. 22. Исходные объекты и булевы объекты при операциях Intersection и Subtraction (В-А)

Более интересные варианты поверхностей создаются при использовании в качестве операнда B скрученных объектов. Можно попробовать получить подобный объект на основе примитива Torus , в исходном состоянии имеющего такой вид, как на рис. 23, а после скручивания (параметр Twist ) на 360° — как на рис. 24. Дополнительно создайте цилиндр, разместите объекты, как показано на рис. 25, и при выполнении булевой операции Subtraction (A-B) укажите цилиндр как операнд A — результат представлен на рис. 26.

Создание вложенных булевых объектов

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

Для примера возьмите ранее созданный и сохраненный булев объект (рис. 27), создайте еще один цилиндр и разместите его так, как показано на рис. 28. Выделите исходный булев объект (для этого придется выйти из списка Compound Objects (Составные объекты) путем выбора геометрии другого типа), активируйте булеву операцию вычитания Subtraction (A-B) и вторым операндом укажите отдельный цилиндр — в кубе появится еще одна выемка (рис. 29). Полученный булев объект можно использовать для новой булевой операции, например вырезав в нем пирамидой треугольную выемку (рис. 30 и 31).

Рис. 29. Результат первой вложенной булевой операции

Редактирование булева объекта

У созданного булева объекта можно изменить цвет; объект можно перемещать, масштабировать и поворачивать обычным образом. При необходимости в области параметров на панели Modify можно откорректировать имена операндов, установить способ отображения булева объекта и определить особенности его обновления при редактировании. Работая со сложными моделями, которые долго перерисовываются, иногда лучше отказаться от автоматического режима обновления в пользу ручного режима Manually (Вручную) — тогда для перерисовки модели нужно будет щелкать по кнопке Update (Обновить).

Здесь же можно установить опцию Hidden Ops , которая позволяет при просмотре результата видеть в виде сетки операнд, исчезающий при выполнении булевой операции (рис. 32). Данная опция служит для информации о точном местонахождении операнда и о его влиянии на булеву операцию и часто используется при создании анимации.

Кроме того, булев объект можно редактировать на уровне операндов. Рассмотрим это на примере изучения взаимосвязи между положением операндов по отношению друг к другу и внешним видом булева объекта. Создайте в качестве исходных объектов два цилиндра и разместите их так, как показано на рис. 33. Выделите меньший из объектов, установите булеву операцию вычитания Subtraction (B-A) и вторым операндом укажите другой цилиндр, вследствие чего в большем цилиндре появится отверстие (рис. 34). Данное отверстие не будет сквозным, что обусловлено исходным положением цилиндров.

Полученный результат можно изменить, причем для этого даже не потребуется отменять булеву операцию, поскольку операнды булева объекта в определенной степени редактируемы, причем независимо друг от друга: их можно выделять, перемещать, масштабировать и поворачивать по отношению друг к другу, меняя таким образом сам булев объект. Редактирование операндов осуществляется в режиме Sub-Object , для перехода в который нужно при выделенном булевом объекте раскрыть свиток Boolean панели Modify , подсветить строку Operands , а затем указать редактируемый операнд (рис. 35) и произвести над ним нужные манипуляции. При перемещении операнда или любой другой манипуляции над ним в проекции Perspective будет сразу же отображаться обновленный булев результат. Для примера переместите в окне проекции Left операнд A влево — по мере перемещения глубина отверстия будет увеличиваться (рис. 36), а при обратном перемещении — уменьшаться (рис. 37). Если продолжить перемещение операнда A влево, то в конце концов отверстие станет сквозным (рис. 38), а при обратном движении превратится в едва заметную выемку (рис. 39).

Аналогичным способом можно не только перемещать и поворачивать операнды, но и менять их размеры. Попробуйте для операнда A провести масштабирование инструментом Select and Uniform Scale —— таким способом можно менять размеры выемки, например сделать ее очень большой по диаметру (рис. 40) или, наоборот, очень маленькой. Для того чтобы вернуться из режима редактирования операндов в режим редактирования булева объекта, нужно подсветить в палитре Modify строку Boolean — после этого операции масштабирования, перемещения и поворота будут относиться ко всему булеву объекту в целом.

Операнды можно редактировать и на уровне объектов: менять длину, ширину, высоту, число сегментов и т.п. Чтобы перевести булев объект в режим редактирования на уровне объекта, на палитре Modify следует активировать строку Operands , выбрать нужный операнд, а затем в списке Boolean щелкнуть на строке под строкой Operands , где, например, в случае использования примитивов будет фигурировать имя примитива в общем виде (рис. 41).

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

Пиала

Создайте в качестве исходных объектов шар и параллелепипед (Box ) и разместите их так, как показано на рис. 42. Шар в окне Perspective не виден, так как его верхняя часть находится внутри параллелепипеда, а нижняя оказалась скрыта. Выделите параллелепипед и примените к нему булеву операцию вычитания Subtraction (B-A) , указав шар вторым операндом, — в итоге останется только нижняя половина шара (рис. 43). Выделите созданный булев объект, конвертируйте его в редактируемую сетку, выбрав из контекстного меню команду Convert To=>Convert to Editable Mesh (Конвертировать в => Конвертировать в редактируемую сетку), и перейдите в режим редактирования полигонов. Поскольку работа предстоит довольно кропотливая, перейдите в режим отображения одной проекции, щелкнув на кнопке Min/Max Toggle (рис. 44).

Теперь потребуется последовательное применение операций Bevel , масштабирования и Extrude (Вытеснение). Вначале сделайте фаску, установив значение справа от Bevel (Фаска) равным примерно –1 (рис. 45). Затем примените операцию масштабирования и уменьшите выделенную часть объекта, а потом удалите самый верхний фрагмент половины шара посредством операции Extrude (рис. 46). Нанесите небольшую фаску для скашивания удаляемой поверхности, еще раз проведите масштабирование и примените операцию Extrude — и действуйте так до тех пор, пока заготовка не станет напоминать грубую чашу (рис. 47). Для сглаживания поверхности примените модификатор MeshSmooth (Сглаживание сетки) — возможно, в итоге пиала станет напоминать представленную на рис. 48.

Примерно такую же пиалу можно получить и более быстрым способом, но тоже с применением булевых операций. Возьмите в качестве основы полученную выше в ходе булева вычитания нижнюю половину сферы (рис. 49), создайте ее копию, потом немого уменьшите ее в размерах инструментом Select and Uniform Scale , выровняйте по осям X, Y и Z, щелкнув по кнопке Align (рис. 50), а затем слегка переместите вверх. Выделите меньшую полусферу и создайте новый булев объект с помощью булева вычитания Subtraction (B-A) , указав в качестве операнда B большую полусферу (рис. 51). Полученная после сглаживания пиала представлена на рис. 52.

Волчок

Создайте конус (Cone ) (рис. 53). Сформируйте объект Box (Коробка) и выровняйте его командой Align по конусу по осям X, Y и Z (рис. 54). Сделайте копию второго объекта, а затем разместите объекты, как показано на рис. 55. Выделите конус, установите в режиме создания булевых объектов операцию Subtraction (A-B) и в качестве операнда B укажите объект Box 01 (рис. 56). Затем повторите данную операцию, но операндом A в этом случае станет созданный перед этим булев объект, а операндом B — объект Box 02 (рис. 57). Создайте новый конус с параметрами, указанными на рис. 58, а затем выровняйте его по булеву объекту по осям X, Y и Z (рис. 59).

Выделите булев объект и сделайте его зеркальное отображение по оси Z с формированием копии, щелкнув по кнопке Mirror Selected Object (Зеркальное отображение выделенного объекта), и настройте параметры зеркального отображения (рис. 60). Точно таким же образом сделайте зеркальную копию конуса — получится волчок (рис. 61).

Ключ

Попытаемся создать имитацию ключа, предварительно сформировав все его детали путем лофтинга, а затем объединив их при помощи булевой операции. Создайте серию сплайнов примерно такого вида, как на рис. 62: прямоугольник предназначен для использования в качестве сечения loft-объекта, а все остальные сплайны будут играть роль пути. Обратите внимание, что при создании лофт-объектов в данном случае нужно выбрать метод указания сечения, а не пути — иначе после их получения придется потратить много времени на размещение loft-объектов нужным образом. Выделите первую окружность, щелкните по кнопке Geometry Create Compound Objects Object Type (Тип объекта) щелкните на кнопке Loft (Лофтинговый), затем по кнопке Get Shape (Указать путь), и укажите мышью прямоугольник. Выделите вторую окружность и вновь создайте лофтинговый объект, указав в качестве сечения тот же самый прямоугольник. Точно таким же способом создайте лофтинговые объекты для всех остальных сплайнов (рис. 63).

Теперь нужно превратить отдельные фрагменты ключа в единый объект, что проще всего сделать с помощью создания вложенного булева объекта. Выделите первый loft-объект, активизируйте булеву операцию Union , щелкните на кнопке Pick Operand B и укажите второй loft-объект. Создайте новый булев объект, задействовав полученный булев объект как операнд A, а один из loft-объектов — как операнд B и продолжайте до тех пор, пока не объедините все фрагменты ключа. Окончательный результат показан на рис. 64.

Оконная рама

Комбинируя операции лофтинга и булева объединения (как в примере с ключом), можно сформировать очень много объектов такого вида, как оконные рамы, дверные проемы и т.п., каждый из которых представляет собой несколько состыкованных между собой отдельных элементов. Например, попробуйте сначала создать окно из серии отдельных сплайнов (рис. 65), затем превратите каждый сплайн в лофтинговый элемент, а потом соедините фрагменты рамы между собой булевым объединением (рис. 66).

Кружка с ручкой

Для основы кружки создайте цилиндр (рис. 67) и конвертируйте его в редактируемую сетку, выбрав из контекстного меню команду Convert to=>Convert to Editable Mesh (Конвертировать => Конвертировать в режим редактирования сетки). Активируйте режим редактирования вершин Vertex и выделите внутренние вершины только верхнего сечения (рис. 68) — проще всего выделить все внутренние вершины (верхнего и нижнего сечений) на проекции Top , а затем при нажатой клавише Alt исключить вершины нижнего сечения на проекции Front . Перетащите на проекции Front выделенные вершины инструментом Select and Move вниз таким образом, чтобы сформировалась внутренняя пустая полость кружки (рис. 69). Не снимая выделения, активируйте инструмент Select and Uniform Scale и отмасштабируйте выделенную область так, чтобы внутренние вершины совпали в вершинами промежуточного яруса (рис. 70), а внутренняя полость кружки стала одинаковой по диаметру как в верхней части кружки, так и в нижней.

На проекции Top выделите внутренние вершины верхнего и среднего сечений (рис. 71) — это удобнее осуществить, вначале выделив все внутренние вершины с областью выделения Circular Selection Region , а затем исключив вершины нижнего сечения при нажатой клавише Alt областью выделения Rectangular Selection Region . Отмасштабируйте их на проекции Top так, чтобы радиус, на котором они расположены, приблизился к внешнему радиусу, а толщина стенки кружки уменьшилась (рис. 72). На проекции Front выделите оказавшиеся в ходе масштабирования за пределами объекта вершины верхнего сечения (рис. 73) и переместите их вниз (рис. 74). Аналогичную операцию проведите в отношении внутренних вершин нижнего сечения (рис. 75).

Для создания ручки к кружке активизируйте категорию объектов Shapes (Формы) командной панели Create (Создание), в списке разновидностей объектов укажите тип Splines (Сплайны) и инструментом Line (Линия) постройте криволинейный сплайн (рис. 76), который будет использован как путь при построении лофтингового объекта. Создайте эллипс для использования в качестве сечения loft-объекта. Выделите эллипс, щелкните по кнопке Geometry (Геометрия) командной панели Create (Создать) и выберите в раскрывающемся списке разновидностей объектов вариант Compound Objects (Составные объекты). В свитке Object Type (Тип объекта) щелкните по кнопке Loft (Лофтинговый), потом по кнопке Get Path (Указать путь) и укажите мышью предварительно созданный сплайн пути. Поместите созданную ручку на ее место, отрегулировав ее положение на всех проекциях (рис. 77). Рассмотрев объект со всех сторон, вы увидите, что некоторые фрагменты ручки выступают в полости кружки, а потому их стоит удалить. Для этого конвертируйте ручку в режим редактируемой сетки, выделите лишние вершины (рис. 78) и нажмите клавишу Del .

Чтобы кружка и ручка стали единым целым, нужно объединить их при помощи булевой операции. Выделите кружку, установите выполнение операции Union , щелкните по кнопке Pick Operand B , а затем по ручке — объекты объединятся. При этом на панели Modify будет видно, что исходными элементами булевой операции является объект типа Editable Mesh (Редактируемая сетка) и loft-объект (рис. 79). Подберите для булева объекта нужные параметры сглаживания и проведите рендеринг — линия соединения ручки с кружкой станет практически незаметной (рис. 80).

Головка для накидного гаечного ключа

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

Создайте два цилиндра и соедините их между собой булевой операцией объединения (рис. 81). Затем создайте два сплайна — звезду и линию (рис. 82), выровняйте звезду относительно большего цилиндра по осям X, Y и Z (рис. 83). Создайте loft-объект, указав линию в качестве пути, отрегулируйте его положение относительно объекта из цилиндров (рис. 84). Вырежьте соответствующую полость из большого цилиндра, выделив многогранный лофтинговый объект, активировав булеву операцию вычитания Subtraction (A-B) и указав цилиндры в качестве операнда B , в результате чего внутри большого цилиндра появится многогранная полость (рис. 85).

Создайте параллелепипед, ширина и высота которого одинаковы и по размеру немного меньше диаметра вырезанной полости. Поместите его внутрь большего цилиндра и выровняйте по осям X и Z (рис. 86). На основе уже созданного булева объекта и параллелепипеда сформируйте вложенный булев объект, вырезав параллелепипедом соответствующую полость внутри большого цилиндра (рис. 87). Затем создайте цилиндр с меньшим радиусом, чем радиус меньшего из уже имеющихся цилиндров, поместите его внутрь меньшего цилиндра и выровняйте по осям X и Z (рис. 88). Вырежьте данным цилиндром полость внутри меньшего из цилиндров вложенного булева объекта при помощи операции булева вычитания и получите деталь, представленную на рис. 89, которая будет иметь примерно такой же вид, как головка для накидного гаечного ключа.