Версия для печати
Пятница, 04 Март 2011 19:48

CSG - твердотельное моделирование 2

Автор Александр Бушмелев
Оцените материал
(0 голосов)

Строительные "кубики" - элементарные тела

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

 

 

В дальнейшем будем использовать следующие элементарные блоки:

  • Шар
  • Полупространство
  • Цилиндр
  • Тор
  • Конус

Шар

С шаром мы уже встречались в предыдущей главе.
Шар можно описать четырьмя числами: трехмерные координаты центра и радиус.
Будем записывать
Шар([x, y, z], rad) - это шар радиуса rad и с координатами центра (x, y, z)
В случае шара радиуса 1. и с центром в начале координат будем иметь:
Шар([0., 0., 0.], 1.)

Объединение шаров на рисунке 1 примет вид:
Молекула = Шар([-0.6, 0., 0.], 1.) OR Шар([0., 0.6, 0.], 1.)

BallORBall

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

Полупространство

Полупространство очень важный элемент при конструировании твердых тел. Полупространство задается бесконечной плоскостью, нормаль которой указывает на пустую половину пространства. Одна половина пространства заполнена материалом, вторая половина - девственно пуста. Таким образом, полупространство задается трехмерной точкой и тремя координатами нормали:
Полупространство(Point(x,y,z), Normal(nx, ny, nz))
Полупространство - это строительный элемент с неограниченными размерами, поэтому его трудно изобразить. Тем не менее, это необходимый элемент в твердотельном моделировании. Например, полупространством можно строить всевозможные сечения тел. Так, возвращаясь к рисунку 5 имеем следующее построение:
Половинка дырки от шара = (NOT Шар([0., 0., 0.], 1.)) AND Полупространство([0., 0., 0.], [0., 0., 1.])
то есть, сначала мы получили шарообразную дырку в заполненном пространстве, а затем построили пересечение с полупространством, плоскость которого проходит через центр шара.
Можно было бы не пересекать с полупространством а вычесть из дырки полупространство, тогда мы получили бы вторую половинку дырки.
Вторая половинка дырки от шара = (NOT Шар([0., 0., 0.], 1.)) SUB Полупространство([0., 0., 0.], [0., 0., 1])
Более простым способом можно получить половинку от дырки, если вычесть из полупространства шар
Половинка дырки от шара = Полупространство([0., 0., 0.], [0., 0., 1.]) SUB Шар([0., 0., 0.,] 1.)
Формулы разные, но результат один и тот же.

NotBall

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

Комбинируя несколько полупространств можно получить кубик или другой многогранник. Например, взяв пересечение шести полупространств, получаем куб:
Куб = Полупространство1([0., 0.,-1.], [0., 0., -1.]) AND
Полупространство2([0., 0.,1.], [0., 0., 1.]) AND
Полупространство3([-1., 0.,0]., [-1., 0., 0].) AND
Полупространство4([1., 0.,0.], [1., 0., 0.]) AND
Полупространство5([0.,1.,0.], [0., 1., 0.]) AND
Полупространство6([0.,-1.,0.], [0.,-1., 0.])
Cube

Цилиндр

Следующий строительный кирпичик - это цилиндр
Цилиндр можно задать направлением оси, точкой в пространстве и радиусом:
Цилиндр(Point(x,y,z), Axe(ax, ay, az), rad)
Безусловно, речь идет о бесконечном цилиндре. Если мы хотим получить обычный, цилиндр, то необходимо ограничить его полупространствами, например при помощи пересечения или вычитания:
Обычный цилиндр = (Цилиндр(Point(0,0,0), Axe(0,0,1), 1) AND Полупространство(Point(0,0,-1), Normal(0, 0, -1))) AND Полупространство(Point(0,0,1), Normal(0, 0, 1))
Обычный цилиндр = (Цилиндр(Point(0,0,0), Axe(0,0,1), 1) SUB Полупространство(Point(0,0,-1), Normal(0, 0, 1))) SUB Полупространство(Point(0,0,1), Normal(0, 0, -1))

Cylinder
Цилиндр, ограниченный двумя полупространствами.

Тор

Тор или бублик. С этим объектом мы встречаемся на каждом шагу. Тор определяется своим центром, осью вращения и двумя радиусами: большим и малым
Тор(Point(0,0,0), Axe(0,0,1), 3, 1)

Torus
Если мы захотим создать модель велосипеда, то колесо будем моделировать при помощи тора.

Конус

Конус, можно задать координатами вершины, осью вращения и углом между осью и стороной конуса:
Конус(Point(0,0,0), Axe(0,0,1), Угол)
Как и полупространство и цилиндр, этот элемент неограничен. Как и прежде, чтобы получить понятную картинку пересечем конус со сферой с центром в вершине конуса. Получится немного непривычный конус со сферическим основанием:

Конус со сферическим донышком = Конус([0,0,0], [0,0,1], 15) AND Шар([0,0,0], 1)

Cone

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

Примеры моделей

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

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

Следующая модель - Болт, демонстрирует использование всех элементарных кирпичиков.
bolt1 bolt2

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

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

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

Прочитано 6974 раз Последнее изменение Пятница, 04 Март 2011 20:47
Авторизуйтесь, чтобы получить возможность оставлять комментарии