Тип «Булево» и логические операции. Физическая реализация битовых операций

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

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

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

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

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

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

Поскольку в 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. Моделирование винта».

Термин «булева операция» в математике используется для обозначения операций сравнения между множествами. В 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, которая будет иметь примерно такой же вид, как головка для накидного гаечного ключа.

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

В некоторых языках программирования названия операторов, соответствующих логическим и побитовым логическим операциям, похожи. Кроме того, язык программирования может допускать неявное приведение числового типа к логическому и наоборот. В таких языках программирования необходимо внимательно следить за использованием логических и побитовых операций, перемешивание которых может привести к ошибкам. Например, в 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. экспериментальные устройства, где обобщают битовые операции с двоичной системы, на троичные и прочие системы счисления (так например, разработана теория работы с четверичной системой (

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

Составной булев объект отличается от многих программных понятий булевых операций, поскольку он не изменяет на постоянной основе формы, определяющие геометрию операндов. Позже эту геометрию можно перемещать, переопределять и производить обмен. Поскольку операнды остаются объектами, с ними можно взаимодействовать как с любым другим объектом. Для них можно даже выполнять анимацию, создавая поразительные эффекты. Затененные видовые окна 3DS МАХ позволяют видеть результат булевой операции в случае изменения операндов. Последнее является преимуществом интерактивного режима работы и вызывает ощущение, что один объект используется для вырезания другого. Оставаясь весьма полезными и развлекательными, сложность булевых операций может возрасти при вложении их одна в другую. В этой главе приводится информация, позволяющая упростить использование булевых операций. Внимание уделяется:

  • Основам булевых операций и способам увеличения их интерактивности
  • Работе со вложенными булевыми объектами
  • Использованию различных булевых операций для создания скульптур и моделирования
  • Соображениям, которые необходимо учитывать для успешного выполнения булевых операций

Основы булевых операций

Как и для многих терминов компьютерной графики, термин "булева" происходит от имени человека, который ввел это понятие (в данном случае это Джордж Буль). В математике термин "булева" появился для обозначения операции сравнения между множествами; в 3D Studio MAX подобное сравнение выполняется между геометрическими объектами. Хотя булева операция выглядит во многом похожей на модификатор, она находится на панели Create, а не на панели Modify, поскольку выполняется определение нового объекта из двух существующих (аналогично созданию loft- или morph-объектов). Булева операция в 3D Studio MAX выполняется путем создания булевого составного объекта из двух существующих объектов, которые называются операндами , при этом выполняются следующие шаги:

  1. Выберите начальный объект для булевой операции.
  2. Выберите Compound Objects (составные объекты) из списка выборки Geometry в панели Modify и затем щелкните на кнопке Boolean.
    Выбранный объект становится операндом А для составного булевого объекта. Теперь можно выбрать операнд В.
  3. Выберите требуемый тип операции (Operation:).
  4. Щелкните на Pick Operand В (выбрать операнд В) и затем выберите второй объект.
    Объекты сравниваются для определения их действительности (с точки зрения выполнения булевой операции) и, если они действительны, булева операция выполняется.
    Теперь можно изменить тип операции и увидеть различные булевы результаты.

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

ПРЕДУПРЕЖДЕНИЕ Можно щелкнуть на кнопке Pick Operand В и выбрать другой Operand В произвольное количество раз. При выборе нового операнда В первоначальный операнд со сцены удаляется. При выборе в качестве операнда В неправильного объекта щелкните на кнопке Undo перед выбором другого операнда В.

Булевы выражения в качестве составных объектов

Чрезвычайная гибкость булевых операций в 3DS МАХ состоит в том, что объекты, содержащие булевы операнды, по-прежнему существуют как объекты. Каждый операнд сохраняет свой первоначальный стек Edit History (отредактировать историю) и его можно модифицировать из панели Command. Операнды можно даже трансформировать на уровне подобъекта. На рисунке 11.2 показан результат в Track View после создания булевого объекта.

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

ПРИМЕЧАНИЕ Из объекта, выбранного в качестве операнда В, удаляется любая анимация трансформации, в то время как операнд А (первоначальный объект) оставляет анимацию трансформации. Если операнд А имеет анимацию трансформации, для нового статического операнда используется текущее расположение кадра, его позиция и масштаб.

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

СОВЕТ Чтобы создать экземпляр из объекта, который уже является операндом, войдите в Track View. Скопируйте определение объекта операнда (указано синим кружком) в буфер обмена и вставьте его в определение другого объекта в виде экземпляра. Этот метод можно также использовать в обратном порядке, полностью переопределяя геометрию операндов, например путем изменения всех квадратных отверстий на круглые.

После создания булевого объекта можно заменить операнд В из панели Modify булевого объекта с теми же самыми выборами, предоставленными при создании. Используйте эту опцию осторожно, поскольку она уничтожает со сцены первоначально выбранный операнд В. Уничтожение оригинала может создать проблему при первоначальном использовании опции Move и представлении геометрии, которая уже не существует в виде отдельного объекта. Выбор другого операнда - это то же самое, что и замена определения объекта операнда в Track View, за исключением случая, когда необходимо сделать ссылку, которая не присутствует в Track View.

После создания булевого объекта можно вернуться к каждому Modifier Stack операнда на панели Modify (см. рис. 11.3). При первом входе в панель Modify булевого объекта не выбран ни один из операндов, поэтому Modifier Stack показывает только Boolean. Для модификации стека конкретного операнда необходимо произвести выбор из списка Operands. Теперь выбранный операнд отображает свой стек. Можно настроить любой модификатор в стеке или добавить новые модификаторы для оказания влияния на объект операнда перед булевой операцией. На параметры, с которыми можно выполнять анимацию, дополнительных ограничений не существует. Для трансформации операнда необходимо активизировать режим Sub-Object для булевого объекта. При таком подходе операнды можно считать подобными гизмо за тем исключением, что в отличие от гизмо, у операндов имеются собственные Modifier Stack.

Опции обновления

Опции Update (обновления) для булевых операций управляют тем, как фактически выполняются булевы вычисления. Для сложных объектов булевы вычисления могут занимать достаточно большое время. Эти вычисления замедляют редактирование других объектов, если они являются экземплярами или ссылками на булевы операнды. Если при моделировании возникают паузы, измените опцию Update. Опция Manually (вручную) является одним из наиболее консервативных методов и обеспечивает наибольшее управление вычислением операций. Такой режим наиболее пригоден для сложных моделей. Метод When Rendering (во время визуализации) не вычисляет операцию до тех пор, пока не будет выполнена окончательная визуализация, после чего производится возврат откорректированного результата на сцену. Метод When Selected (при выборе) несколько ненадежен в обновлении результата и на него не следует полагаться.

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

СОВЕТ Длительные булевы вычисления можно завершить, нажав клавишу Escape во время отображения курсора ожидания. После такого завершения режим Update автоматически переходит в Manually, поэтому теперь можно точно управлять временем вычисления обновления (поскольку геометрия, по всей вероятности, является сложной).

Интерактивные булевы операции

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

ПРИМЕЧАНИЕ Для сложных булевых операций режим Update для булева выражения должен быть установлен в Manually, чтобы операнд можно было позиционировать без дополнительных задержек на вычисления. После помещения операнда на требуемое место щелкните на Update для просмотра нового результата.

Понимание опций Display (отображения) булевой операции является ключевым моментом при выполнении интерактивных изменений. Результат булевой операции показывает опция по умолчанию Result (результат). При изменении опции на Operands (операнды) отображаются оба операнда А и В так, как будто булевой операции не выполнялось. Полностью отображенный операнд скрывает булев результат, поэтому в некоторой степени приходится работать вслепую. На практике лучше всего является комбинация, при которой выбирается Result и активизируется опция Show Hidden Ops (показать скрытые операнды). При этом недостающие операнды отображаются в виде проволочных каркасов (но только в затененных видовых окнах) и обеспечивается информация о точном местонахождении операнда и о его текущем влиянии на булеву операцию.

ПРИМЕЧАНИЕ Помните, что операнд всегда можно присвоить другому контроллеру объекта или контроллеру уникального Path, Look At (посмотреть на) или Expression (выражение) для создания эффектов, подобных анимированным кусочкам сверла или ожогам лазера.

Вложенные булевы объекты

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

После создания булевого объекта на той же самой геометрии можно выполнять дополнительные булевы операции путем выбора объекта в качестве операнда А для нового составного булевого объекта. Каждый раз при выполнении на объекте булевой операции фактически создается оригинал операнда нового булевого объекта. Таким образом определяется "булево дерево", состоящее из одиночных ветвей - весьма линейная прогрессия шагов. К каждой выполняемой булевой операции можно осуществить доступ позже, хотя применяемый для этого метод требует небольшой практики, поскольку все это происходит на панели Modify. Результаты выполнения трех последовательных булевых операций показаны на рисунке 11.4. Коробка вычитает сферу, затем цилиндр и, в конце концов, конус.

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

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

При навигации по булевому дереву в Track View необходимо помнить, что в нем отражаются только объекты с параметрами, с которыми можно выполнить анимацию. Если булев объект создан из необработанного каркаса или лоскута, показываются только трансформации операнда, поскольку у него нет параметров создания, которые нужно настраивать. Когда для этого же объекта задается модификатор, для модифицированного объекта создается новый вход. То, что у операнда такая же метка, что и у Transform (с голубым кружком модификатора вместо зеленого треугольника контроллера) может привести к замешательству. При глубоком погружении в дерево, изображенное ранее на рисунке 11.4, следите за голубыми кружками Operand. Только самый глубокий операнд А содержит определение объекта; определения всех других объектов находятся внутри предыдущих операндов В.

СОВЕТ При использовании в качестве операндов примитивов Track View перечисляет их параметры под общим заголовком Operand. Задани]е для примитива модификатора, например Material, перемещает параметры создания в сферу модифицированного объекта, расположенную под операндом, вместе с меткой, обозначающей тип объекта.

Булевы характеристики

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

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

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

Иногда булев результат содержит дефекты в виде петель и искажений. Эти дефекты часто вызваны тем, что аналогичные сглаживающие группы действуют друг на друга методами, которые не должны применяться, или вершины объединяются так, что сглаживание произойти не может. Если такого рода дефекты видны, примените модификатор Edit Mesh, выберите все вершины и выполните Weld Selected (объединить выбранные). Если дефекты не исчезают, необходимо проанализировать присвоения сглаживающих групп (перед булевой операцией или после нее).

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

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

Соображения по улучшению булевых операций

Булев код в 3DS МАХ очень обобщен и позволяет работать с произвольными поверхностями. Однако подобное обобщение означает, что не каждый объект образует действительный булев объект и что некоторые "действительные" результаты могут иметь артефакты (например, длинные грани планки) или содержать нежелательные результаты. Ниже приведен контрольный перечень, который поможет при поиске неисправностей и создании моделей, дружественных для булевых операций:

  • Нормали для всей поверхности должны быть унифицированы без всяких ложных граней, указывающих в неправильном направлении. Нормали граней используются в определении направления поверхности и результирующего булевого объекта.
  • Каркас должен быть построен правильно; это означает, что грани, совместно использующие ребро, должны совместно использовать две вершины, а ребро может совместно использоваться только двумя гранями. (Внутренние основные грани вершин объекта вращения для последнего правила являются типичным кошмаром.)
  • Обеспечивайте объединение всех вершин. Может потребоваться объединение всех вершин вручную с помощью Edit Mesh даже для последовательных булевых операций.
  • Копланарные грани, в особенности те, которые находятся внутри одного и того же объекта, причиняют беспокойство и их следует избегать. Одним из наихудших случаев являются копланарные грани, расположенные тыльными сторонами друг к другу (они легко создаются путем построения примитива с нулевой высотой).
  • Булевы операции надежно работают только с одиночными элементами. Если любой из операндов состоит из множества элементов (например, Teapot или Hedra), в каждый момент времени может успешно работать только один элемент.
  • Если операция не удается, выключите опцию Optimize Result (оптимизировать результат) в нижней части свитка так, чтобы последний проход, контролирующий компланарные грани, не вычислялся. Включенная опция Optimize Result часто может быть причиной получения некорректных результатов.
  • Если операция по-прежнему не удается или создает расщепленные грани, попытайтесь выполнить небольшую настройку операндов.
  • Изменяйте уровень детализации операнда, в особенности возле области, которая является локальной для действующей булевой операции.

Не допускайте того, чтобы этот контрольный перечень испугал вас и заставил избегать булевых операций. Большинство этих опций работает с первой попытки, в особенности если геометрия подчиняется первым трем правилам, а это, скорее всего, будет выполняться при создании геометрии в рамках 3DS МАХ.

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

Вырезание при помощи булевого вычитания

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

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

ПРИМЕЧАНИЕ Может оказаться полезным обеспечить выбор "режущих инструментов" в виде кривых Безье, которые для целей операций булевого вычитания можно вытягивать, выполнять с ними операцию лофтинга или вращать. Более сложные булевы режущие формы при необходимости можно сохранить в виде каркаса или в слитом виде.

Создание посредством булевого пересечения углублений в новых объектах

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

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

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

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

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

Булево объединение также применяется для создания двух элементов, которые можно отделить от других при помощи функции Detach в Edit Mesh. Если операция булевого объединения используется для редактирования объектов там, где геометрия перекрывается однократно, каркас не образуется. Когда результирующие объекты разделяются, в каркасе появляется отверстие в месте соединения объектов. Для эффективного использования этого метода лучше всего присвоить каждому операнду уникальный идентификационный номер материала (Material ID#) так, чтобы можно было легко выбирать грани по Material ID# из Edit Mesh при выполнении отсоединения.

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

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

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

Логическая операция Равно обозначается знаком «=». В подавляющем большинстве случаев логические операции используются в инструкциях Если и Цикл. Но эти инструкции вам пока незнакомы.

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

Рис. 3.79. Заготовка для операции «Равно»

Теперь внутри скобок напишите операцию Равно. Например, 5 = 5.

Затем напишите еще одну инструкцию присваивания, но так, чтобы в операции Равно участвовали разные числа. Например, 5 и 2.

Запустите «1С:Предприятие» в режиме отладки и посмотрите, чему равны переменные в этих инструкциях (рис. 3.80).

Рис. 3.80. Значение «Истина» и значение «Ложь»

Вы увидите, что там, где сравниваются два одинаковых числа, результатом является значение Истина. А там, где сравниваются разные числа, результатом является значение Ложь. К тому же оба этих значения имеют тип Булево (ударение на букву «у»).

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

Таблица 3.1. Операции сравнения

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



А вот оставшиеся четыре операции (больше/меньше) можно применять только к двум числам, двум строкам или к двум датам.

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

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

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

Если операции сравнения можно было выполнять (в основном) над числами, строками и датами, то булевы операции выполняются только со значениями типа Булево. То есть со значениями Истина и Ложь.

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

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

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

Рис. 3.81. Литерал значения «Истина»

А если в другой переменной вы хотите уточнить, есть на улице дождь или нет, вы можете написать так (рис. 3.82). Попробуйте и посмотрите, чему равны переменные.

Рис. 3.82. Литерал значения «Ложь»

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

Чтобы познакомиться с первой булевой операцией, создайте две переменные: ЯУмеюПлавать и РядомЕстьМоре. Задайте им те значения, которые есть на самом деле. А в книге, для примера, я присвою им значение Истина (рис. 3.83).



Рис. 3.83. Переменные «ЯУмеюПлавать» и «РядомЕстьМоре»

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

Сначала попробуйте сказать это обычными словами. Наверное, получится что-то вроде «если я умею плавать и если рядом есть море, то тогда я буду плавать в море».

А теперь посмотрите (рис. 3.84), как эта же фраза выглядит на встроенном языке.

Рис. 3.84. Операция «И»

Чтобы сказать то же самое на встроенном языке, используется операция И. Как она работает, вы можете проверить сами на этом примере, изменив значения переменных.

Плавать в море вы будете только в том случае, когда оно есть рядом и вы умеете плавать. Если моря рядом нет, то плавать просто негде. А если вы не умеете плавать, то у вас тоже ничего не получится. Это очень опасно, вы можете утонуть. Ну, а если и моря нет, и плавать вы не умеете, то тем более поплавать в море вам не удастся.

Теперь решите другую задачу. Создайте две переменные УМеняЕстьЛодка и УМеняЕстьПлот. Можете задать им любые значения. А в книге, для примера, я присвою им значение Истина (рис. 3.85).

Рис. 3.85. Переменные «УМеняЕстьЛодка» и «УМеняЕстьПлот»

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

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

А теперь посмотрите (рис. 3.86), как эта же фраза выглядит на встроенном языке.

Рис. 3.86. Операция «ИЛИ»

Чтобы сказать то же самое на встроенном языке, используется операция ИЛИ. Как она работает, вы можете проверить сами на этом примере, изменив значения переменных.

Если у вас есть лодка, вы можете переплыть через озеро? Да.

А если у вас не лодка, а плот – тогда сможете? Да, сможете.

А если у вас есть и лодка, и плот? Конечно! Даже два раза! Один раз на лодке, а другой – на плоту (шутка)!

А в каком случае вам не удастся переплыть через озеро? Правильно. Когда у вас нет ни лодки, ни плота.

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

Создайте три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьБассейн. Задайте им те значения, которые есть на самом деле. А в книге я снова не буду усложнять и присвою им значение Истина (рис. 3.87).

Рис. 3.87. Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и «РядомЕстьБассейн»

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

Если вы будете отвечать словами, то скажете: «Я буду плавать, если я умею плавать и рядом есть море или бассейн». Попробуйте записать это на встроенном языке (рис. 3.88).

Рис. 3.88. Переменная «ЯБудуПлавать»

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

Например, вы не умеете плавать. В этом случае не важно, есть рядом бассейн или нет: плавать вы не должны. Но что говорит вам программа? Попробуйте (рис. 3.89).

Рис. 3.89. «ЯБудуПлавать = Истина»

Программа говорит вам, что плавать вы будете. Получается какое-то «опасное» программирование. С таким программированием и утонуть недолго!

В чем же дело? Может быть, вы написали неправильные операции? Нет, правильные.

Просто вы не учли, что если несколько булевых операций встречаются в одном выражении, у них есть определенный порядок выполнения. Точно так же, как было с арифметическими операциями +, -, * и /.

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

Поэтому в примере выражение было посчитано таким образом (рис. 3.90).

Рис. 3.90. Порядок вычисления выражения

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

На самом же деле для вас в этом выражении важны две вещи. Что вы умеете плавать и что есть, где плавать. А море это или бассейн – не так важно.

Поэтому правильным решением будет РядомЕстьМоре ИЛИ РядомЕстьБассейн заключить в скобки (рис. 3.91). Попробуйте.

Рис. 3.91. «ЯБудуПлавать = Ложь»

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

Рис. 3.92. Порядок вычисления выражения

Чтобы закрепить этот пример, немного измените его условие. Создайте три переменные: ЯУмеюПлавать, РядомЕстьМоре и РядомЕстьВанна. Задайте им те значения, которые были в последнем примере: Ложь, Истина и Истина (рис. 3.93).

Рис. 3.93. Переменные «ЯУмеюПлавать», «РядомЕстьМоре» и «РядомЕстьВанна»

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

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

Рис. 3.94. «ЯБудуКупаться = Истина»

Запустите «1С:Предприятие» в режиме отладки и посмотрите, какой получается результат, если изменить значения переменных.

Почему в этом случае скобки не понадобились, хотя пример внешне очень похож на предыдущий? Скобки не понадобились потому, что «естественный» порядок выполнения логических операций в этом выражении вполне вас устраивает (рис. 3.95).

Рис. 3.95. Порядок вычисления выражения

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

Поэтому совершенно правильно, что сначала выполняется операция И и выясняется, можете ли вы купаться в море. А затем уже проверяется наличие ванны, для использования которой способность плавать не требуется.

В заключение нужно сказать еще об одной булевой операции – операции НЕ. Она очень простая. Она возвращает булево значение, противоположное тому, которое имеется.

Чтобы посмотреть, как она работает, вы можете использовать пример, показанный на рисунке 3.96.

Рис. 3.96. Операция «НЕ»

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

  • сначала выполняется то, что в скобках;
  • затем операция НЕ;
  • затем операция И;
  • затем операция ИЛИ.

Инструкция «Если»

Наконец настало время познакомиться с еще одной инструкцией, которая используется во встроенном языке.

Если бы вы использовали только инструкцию присваивания, то ваша программа выглядела бы как прямая дорога из пункта «А» в пункт «Б». От начала к завершению (рис. 3.97).

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

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

Рис. 3.98. Много путей из пункта «А» в пункт «Б»

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

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

Именно для того, чтобы направить исполнение программы по одному или по другому пути, существует инструкция Если. Выглядит она очень просто (рис. 3.99).

Рис. 3.99. Инструкция «Если»

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

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

Чтобы посмотреть, как это работает, сделайте небольшой пример. Создайте переменную и запишите в нее свой возраст. А затем создайте другую переменную, ЯИдуВДетскийСад, и присвойте ей значение Истина. Но эту переменную создайте только в том случае, если вы еще не достигли школьного возраста. Чтобы не запутаться, будем считать, что школьный возраст начинается с 7 лет.

Когда вы сделаете свой пример, сравните его с тем, что на рисунке 3.100.

Рис. 3.100. Пример

Установите точку останова на строке Если …, запустите «1С:Предприятие» в режиме отладки и посмотрите значение выражения МойВозраст < 7 (Shift + F9) (рис. 3.101).

Рис. 3.101. Значение выражения «МойВозраст < 7»

Вы увидите, что оно равно Ложь. И это правильно. Ваш возраст больше, чем 7 лет.

Раз выражение ложно, значит, платформа должна пропустить все инструкции, которые написаны внутри инструкции Если. Проверьте это с помощью пошагового исполнения (F11). Сделайте один шаг (рис. 3.102).

Рис. 3.102. Один шаг исполнения

Действительно, платформа перейдет на строку КонецЕсли. А если вы шагнете еще раз, то она остановится на строке КонецПроцедуры. При этом значение переменной ЯИдуВДетскийСад будет Неопределено, потому что эта инструкция не выполнялась и такая переменная даже не создавалась.

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

Чтобы это сделать, вам потребуется сначала перезапустить отладку. Для этого выполните команду Отладка – Перезапустить (рис. 3.103).

Рис. 3.103. Перезапустить отладку

После того как отладка перезапустится, исполнение снова остановится на строке Если… Откройте локальные переменные (если это окно у вас закрыто).

Дважды щелкните мышью по ячейке со значением 25 (рис. 3.104).

Рис. 3.104. Изменение значения переменной

Она перейдет в режим редактирования. Введите 6 и нажмите Enter.

С этого момента значение переменной МойВозраст будет равно 6. А вы можете продолжать отладку так же, как и раньше.

Посмотрите значение выражения МойВозраст < 7. Теперь оно будет равно Истина (рис. 3.105).

Рис. 3.105. Значение выражения «МойВозраст < 7»

Сделайте один шаг. Исполнение зайдет «внутрь» инструкции Если (рис. 3.106).

Рис. 3.106. Один шаг исполнения

Теперь, если вы сделаете еще пару шагов, вы дойдете до конца процедуры. А значение переменной ЯИдуВДетскийСад будет равно Истина.

До сих пор вы рассматривали самую простую форму инструкции Если. На самом деле она может быть более сложной. Смотрите.

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

Оказывается, очень просто. Для этого используется ключевое слово Иначе (рис. 3.107).

Рис. 3.107. Ключевое слово «Иначе»

Доработайте пример так, чтобы в результате его работы у вас создавались две переменные: ЯИдуВДетскийСад и ЯИдуВШколу. И чтобы они принимали правильные значения (Истина или Ложь) в зависимости от возраста, указанного в переменной МойВозраст.

Сравните свой результат с тем, что показано на рис. 3.108.

Рис. 3.108. Доработанный пример

Запустите «1С:Предприятие» в режиме отладки и проверьте по шагам правильность работы примера для разных значений возраста. Изменяйте возраст прямо в процессе отладки.

Очень часто в инструкции Если анализируется не одно, а несколько условий. Например, в одно прекрасное утро вы проснулись и вспомнили, что вам нужно идти учиться. Но вы не помните, куда именно: в детский сад, в школу или в институт.

Зато вам известны правила. До 7 лет нужно идти в детский сад. После детского сада нужно идти в школу. Учиться в школе заканчивают в 18 лет. А в 19 лет поступают в институт.

Чтобы записать этот алгоритм на встроенном языке, вам понадобится еще одно ключевое слово – ИначеЕсли (рис. 3.109).

Рис. 3.109. Ключевое слово «ИначеЕсли»

В вашем примере его нужно будет написать вместо ключевого слова Иначе. А затем написать условие, при котором вам нужно идти в школу.

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

Чтобы проверить свой результат, сравните его с рисунком 3.110.

Рис. 3.110. Пример «Я иду в институт»

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

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

В этом заключается особенность инструкции Если, о которой нужно помнить и которую нужно учитывать. Если вы откроете локальные переменные, то увидите, что после выполнения примера переменная ЯИдуВИнститут может оказаться не определена. Например, если ваш возраст равен 15 (рис. 3.111).

Рис. 3.111. Переменная «ЯИдуВИнститут» не определена

А если возраст равен 20, то не определены окажутся переменные ЯИдуВДетскийСад и ЯИдуВШколу (рис. 3.112).

Рис. 3.112. Не определены переменные «ЯИдуВДетскийСад» и «ЯИдуВШколу»

А ведь в «живой» программе вы наверняка будете создавать подобные переменные не просто так, а для того чтобы использовать их в дальнейшем. И если какой-то из этих переменных не окажется, ваша программа работать не сможет.

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

Есть гораздо более простое и удобное решение. Прямо перед инструкцией Если вы создаете все переменные, которые вам понадобятся. И присваиваете им некоторое стандартное значение – значение «по умолчанию». Например, Ложь.

Рис. 3.113. Другой вариант примера

Сделайте этот пример в своей конфигурации и посмотрите, как он работает.

При любых значениях возраста будут существовать все переменные. И они будут иметь правильные значения (рис. 3.114).

Рис. 3.114. Все переменные определены

Красивая программа

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

Вы, наверное, уже привыкли к тому, что платформа сама раскрашивает слова в вашей программе. И это удобно. Еще, может быть, вы обратили внимание на то, что платформа сама делает отступ, когда вы пишете инструкцию Если.

Если вы этого не заметили, то поставьте маленький эксперимент. В модуле напишите Если а = 2 Тогда. И нажмите клавишу Enter (рис. 3.115).

Рис. 3.115. Синтаксический отступ

Вы увидите, что на новой строке курсор встанет не под буквой Е, а с некоторым сдвигом вправо. Этот сдвиг называется синтаксический отступ. Он помогает вам лучше и легче читать текст программы. Потому что «подчиненные» инструкции, расположенные внутри одной ветки, оказываются выделены визуально (рис. 3.116).

Рис. 3.116. Есть синтаксический отступ

Посмотрите, какая «каша» получилась бы, если бы синтаксического отступа не было (рис. 3.117).

Рис. 3.117. Нет синтаксического отступа

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

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

Рис. 3.118. Текст с нарушенным форматированием

Как с ним быть? Двигать каждую строку вручную, чтобы было «красиво»? Это скучно, долго и неинтересно.

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

Для этого нажмите правой кнопкой мыши на пустом месте справа в верхней командной панели (рис. 3.119).

Рис. 3.119. Настройка панелей конфигуратора

В появившемся меню щелкните по строке Текст. В нижней части окна появится новая командная панель (рис. 3.120).

Рис. 3.120. Командная панель «Текст» и команда «Форматировать»

В этой панели находится команда Форматировать, которая вам и нужна.

Пользоваться этой командой очень просто. Сначала вы выделяете текст, который нужно отформатировать. Для этого, например, нажимаете мышью на серой полосе в первой строке текста (рис. 3.121).

Рис. 3.121. Начало выделения текста

Затем, не отпуская кнопку мыши, ведете ее до последней строки, которая вам нужна (рис. 3.122).

Рис. 3.122. Выделен текст, который нужно форматировать

И нажимаете кнопку Форматировать. Текст сразу становится красивым и отформатированным (рис. 3.123).

Рис. 3.123. Отформатированный текст

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

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

Рис. 3.124. Использование пустых строк

Другой хороший и очень часто используемый прием – создание комментариев. Комментарий – это пояснение к программе, которое находится прямо в тексте программы (рис. 3.125).

Рис. 3.125. Комментарий