Давайте начнем импортировать обычные пакеты и Bmesh. Мы будем использовать его для исправления нормалей в конце. Также верните старый добрый и из предыдущей
Ссылка http://sinestesia.co/blog/tutorials/python-tubes-cilinders/
Серия учебников
- Часть 1: 2D Сетка
- Часть 2: кубики и матрицы
- Часть 3: икосферы
- Часть 4: закругленный куб
- Часть 5: Трубы и цилиндры
Настроить
Давайте начнем импортировать обычные пакеты и Bmesh. Мы будем использовать его для исправления нормалей в конце. Также верните старый добрый и из предыдущей части
object_from_data()
set_smooth()
Первый шаг к созданию цилиндра - это создание 2D круга.
Делая круг
Во-первых, нам нужно поместить вершины в круг вокруг точки. Мы рассчитаем угол, под которым находится каждая вершина. Этот угол на самом деле является полярной координатой, поэтому, чтобы получить координаты X, Y, которые мы можем использовать, мы также конвертируем ее в декартову. Вы можете прочитать больше о математике на mathisfun.com и в Википедии. Конечно, мы передаем значение Z, поэтому нам не нужно его вычислять. Для начального круга Z будет ноль.
Мы можем использовать это сразу, чтобы сделать круг, но это будет только круг вершин. Давайте также добавим ребра тоже. Добавить ребра к кругу довольно просто. Просто обведите каждую вершину и соедините текущий индекс со следующим, затем добавьте последнее ребро, которое соединяет последний индекс с первым (ноль). Следуя урокам части 4, давайте создадим функцию для создания кругов.
Это не так уж много, но это хороший первый шаг.
Вы можете увидеть некоторые сообщения с жалобами на то, что нормали равны нулю. Это потому, что нет лиц для вычисления нормалей. Мы вернемся и добавим способ заполнить этот круг позже, повторно используя код, который добавляет заглушки в цилиндр
validate()
Круги все время вверх
Что такое цилиндр, если не круг, выдавленный в трехмерном пространстве? Чтобы выдавить окружность по оси Z, мы можем выполнить цикл, задав ему растущие значения Z.
vertex_circle()
Время
make_cylinder()
Notice возвращает список вершин, поэтому нам нужно использовать расширение вместо добавления, чтобы сохранить ту же структуру списка. Кроме того, мы не добавляем ребра здесь. Мы добавим эту сетку к фактическим граням, чтобы не было необходимости в ребрах. Создание граней следует логике из сеток в части 1. За исключением этого времени, оно идет по кругу.
vertex_circle()
Как и в таблицах, лучший способ понять это - включить отладку и проверку индексов вершин. В конце концов, эта функция должна только возвращать правильные числа. Чтобы сделать все грани поперек всех колец и рядов, нам нужно пройти через оба цикла.
Вы можете заметить, что нам не хватает последнего лица в каждом ринге. Последнее лицо - особый случай, потому что индексы «перематываются».
Нам нужно добавить специальный случай для этого последнего лица с другой формулой. С одной стороны нам нужно захватить вершины в конце обоих колец, с другой стороны нам нужно захватить начальные вершины. Это похоже на последний край в круге.
Теперь у нас есть один красивый цилиндр.
Мы просто пропускаем заглавные буквы, чтобы закончить петлю.
Укупорка цилиндра
Есть два способа закрыть этот цилиндр:
- Ngons. Все вершины в кольце соединены как одно лицо.
- Треугольный веер. Серия треугольников, соединяющихся с центральной вершиной.
Чтобы сделать треугольник веером, нам нужно поместить вершину в середине кольца, а затем зациклить кольцо, соединяя вершины с ним. С другой стороны, чтобы создать только Ngon, мы просто перебираем индексы вершин и помещаем их все в один кортеж. Это яснее увидеть в нижней части кода.
В случае с веером треугольников нам также нужно заполнить последнее лицо отдельно. Код для аналогичен, но мы должны сместить количество индексов, чтобы получить индексы в верхней строке.
top_cap()
Теперь мы можем вызвать их в функции цилиндра. Поскольку мы уже передали тип cap, мы можем сделать его параметром и позволить вызывающей стороне пройти, чтобы отключить caps.
make_cylinder()
None
Заполнение круга
Цилиндр - это вытянутый круг, помните? Поэтому нижнее кольцо такое же, как у первого круга, который мы сделали, и теперь мы можем использовать функцию для его заполнения. Обратите внимание, что если мы делаем грани для круга, нам не нужно устанавливать ребра.
bottom_cap()
Сгладить
Теперь, когда мы завершили меш, давайте его отполируем. Мы можем добавить вызов, чтобы включить его плавное затенение для него. Мы также можем добавить некоторые модификаторы, как мы делали в прошлой части. Мы добавим немного скоса и раскол края, чтобы исправить затенение. Мы хотим добавить модификатор скоса, только если у нас есть заглавные буквы.
set_smooth()
Если вы попробуете это, вы обнаружите, что что-то не так с нижней крышкой. Модификатор скоса делает его действительно странным и помятым. Это обычно признак испорченных нормалей. Перейдите в режим редактирования и включите нормали с панели дисплея .
Как видите, нормали нижней крышки направлены вверх, тогда как на самом деле они должны быть направлены вниз. Мы должны исправить это, чтобы получить хороший скос. Вы можете сделать это, перейдя в режим редактирования и нажав . Но есть и способ в коде.
CTRL+N
Исправление норм
Для исправления нормалей мы будем использовать один из операторов bmesh. Они отличаются от обычных операторов Блендера, поскольку они не зависят от контекста. Они будут работать до тех пор, пока вы дадите им действительный объект bmesh.
Bmesh - это специальный Blender API, который дает вам очень тесный доступ к внутреннему API редактирования сетки . Это довольно быстро, чем другие методы и более гибко. Однако, когда дело доходит до создания сеток с нуля, Bmesh не предлагает ничего слишком отличного от других способов. Вот почему эта серия не касалась Bmesh до этого момента. Чтобы использовать bmesh, мы сначала создаем объект bmesh, затем заполняем его данными (в данном случае используя ). Как только мы закончим с этим, мы записываем новые данные в меш и освобождаем объект bmesh из памяти.
from_mesh()
Я не буду слишком углубляться в Bmesh сейчас, так как это займет целый отдельный урок. Вы можете прочитать больше о Bmesh в документации . А пока давайте создадим функцию, которая берет сетку и исправляет ее нормали.
Добавление вызова к этой функции приводит к финальному, удивительно выглядящему цилиндру.
make_cylinder()
Окончательный код
Заворачивать
Вот и все для этого урока и всей серии! Я надеюсь, что эти учебники были полезны для вас, или, по крайней мере, выучили новый трюк или два. Мы говорили о создании 2D сеток, кубов, икосфер, кругов и цилиндров. Мы также занялись отладкой, управлением сложностью, настройкой плавного затенения, добавлением и применением модификаторов, пересчетом нормалей и чтением данных из файлов. Это довольно много, но это только начало. В Blender есть много других возможностей для изучения и изучения!
Что вы можете сделать для себя:
- Используйте Bmesh вместо того, чтобы строить меш
from_pydata()
- Сделайте новый, который делает спирали вместо кругов
vertex_circle()
- Реорганизуйте функции шапки в одну, которая может сделать обе шапочки, одну или ни одной.
Есть вопросы или предложения по новым учебникам? Оставьте комментарий ниже!
Комментариев нет:
Отправить комментарий