Archive

Posts Tagged ‘komputacja’

Projektowanie komputacyjne

February 1st, 2010 9 comments

23 października w ramach Szczecińskiego Westivalu, wygłosiliśmy razem z Michałem Piaseckim wykład pod tytułem ‘projektowanie komputacyjne’. Przy okazji publikacji tekstu wykładu w materiałach organizatorów Westivalu, postanowiliśmy także opublikować go online.

 

Projektowanie komputacyjne w architekturze  

 

Projektowanie komputacyjne to zagadnienie, które w ostatnim czasie szybko zyskuje na popularności. Obecnie dobrze zakorzenione w przemyśle samochodowym i lotniczym, powoli zaczyna wkraczać także jako narzędzie do świata architektury. Dlaczego? Ponieważ technologie projektowania wspomaganego komputerowo, oraz przede wszystkim fabrykacji stają się coraz bardziej dostępne i tańsze, a co za tym idzie, wzrasta dostępność produkcji niestandardowych elementów na masową skalę (tzw. ?mass customization?).

Jak pisał Adrian Beukers i Ed van Hinte w swoim eseju ?Lightness? (?Lekkość?), ?W naturze kształt jest tańszy niż materiał?, zwracając uwagę na to, że koszt wytworzenia formy może być dużo niższy, jeśli znajdziemy optymalne rozwiązania strukturalne lub topologiczne opisujące problem projektowy. Nie jest już dzisiaj niczym zaskakującym, że dokonując strukturalnej optymalizacji topologii połączeń w mega-konstrukcjach można zaoszczędzić do 50% materiału.

Projektowanie komputacyjne, poprzez użycie różnych technik takich jak algorytmy genetyczne i sztuczna inteligencja, razem z metodą elementów skończonych, lub innymi technikami optymizacyjnymi, może pomóc zdefiniować problem projektowy w zupełnie inny sposób i znaleźć nową, często zaskakującą odpowiedź. Czy jest to problem czysto geometryczny, tak jak panelizacja podwójnie zakrzywionych powierzchni, czy też strukturalny, jak minimalizacja stresów w przestrzennej kratownicy, z pomocą mogą przyjść programy lub skrypty pisane w różnych językach oraz narzędzia do modelowania parametrycznego, takie jak Generative Components oraz Rhino Grasshopper. Modelowanie parametryczne pozwala na definiowanie hierarchicznych zależności pomiędzy obiektami geometrycznymi zamiast statycznego układu brył w przestrzeni, do którego przyzwyczajone są osoby korzystające z bardziej standardowych narzędzi CAD. Modelowanie parametryczne, które pozwala na szybkie przeglądanie wersji potencjalnych rozwiązań, jest dzisiaj coraz powszechniej stosowane w projektowaniu stadionów, wieżowców, części fasad, dachów jak i niewielkich detali konstrukcyjnych.

Terminologia związana z projektowaniem komputacyjnym podlega ciągłej transformacji, ponieważ dziedzina jest nowa i wciąż szybko się rozwija. Dosyć szeroko przyjęte jest odróżnianie ?projektowania parametrycznego? od ?projektowania generatywnego?:

Projektowanie parametryczne to proces w którym wynikowa forma jest zazwyczaj jedną iteracją (przebiegiem) informacji geometrycznych przez ?drzewo? hierarchicznych zależności pomiędzy elementami. Po wykonaniu takiej iteracji, otrzymujemy parametryczny model, który jest topologicznie statyczny, możemy za to zmieniać jego geometrię (skalować, rozciągać, manipulować parametrami).

 wf_smithsonian_

Projektowanie generatywne to proces w którym forma jest generowana na podstawie wielokrotnych iteracji, zazwyczaj dodawania/odejmowania elementów, lub dzielenia ich na mniejsze pod-elementy. Za narzędzia używane w projektowaniu generatywnym można uznać algorytmy genetyczne, sieci neuronowe, oraz wszystkie algorytmy wykorzystujące procesy symulacji sztucznego życia, takie jak automaty komórkowe, systemy samo-organizujące się, systemy cząsteczek-agentów, oraz pomocniczo systemy bazujące na metodzie elementów skończonych (finite element analysis), takie jak dynamiczna relaksacja.

wzrost fototropicznyProjektowanie komputacyjne w praktyce architektonicznej

