В дальнейшем будем использовать следующие элементарные блоки:
- Шар
- Полупространство
- Цилиндр
- Тор
- Конус
Шар
С шаром мы уже встречались в предыдущей главе.Шар можно описать четырьмя числами: трехмерные координаты центра и радиус.
Будем записывать
Шар([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.)
На рисунке, изображены цветные шары, но для простоты в наших формулах информацию о цвете в дальнейшем будем опускать.
Полупространство
Полупространство очень важный элемент при конструировании твердых тел. Полупространство задается бесконечной плоскостью, нормаль которой указывает на пустую половину пространства. Одна половина пространства заполнена материалом, вторая половина - девственно пуста. Таким образом, полупространство задается трехмерной точкой и тремя координатами нормали:
Полупространство(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.)
Формулы разные, но результат один и тот же.
Можно легко видеть, что один и тот же объект можно получить разными способами. В таких случаях говорят, что построение неоднозначно.
Комбинируя несколько полупространств можно получить кубик или другой многогранник. Например, взяв пересечение шести полупространств, получаем куб:
Куб = Полупространство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.])
Цилиндр
Следующий строительный кирпичик - это цилиндр
Цилиндр можно задать направлением оси, точкой в пространстве и радиусом:
Цилиндр(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))
Цилиндр, ограниченный двумя полупространствами.
Тор
Тор или бублик. С этим объектом мы встречаемся на каждом шагу. Тор определяется своим центром, осью вращения и двумя радиусами: большим и малым
Тор(Point(0,0,0), Axe(0,0,1), 3, 1)
Если мы захотим создать модель велосипеда, то колесо будем моделировать при помощи тора.
Конус
Конус, можно задать координатами вершины, осью вращения и углом между осью и стороной конуса:
Конус(Point(0,0,0), Axe(0,0,1), Угол)
Как и полупространство и цилиндр, этот элемент неограничен. Как и прежде, чтобы получить понятную картинку пересечем конус со сферой с центром в вершине конуса. Получится немного непривычный конус со сферическим основанием:
Конус со сферическим донышком = Конус([0,0,0], [0,0,1], 15) AND Шар([0,0,0], 1)
В качестве элементарных кубиков можно брать любые тела, например, куб или параллелепипед могут служить примером элементарного объекта для построения твердотельных сцен. В нашей статье мы ограничимся только вышеперечисленным набором. Этого достаточно для понимания принципов и получения большого набора красивых примеров.
Примеры моделей
Приведу несколько моделей, собранных из этого набора кирпичиков.
Первая модель - раковина. Раковина представляет собой простое объединение сфер. Центры увеличивающихся в размере сфер располагаются на логарифмической спирали. При этом, сама спираль еще вытянута по высоте.
Вся модель состоит из 65 шаров. 64 объединены, а последний 65ый вычтен, и моделирует вход в раковину.
Настоящая, живая раковина формируется и растет по аналогичным законам. Несмотря на простоту модели форма завораживает. Идея построения раковины настолько стара, что уже не помню откуда появилась.
Следующая модель - Болт, демонстрирует использование всех элементарных кирпичиков.
Ножка болта состоит из двух цилиндров. Переход от одного цилиндра к другому сглажен тором (тор вычтен, в результате получается гладкий переход от одного радиуса к другому). Еще один цилиндр используется для моделирования отверстия.
Шестигранная головка образована восьмью полупространствами. И, наконец, торцы болта "подрезаны" конусами. Слово "подрезаны" можно использовать без кавычек. В твердотельном моделировании это соответствует операции вычитания или отрезания.
Все изображения кликабельны. Ссылки ведут на страничку с возможностью интерактивного просмотра моделей. Для просмотра достаточно браузера, поддерживающего технологию canvas 2D
В следующей части статьи поговорим об особенностях твердотельного моделирования, о его достоинствах и недостатках.