Як збудувати геодезичний купол?
Я простий програміст, але іноді свербить побути архітектором. Всякий ентерпрайз проектувати ще не пускають, але тут випала нагода зпроектувати проект іграшкової хатинки для донечки. Тому що після покупки меблів в порожню квартиру в нас все ще залишається вільна кімната і в ній куууупа картону.
Я погуглив які можна робити хатинки і знайшов таке на instructables. Але там виміри подані все ще в імперській системі і я вирішив перерахувати. І взагалі зробити проект правильною водоспадною методологією – поетапно.
3d модель
Перший етап – змоделювати все на комп’ютері.
- Запускаємо Blender, вибираємо куб який там за замовчуванням, натискаємо Delete.
- Shift+A (додати об’єкт) -> Icosphere, Subdivision: 2, Size: 1.0 location: (0.0, 0.0, 0.0).
- Переключаємось на вид з переду, тиснемо Tab і переходимо в Edit mode.
- Тиснемо правою кнопкою на якусь вершину аби вибрати лише її. Тиснемо b, аби вибрати вершини рамкою, і вибираємо ті що нижче 0 по осі Z.
- Натискаємо Delete і видалаємо половину вершин знизу.
Має вийти щось таке:
Це можна експортувати в розгортку для паперової моделі, якщо зробити наступне:
- Зайти в меню File -> User preferences, вкладка Add-ons, категорія Import-Export.
- Поставити галочку біля Export Paper Model, і натиснути “Save User Settings”.
- File -> Export -> Paper Model експортує модель в файл pdf (хоча пише що svg).
Отримаємо таке:
Для деяких розрахунків більшої моделі ще корисно експортувати в .obj файл.
Паперова модель
В паперовій моделі головне акуратно вирізати розгортку по чорних суцільних лініях, зігнути по пунктирних і склеїти сіренькі краї.
Паперова модель дає краще уявлення про те скільки трикутників доведеться вирізати, але як різати картон все ще не ясно. Якщо я хочу купол радіусом 1 метр, то якого розміру мають бути трикутники?
Вони здаються правильними, але насправді лише здаються, тому що з правильних трикутників вийде хіба що площина або дельтаедр. Щоб обчислити розміри трикутників, можна використати obj файл.
Розміри
Наступний скрипт якщо йому згодувати наш obj файл зробить дві речі:
import sys import math from collections import Counter # Distance between two vectors (iterables) rounded to 3 digits after comma def distance(A, B): return round(math.sqrt(sum((a - b)**2 for a, b in zip(A,B))), 3) def obj_fline_to_edges(line, vertices): # get indexes of vertices face = [int(e.split('/')[0]) - 1 for e in line[2:].split(' ')] # compute edge length's edges = sorted([ distance(vertices[face[0]], vertices[face[1]]), distance(vertices[face[2]], vertices[face[1]]), distance(vertices[face[2]], vertices[face[0]]), ]) return tuple(edges) def main(filename): vertices = [] faces = [] face_lines = [] with open(filename) as f: for line in f: if line.startswith('v '): # add line to list of vertices coords = [float(e) for e in line[2:].split(' ')] vertices.append(coords) if line.startswith('f '): # it's a face face_lines.append(line.strip()) edges = obj_fline_to_edges(line, vertices) faces.append(edges) stats = Counter(faces).most_common() for i, (edges, count) in enumerate(stats, 1): print(f'{i}) {edges} - {count}') materials = [ 'redMtl', 'blueMtl', ] for i, (edges_type, count) in enumerate(stats): print("usemtl", materials[i]) for line in face_lines: edges = obj_fline_to_edges(line, vertices) if edges == edges_type: print(line) if __name__ == "__main__": main(sys.argv[1])
Напише статистику по трикутнихах, і скаже що в нас їх є два види, 30 рівнобедрених і 10 рівносторонніх. Розміри в міліметрах, якщо купол метровий:
1) (0.547, 0.547, 0.618) – 30
2) (0.618, 0.618, 0.618) – 10
А крім того, додасть матеріали, які в позначать в моделі трикутники різного типу різними кольорами. Кожен рядок що починається на f, в об’єктному файлі треба замінити на той який виводиться нашим скриптом. (Разом з usemtl
, вони позначають кольори). В файл *.mtl
який Blender експортує поряд з об’єктним, треба додати наприклад такі матеріали:
newmtl redMtl Ns 18 Ka 0.000000 0.000000 0.000000 Kd 1.0 0.5 0.5 Ks 0.8 0.8 0.8 d 1 illum 2 newmtl blueMtl Ns 1 Ka 0.000000 0.000000 0.000000 Kd 0.5 0.5 1.0 Ks 0.8 0.8 0.8 d 1 illum 2
Kd означає колір дифузного відбиття за Фонгом.
Тепер, якщо ми експортуємо те що відредагували в текстовому редакторі назад в Blender – отримаємо таке:
Бачимо що рівнобедрені трикутники треба з’єднати по 5 штук коротшими сторонами в п’ятикутні піраміди, тоді до країв піраміди причепити ще 5 рівносторонніх трикутників, тоді поміж кожні два трикутники вліпити ще по 5 п’ятикутних пірамід і між ними вліпити решту рівносторонніх трикутників. Або іншим способом. Якщо тепер експортувати розгортку, і при експорті вибрати в налаштуваннях документа “Textures: From materials”, то розгортка теж буде кольоровою:
Картонна модель
Тепер, головне аби картону вистачило. Виявилось що вирізати трикутник зі стороною майже 62 см я не можу, бо той картон що я маю вужчий. (Насправді головне висота, але я хотів вмістити більше трикутників, тому вирішив що довша сторона буде 38 см, помножив всі розміри на 380/618, і загалом вийшло таке:
1) (0.336, 0.336, 0.380) – 30
2) (0.380, 0.380, 0.380) – 10
І добре, бо діаметр оригінального купола – 2 метри, того що в мене 1.23м, і він набагато краще вміщується в кімнаті. Для того щоб під купол було легше заходити, я зробив лише 9 рівносторонніх трикутників, таким чином що один в основі відсутній, і поставив купол на стіну висотою 50 см з 9 прямокутних секцій шириною по 38 см. Загалом зі стіною висота в центрі складає 1.11м.
Найбільша технічна складність – як побудувати трикутник без велетенського циркуля. Але виявляється циркуль легко робиться за допомогою вимірювальної рулетки, смужки картону і викрутки. Пробиваємо в смужці викруткою дірку, тоді на відстанях які нам потрібно ще дірки. Фіксуємо центр кола викруткою, і вставляючи ручку в дірку на потрібній відстані малюємо коло потрібного радіусу.
Краї для склеювання клеєм я вирішив не креслити аби зекономити картон і поклався на скотч.
Далі можна не морочитись і використати перші трикутники як шаблони для креслення решти. Далі процес тривіальний.
Враховуючи те що трикутники я вирізав криво, вони прилягають не щільно і в хатинку потрапляє світло через те що скотч прозорий.
Чи сподобалась дитині хатинка? Ніби так, вона туди пару раз лазила грати “ку-ку”, але здається не настільки як мені. 🙂
Тому що нові іграшки – то тимчасове задоволення, а вміння робити 3d штуки без 3d принтера – то назавжди. 😉
Тарас, ти молодець! Таке креативне рішення! Дуже круто! У нас також багато картону залишилось після ремонту, це чудова ідея його так використати! Супер!
anastasiia09
22 Грудня, 2019 at 22:03
Ну якщо є діти. 🙂 Хоча може можна щось інше зліпити. Я от думаю де б то якусь низькополігональну модель санта-клауса знайти. 😀
bunyk
24 Грудня, 2019 at 19:05
І ще ця хатинка дуже схожа на футуристичну космічну базу на місяці, ось наприклад:
https://stock.adobe.com/images/concept-of-a-futuristic-3d-illustration-of-a-base-in-the-moon/243096576
anastasiia09
22 Грудня, 2019 at 22:05
Думаю це пов’язано з тим що такий купол апроксимує сферу з плоских деталей, і тому вміщає найбільший об’єм при найменшій площі поверхні і витраті матеріалу. Що дуже вигідно для іншопланетних приміщень. Маленька площа поверхні також означає маленькі втрати тепла при такій самій теплоізоляції.
На землі будинки такої форми будувати не вигідно, бо більшість матеріалів прямокутні і відповідно буде багато відходів. Крім того земні меблі заточені під прямокутні кімнати.
bunyk
24 Грудня, 2019 at 19:34