Jednymi z pierwszych spektakularnych projektów wykonanych z użyciem projektowania parametrycznego był Swiss Re (tzw. ?ogórek?) w Londynie, autorstwa biura Foster+Partners (2004), Centrum handlowe O2 w Birmingham (Future Systems 2003) oraz Kunsthaus w Graz w Austrii (Peter Cook + Colin Fournier 2003). Technikami projektowania parametrycznego posługuje się dzisiaj wiele znanych biur architektonicznych i inżynierskich, takich jak HOK Sport, Arup, Grimshaw+Partners, Zaha Hadid architects, Frank Gehry czy Aedas.

examples_
 
Również duża ilość projektów generatywnych doczekała się już realizacji. Przykładem może tu być szklane zadaszenie dziedzińca British Museum, gdzie użyto algorytmu dynamicznej relaksacji dla zoptymalizowania sił i wielkości paneli. Innym jest realizowne obecnie zadaszenie stacji metra w Neapolu projektu Rogers Stirk Harbour + Partners. W tym projekcie konstruktorzy – firma Expedition Engineering – postanowili wykorzystać algorytmy genetyczne, żeby zoptymalizować dystrybucję elementów strukturalnych zadaszenia ze względu na ilość światła dziennego penetrującą wnętrze stacji. Optymalizacja z użyciem ewolucji polega na hodowaniu kolejnych generacji potencjalnych rozwiązań w których osobniki stosunkowo dobrze spełniające zadane kryteria przekazują swoje cechy kolejnym. W tym przypadku optymalizowano na przestrzeni 70 generacji, każda po 400 osobników.

rogers_stirk_harbour_neapol_

Obszarem zastosowań algorytmów generatywnych jest również urbanistyka, ponieważ użycie zasad samo-organizacji może pomóc w odnalezieniu układów przestrzennych które są lepsze od tych zaprojektowanych tradycyjnymi metodami na przykład pod względem komunikacyjności lub dystrybucji ze względu na nasłonecznienie. ?Agentom?, które reprezentują bloki zabudowy, można na przykład zadać zadanie znalezienia pozycji i orientacji umożliwiającej najlepsze skorzystanie z dostępnych widoków, oraz dostępu do naturalnego światła. Poprzez lokalne negocjacje na niskim poziomie hierarchii, otrzymujemy globalne (całościowe) rozwiązanie uwzględniające interesy każdego z podmiotów symulacji.

Układ, którego globalny stan jest czymś więcej niż sumą lokalnych stanów wszystkich jego elementów nazywany jest układem emergentnym. Emergencja to zjawisko związane z wykorzystaniem prostych reguł działania na lokalnym poziomie (interakcji pomiędzy pojedycznymi agentami), do stworzenia ?kolektywnej? inteligencji na globalnym poziomie całego stanu układu.

Cyfrowe wspomaganie wytwarzania

Wszystkie powyżej opisane techniki zyskują coraz szersze zastosowanie w architekturze, ponieważ znacząco rozwijają się możliwości cyfrowego wspomagania wytwarzania, czyli tzw. cyfrowej fabrykacji. Projektowanie parametryczne i generatywne pozwala automatycznie dostosować elementy projektu do wybranej technologii fabrykacji. Takie ?dopasowanie? do fabrykacji, staje się poprostu jeszcze jednym kryterium optymalizacji. Najczęstszym przykładem jest tutaj np. podzielenie dowolnej przestrzennej, podwójnie zakrzywionej formy/powierzchni na elementy płaskie (np szklane panele), współdzielące ze sobą krawędzie (bez pomocy generatywnych procesów jest to bardzo trudne lub wręcz niemożliwe). Można też optymalizować obiekty tak, aby zużywały jak najmniej materiału. Technologie cyfrowego wspomagania wytwarzania dzielą się na addytywne, subtraktywne i formatywne.

Technologie addytywne polegeją na nakładaniu i łączeniu kolejnych warstw materiału. Popularna nazwa tych technik to ?druk 3d?. Dzisiaj można drukować na drukarkach proszkowych, nylonowych (drukujących plastikiem), lub nawet takich które układają na sobie warstwy metalu. Nowością (jeszcze niedostępną komercyjnie) jest olbrzymia drukarka budowana przez firmę D-Shape, która może drukować cementem w dużej skali (obszar roboczy to 3x3x3 m). Koszty druku 3d szybko maleją a produceni drukarek zapowiadają technologie, które spowodują, że druk 3d będzie niebawem tak popularny jak druk 2d – używający kartek i atramentu. Byłaby to prawdziwa rewolucja w projektowaniu produktu. W architekturze druk 3d jest na razie wykorzystywany do produkcji modeli.

3d_printing_

 

Technologie subtraktywne to te które polegają na odejmowaniu materiału. Przykładami jest frezowanie CNC i cięcie laserowe. Ograniczenia materiałowe są w tym przypadku niewielkie a skala wykonywanych elementów może sięgać kilkunastu metrów, stąd to te technologie są najczęściej wykorzystywane w architektonicznych realizacjach.

 cnc

 
Technologie formatywne to na przykład użycie robotów do układania elementów konstrukcji. Dobrym przykładem jest tutaj parametryczna ściana winnicy, projektu duetu Gramazio & Kohler, stworzona za pomocą robota firmy KUKA.

kuka
 
Projektowanie komputacyjne może ale nie musi wiązać się z estetyką dominującą obecnie wśród niektórych star-architektów. Jednym z najważniejszych aspektów omówionych technik jest optymalizacja, która zapewnia bardzo dobre wykorzystanie budżetu projektu oraz stworzenie przestrzeni funkcjonującej w odpowiedni sposób. Wzbogacenie polskich pracowni architektonicznych o narzędzia parametryczne i generatywne oraz wprowadzenie tej tematyki na uczelnie jest jednym z warunków, które polska architektura powinna spełnić by pozostać konkurencyjna na rynku międzynarodowym.

 

Przemysław Jaworski (Foster+Partners, SMG) www.projektowanieparametryczne.pl

Michał Piasecki (Bartlett, UCL) www.michalpiasecki.com

Wstęp do Processing

September 4th, 2009 38 comments

Fala zainteresowania tematyką algorytmicznego (komputacyjnego) designu nie wydaje się słabnąć, a jako że na polskiej ‘scenie’ designerskiej niewiele jest zasobów poświęconych temu zagadnieniu rozpoczynamy wątek wprowadzający w programowanie w  Processing – otwartej platformie do programowania dla designerów, architektów i grafików.

Po pierwsze – do czego może się Processing przydać w codziennej pracy designera ? Przede wszystkim do automatyzacji powtarzalnych zadań. To jednak brzmi mało zachęcająco, więc dodam, że można z powodzeniem używać Processing do definiowania najbardziej skomplikowanych form geometrycznych, takich jak np. powierzchnie dachów i fasad (z tym spotkałem się najczęściej). Tak naprawdę jednak, najwięcej korzyści przynosi użycie go do dynamicznego, i szybkiego wspomagania procesu projektowania, a szczególnie oceny poszczególnych pomysłów, i ewolucji rozwiązań. Tutaj nie chodzi już o to, żeby wygenerować jakąś formę, lecz bardziej o generowanie jej tyle razy, i w takich wariantach, żeby znaleźć jej nalepsze wcielenie (to podejście niektórzy nazywają ‘projektowaniem ewolucyjnym’, bądź ‘generatywnym’).

pulsing_cubes

przykładowy szkic z pulsującymi sześcianami

Po drugie – Processing daje dużą dozę interaktywności. Przede wszystkim w samym procesie projektowania, gdzie możemy oglądać generowaną formę/obiekt podczas jego ewolucji  i na nią wpływać poprzez np. klawiaturę albo myszkę. Możemy także w stosunkowo prosty sposób tworzyć proste instalacje multimedialne reagujące na widza lub otoczenie (ale to już osobny rozdział).

I wreszcie po trzecie – Processing jest na tyle prosty, że może w nim pracować każdy, kto miał trochę do czynienia z prostą matematyką lub logiką. Ma w sobie sporo stworzonych przez użytkowników bibliotek, które pozwalają na szybkie i łatwe zapisanie efektów pracy w plikach PDF, JPG lub np. DWG (przy eksportowaniu trójwymiarowych modeli). Poza tym styl pisania programów na tej platformie jest bardziej luźny, większość ludzi pisze ‘szkice’, czyli krótkie zlepki kodu generujące ciekawe efekty, zamiast pisać wielkie skomplikowane programy-giganty.

W skrócie, środowisko to nadaje się dla twórców, którzy nie chcą spędzać długich godzin szukając sposobu na narysowanie np. krzywych Beziera, tylko wolą poprostu usiąść i widzieć gotowy efekt w ciągu kilku chwil.

—————————————————————

Dobrą rzeczą jest też to, że wokół platformy Processingu stworzyła się dość duża społeczność, która wymienia się doświadczeniami, fragmentami kodu i pomysłami.

Najwięcej ciekawych przykładów z kodem źródłowym można znaleźć na http://www.openprocessing.org/ lub na oryginalnej stronie www.processing.org , powstało też kilka ciekawych książek. Można by śmiało rzec, że Processing jest jedną z najlepszych platform edukacyjnych do nauki programowania i projektowania komputatywnego z tych istniejących na dziś dzień w internecie.

Sam program jest do ściągnięcia tutaj na zasadach General Public License (czyli za darmo).

—————————————————————

Ok, przejdźmy zatem do środowiska :

processing_diagram

Po otwarciu programu ukazuje się nam okno, jak to powyżej. Zintegrowane środowisko programowania, w skrócie IDE (z ang. Integrated Development Environment) jest dość proste, i składa się z kilku przycisków, rozwijalnego menu, okna wprowadzania i edycji kodu, oraz okna komunikatów.

Przyciski (od lewe):

START – służy uruchamianiu kodu, można też zrobić to naciskając CTRL+R, lub wybierając opcję ‘Run’ z górnego menu ‘Sketch’. Powoduje to otwarcie osobnego okna, w którym wyświetla się graficzna manifestacja naszego programu.

STOP – zatrzymuje uruchomiony szkic, i zamyka jego osobne okno

NEW – tworzy nowy (pusty) szkic

OPEN – otwiera istniejący szkic zapisany na dysku

SAVE – zapisuje bieżący szkic

EXPORT – przydatna funkcja eksportująca nasz szkic jako stronę .html z appletem Javy, który uruchamia się po jej otwarciu. Oznacza to, że można bardzo prosto udostępnić DZIAŁAJĄCY szkic internetowej publice, do oglądania w zwykłej przeglądarce internetowej (!).  Dzieje się to oczywiście po zapisaniu tak wyeksportowanego szkicu na jakimś serwerze, lub dołączeniu go do istniejącej strony internetowej.

—————————————————————————-

Pierwszy kod

Standardowo, każdy szkic uruchamia się w oknie, które ma 100 na 100 pikseli. Aby to zmienić, należy na początku programu napisać :

size(500,500);

Co powoduje zwiększenie wymiaru okna do 500 na 500 pikseli, co możemy zobaczyć po naciśnięciu przycisku START.

Zmiany koloru tła dokonujemy za pomocą polecenia

background(255,255,255);

gdzie trzy liczby w nawiasie to kolejno wartość czerwieni, zielonego i niebieskiego (Red Green Blue), w zakresie 0-255, czyli 255,255,255 da nam kolor biały.

aby narysować koło piszemy

ellipse(250,250,200,200);

gdzie pierwsze dwie liczby to współrzędne X i Y środka, a dwie następne to średnica X i średnica Y (jako, że rysujemy tak naprawdę elipsę – ale podając dwie jednakowe liczby dostajemy koło).

Należy tutaj nadmienić, że w większości języków programowania współrzędne pikseli na ekranie liczy się od lewego górnego rogu (0,0) do prawego dolnego (szerokość, wysokość). Do zmiany i przesunięcia układu współrzędnych służą polecenia translate(), scale() i rotate(), ale o tym później.

Tak więc nasz program powinien wyglądać mniej więcej tak :

size(500,500);

background(255,255,255);

ellipse(250,250,200,200);

Po naciśnięciu START ukaże nam się taki obraz :

cwiczenie01

Nic szczególnego tak naprawdę, ale czego można się spodziewać po trzech liniach kodu :)

Aby dodać trochę złożoności naszemu prostemu szkicowi, musimy posłużyć się pętlą FOR , oraz sinusoidą. Pętla jest to pewien fragment kodu, który jest wykonywany wielokrotnie (dość ciekawy opis można znaleźć tutaj).  Typowa pętla wygląda tak :

for (int i=0;i<100;i++)  { … tutaj jest kod … }

i jest nazwą używanej zmiennej (może to być k, j, m, a lub b, lub jakakolwiek nazwa, np. mojaZmienna ). 100 to ilość powtórzeń pętli, i++ to operacja wykonywana na zmiennej, ‘++’ znaczy zwiększenie wartości o jeden po każdym przebiegu, analogicznie ‘–’ powodowałoby jej zmniejszenie.

Int to typ zmiennej używanej w pętli, określający ją jako zmienną typu ‘integer’, czyli przyjmującą tylko całkowite wartości. W naszych szkicach będziemy narazie zamiennie używać tylko zmiennych int oraz float (zmiennoprzecinkowych, o większej precyzji).

Funkcję sinusoidalną możemy wykorzystać używając składnię sin(argument), gdzie argument to liczba z dowolnego zakresu, a wynik to liczba z zakresu od -1 do 1.

sin (0) = 0, sin(PI/2) = 1 itp. Podobnie używamy funkcji cos().

Przydadzą się też inne zmienne, np :

float kat = 0; (deklaracja zmiennej ‘kąt’ i nadanie jej wartości zero). Przy każdym kolejnym użyciu nie trzeba już deklarować typu zmiennej, wystarczy napisać po prostu kat = wartość;

oraz float promien; która zdefiniuje promień każdego z kółek.

spróbujmy zatem zamienić linę rysującą kółko na :

for (int i=0; i<50;i++)
{
float kat = i*PI/25.0;
float promien = sin(kat*2)*20+20;
ellipse(250+sin(kat)*200,250+cos(kat)*200,promien,promien);
}

Dla i rosnącego od 0 do 50, kąt przyjmuje wartość od 0 do 2*PI, czyli wykonuje pełny obrót. Promień zaś, arbitralnie zwiększa się i zmniejsza w zależności od zmian kąta – warto poeksperymentować tutaj wpisując różne wartości, można w bardzo łatwy sposób uzyskać bardzo ciekawe efekty graficzne !

Po naciśnięciu START naszym oczom powinna się ukazać następująca grafika :

cwiczenie02

Zaś aby trochę ją ożywić, możemy dodać też polecenie fill() zmieniające wypełnienie każdego indywidualnego kółka w pętli. Tak samo jak w background() , podajemy kolejno wartości koloru czerwonego, zielonego i niebieskiego (0-255)

fill(i*5,128+i*2.5,255-i*5);

tak więc cały kod powinien teraz wyglądać tak :

size(500,500);
background(255,255,255);

for (int i=0; i<50;i++)
{

float kat = i*PI/25.0;
float promien = sin(kat*2)*20+20;
fill(i*5,128+i*2.5,255-i*5);
ellipse(250+sin(kat)*200,250+cos(kat)*200,promien,promien);

}

a efekt tak :

cwiczenie03

Grafikę taką można zapisać jako bitmapę za pomocą polecenia saveFrame() , lub jako grafikę wektorową z użyciem biblioteki do eksportu PDF. W tym celu należy dodać deklarację użycia biblioteki :

import processing.pdf.*;

oraz dać znać szkicowi od którego momentu powinien ‘nagrywać’ grafikę i zapisywać ją w pliku PDF – robi się to za pomocą polecenia

beginRecord(PDF, “kolka.pdf”);

a kończy poleceniem

endRecord();

tak więc cały kod wygląda teraz tak :

import processing.pdf.*;

size(500,500);
background(255,255,255);

beginRecord(PDF, “kolka.pdf”);

for (int i=0; i<50;i++)
{

float kat = i*PI/25.0;
float promien = sin(kat*2)*20+20;
fill(i*5,128+i*2.5,255-i*5);
ellipse(250+sin(kat)*200,250+cos(kat)*200,promien,promien);

}

endRecord();

wygenerowany plik PDF można obejrzeć tutaj

————————————————————————–

Trzeba pamiętać, że kod zaprezentowany powyżej jest tylko jednym z dwóch sposobów pisania programów w Processing, gdyż do pisania aplikacji interaktywnych bardziej stosowny będzie układ zapętlony, gdzie program rysuje/tworzy grafikę lub trójwymiarowy model wiele razy na sekundę, pozwalając nam na interakcję.

O tym jednak w następnym odcinku.