Archive

Posts Tagged ‘bezier’

Pierwsze kroki w Generative Components

March 8th, 2010 12 comments

Po dwóch tutorialach opisujących podstawy prostego programowania w środowisku Processing, zajmiemy się parametrycznym projektowaniem z użyciem środowiska CAD – Generative Components. GC obok Grasshoppera jest jednym z najbardziej popularnych narzędzi do tworzenia parametrycznych projektów (od niedawna dostępne za darmo na stronie http://www.bentley.com/getgc)

W Generative Components praca opiera się głównie na transakcjach – czyli podstawowych krokach tworzących parametryczny model. Zapisane są one w głównym oknie programu, które jest także przez niektórych nazywane ‘transaction player’, bo w istocie, służy ono właśnie do odtwarzania tych transakcji jedna po drugiej.

W pewnym sensie transakcje zapisane są w konwencji ‘akcji’, lub też ‘historii’ zdarzeń podczas konstruowania modelu, co jest czasem krytykowane (w Grasshopperze mamy do czynienia z jednym, finalnym modelem), ale w rzeczywistości pomaga jednak w pracy nad dużymi i skomplikowanymi modelami. Nie wiadomo zresztą do końca jak to będzie wyglądać w przyszłości, gdyż Bentley idzie powoli w kierunku nowych rozwiązań.

podstawowy układ okien w GC

Wśród okien widocznych po otwarciu Generative Components widzimy także okno z diagramem symbolicznym (po lewej stronie, na dole). Służy ono do przeglądania logicznych połączeń i hierarchicznych zależności pomiędzy elementami, a szczególnie pomocne bywa podczas tworzenia nowych komponentów (ale o tym kiedy indziej).  Niektórzy jednak nie używają tego okna prawie wogóle, lub sporadycznie podczas poszukiwania błędów w modelu (‘nieudane’ elementy pojawią się tutaj na czerwono), więc jest to po części kwestia wyboru – można sobie w GC dać bez niego radę.

Przejdźmy do podstawowych elementów parametrycznego modelu.

Układ współrzędnych

Najważniejszym układem współrzędnych jest baseCS , który widzimy w oknie zaraz po otwarciu GC.

baseCS coordinateSystem

Jest to globalny układ współrzędnych, do którego odnoszą się wszystkie współrzędne punktów, wektorów itp. Graficznie przedstawiony jest jako czerwony punkt (origin), trzy kwadraty (XYPlane, YZPlane, XZPlane), i trzy wektory pokazujące graficznie oś X, Y i Z . Żółty kwadrat pokazuje obecnie aktywną płaszczyznę odniesienia – zawsze na początku jest to XYPlane, czyli pozioma powierzchnia przechodząca przez punkt 0,0,0

Punkt

Punkt to najbardziej podstawowy element parametrycznego modelu. Istnieje wiele metod tworzenia punktów, jedną z najprostszych jest ByCartesianCoordinates(coordinate system, x,y,z). Spróbujmy zatem stworzyć taki punkt. Aby to zrobić, klikamy na ikonę ‘create feature’ (w GC wszystkie obiekty nazywane są ‘features’), i z listy wybieramy ‘Point’. Po wybraniu punktu, lub generalnie po wybraniu obiektu który chcemy stworzyć, otworzy nam się druga pod-lista, która pokaże ‘metody’ jego tworzenia. Zazwyczaj jest ich tam trochę, każda potrzebuje trochę innych danych/zmiennych/obiektów wejściowych. My skupimy się teraz na najprostszej, czyli ‘ByCartesianCoordinates’. Po jej wybraniu, pokazuje się nam lista parametrów wejściowych.

tworzenie nowego obiektu

Jako układ współrzędnych, w którym ma się znaleźć nasz punkt, wpisujemy ‘baseCS’ (tak, to jest nasz globalny układ współrzędnych – ale możemy to później zmienić). Należy zwrócić uwagę na duże i małe litery, gdyż np. ‘BaseCS’ nie będzie już działać).

W kolejnych polach wpisujemy współrzędne punktu, dajmy na to X =3 , Y = 2 , Z = 5

Ostatni parametr, zaznaczony na niebiesko jest nieobowiązkowy, więc nie musimy tam nic wpisywać.

Pod spodem widzimy jeszcze pola takie jak ‘name of new feature’, gdzie możemy wpisać np ‘pierwszyPunkt’ , albo ‘poczatekLinii’, lub też zostawić standardową nazwę jaką podpowie nam system (point01). Zdecydowanie warto wpisywać tutaj arbitralne nazwy adekwatne do tego czym jest dla nas dany obiekt, gdyż dużo łatwiej jest się potem połapać w modelu, szczególnie wtedy kiedy jest on już bardzo skomplikowany.

Klikamy zatem ‘OK’ po prawej stronie na dole, i widzimy coś takiego :

mojPunkt

Jest to nasz punkt i jego parametry w modelu (po prawej widzimy go jako żółte kółko). Punkt został stworzony, a transakcja została dodana automatycznie do skryptu – możemy ją zobaczyć klikając dolną zakładkę ‘transaction file’, i odświeżając lub zapisując skrypt (odpowiednie ikony są pokazane strzałkami).

gc07

Tak więc w transakcji nr 1 stworzyliśmy punkt.  Jest to jednak tylko  jeden ze sposobów tworzenia punktów, spróbujmy więc czegoś innego. Na górze widzimy ikonkę ‘create point’ (linia z żółtym kwadratem). To narzędzie pozwoli wstawić nam punkt bezpośrednio w oknie widoku, przy czym punkt zostanie umieszczony na aktywnej płaszczyźnie odniesienia – w tym przypadku płaszczyźnie XY, pokazanej żółtym kwadratem na układzie współrzędnych baseCS. Po kliknięciu na ‘create point’ możemy wstawić go klikając w oknie widoku. Po tym przechodzimy do zakładki ‘transaction file’ i odświeżamy ich stan, lub zapisujemy zmiany.

gc08

Na dole widzimy diagram symboliczny z dwoma punktami. Drugiemu system automatycznie przypisał nazwę point01, ale możemy to zmienić edytując drugą transakcję.

Edytowanie transakcji

Teoretycznie można pracować w GC bez edytowania skryptu, ale na dłuższą metę jest to bardzo ograniczające. Tak więc dokonajmy prostej edycji – kliknijmy prawym przyciskiem myszki na drugą pozycję w transaction playerze, i wybierzmy ‘edit transaction’, po czym zmieńmy ‘point01′ na np. ‘drugiPunkt’

gc09

Tytuł transakcji może być dowolny, np ‘stworzenie kolejnego punktu’ (zamiast ‘Add point01′) – tutaj też dobrze jest edytować tekst, żeby uczytelnić skrypt.

Jak widać, konstrukcja transakcji jest dość prosta. W pierwszej linii posiada słowa kluczowe transaction i modelBased ,  a potem tytuł. Zawartość zawsze znajduje się w nawiasach. Jako, że transakcja może zawierać w sobie wiele obiektów, każdy z nich również zamyka swój opis w nawiasach { … }. Słowo kluczowe feature zaczyna opis obiektu. Po nim następuje jego nazwa (razem z nazwą przestrzeni nazw, to jest lekko skomplikowane, ale .. uhm, podobno ułatwia sprawę ;-) , a następnie typ deklarowanego obiektu- w tym wypadku Bentley.GC.Point

Jak widać na poprzednim zrzucie ekranu, drugi punkt posiada ‘uchwyty’ – służą one do manualnego manipulowania punktem w kierunkach X,Y lub Z. Widać je tylko na drugim punkcie, ponieważ posiada on słowo <free> przed wartością współrzędnej. Możemy dodać <free> przed wartości w pierwszej transakcji (ale muszą one znajdować się wtedy w okrągłym nawiasie), żeby włączyć uchwyty dla pierwszego punktu. Manipulować można nimi za pomocą narzędzia ‘move’ move . Spróbuj użyć go, najeżdżając na jeden z uchwytów, klikając a potem przeciągając myszkę – punkt powinien przesuwać się w przestrzeni zgodnie z pozycją kursora.

Krzywa BSpline

Kolejnym obiektem, którego prawdopodobnie będziemy używać dość często jest krzywa Bspline. Jest to krzywa sklejana beziera, czyli złożona krzywa stworzona przez połączone fragmenty prostszych krzywych. Mówiliśmy o nich wcześniej w tym tutorialu. Krzywą taką można skonstruować na dwa sposoby – z punktów kontrolnych (metodą .ByPoles), lub z węzłów znajdujących się na krzywej ( .ByPoints). Generalnie polecam pierwszą metodę, gdyż łatwiej jest wtedy kontrolować  styczność i pochodne krzywizny – w drugiej metodzie, gdy punkty są bardzo daleko od siebie, a potem nagle bardzo blisko, krzywa może wykonywać niespodziewane ‘zakręty’ albo pętle w przestrzeni.

Spróbujmy więc stworzyć taką krzywą dwoma opisanymi tutaj metodami. Stwórzmy zatem nowy szkic, wybierając File >> New Transaction File. Upewnijmy się, że naszą aktywną płaszczyzną jest baseCS.XYPlane, po czym wybierzmy narzędzie ‘place point’ i wstawmy do projektu cztery bądź więcej punktów, jak poniżej.

aktywna plaszczyzna

gc11

Następnie klikamy ikonę ‘create feature’ aby stworzyć krzywą, i z dostępnego menu wybieramy ‘BSplineCurve’ a potem ‘ByPoles’, jak poniżej.

Następnie klikamy ikonę ‘create feature’ aby stworzyć krzywą, i z dostępnego menu wybieramy ‘BSplineCurve’ a potem ‘ByPoles’, jak poniżej.

tworzenie krzywej BSpline

gc13

Tak oto stworzyliśmy pierwszą krzywą BSpline. Możemy teraz pomanipulować trochę punktami za pomocą narzędzia ’move’ (move) i poobserwować zachowanie krzywej. Zwróćmy uwagę na fakt, że początek i koniec krzywej są styczne do linii stworzonej przez dwa pierwsze lub dwa ostatnie punkty kontrolne.

Dobrze jest spróbować też drugi wspomniany wcześniej sposób tworzenia krzywej (.ByPoints) i porównać różnice. Przy jednym, i drugim, punktów kontrolnych może być oczywiście więcej.

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

Tyle narazie jeśli chodzi o podstawy – a w następnym tutorialu zajmiemy się wykorzystaniem krzywych BSpline do stworzenia parametrycznego dachu  z prawdziwego zdarzenia :-)

Processing – krzywe Beziera

November 14th, 2009 4 comments

dach01

W kolejnej lekcji języka programowania Processing (poprzednia jest tutaj), zajmiemy się krzywymi Beziera. Dlaczego ? Ponieważ krzywe te są bardzo często podstawowym środkiem definiowania nie-liniowej geometrii np. fasad lub dachów. Nie są one co prawda tak popularne jak krzywe B-Spline (chociaż są ich najprostszą wersją), lub ich rozszerzona wersja – NURBS, ale od nich wszystko się zaczęło, więc warto przyjrzeć się im z bliska (są na przykład używane w programie Adobe Illustrator).

Na początek omówimy podstawy tworzenia krzywych, i kilka technicznych elementów pomocnych w kreowaniu trójwymiarowych struktur w Processing. Potem stworzymy program rysujący powierzchnię dachu (jak powyżej) i eksportujący ją do pliku.

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

Spróbujmy napisać kilka lini kodu rysujących przykładową krzywą Beziera. Aby to zrobić potrzebujemy czterech punktów – początku, czyli tzw. pierwszego punktu zakotwiczenia, dwóch punktów kontrolnych, i drugiego punktu zakotwiczenia, czyli końca krzywej.

Zdefiniujmy zatem łańcuch współrzędnych: cztery współrzędne X (łańcuch będzie miał nazwę ‘px’), i cztery współrzędne Y (łańcuch o nazwie ‘py’)

float px [] = new float[4];
float py [] = new float[4];

w ten sposób zdeklarowaliśmy oba łańcuchy, które są teraz gotowe do użycia. Każdy z nich ma cztery pozycje, w których będzie trzymał jedną współrzędną. Przypiszmy im zatem teraz wartości – współrzędne punktów kontrolnych i skrajnych dla krzywej, w układzie współrzędnych XY (liczonym od lewego górnego rogu okna).

px[0] = 50; py[0] = 50;  //pierwszy punkt kontrolny – początek krzywej
px[1] = 40; py[1] = 170; //drugi punkt kontrolny
px[2] = 270; py[2] = 170; //trzeci
px[3] = 250; py[3] = 250; //czwarty – koniec krzywej

size(300,300); //otwórzmy okno o rozmiarach 300 x 300 pikseli

noFill(); //wyłączmy wypełnianie obiektów (o tym później)

bezier(px[0],py[0],  px[1],py[1],  px[2],py[2],  px[3],py[3]); //i narysujmy krzywą

Po wpisaniu powyższego kodu do edytora i naciśnięciu przycisku start, powinniśmy zobaczyć poniższy obraz :

bezier_1Wygląda ciekawie, ale nadal trochę tajemniczo..  Żeby zrozumieć lepiej, jak działają krzywe beziera, narysujmy punkty kontrolne. Dodajmy na końcu poniższe linie :

fill(255,0,0); //zmieniamy kolor na czerwony (podając kolejno wartości r, g, b)
ellipse(px[0], py[0] ,8,8); //punkt nr 1
ellipse(px[1], py[1] ,8,8); //punkt nr 2
ellipse(px[2], py[2] ,8,8); //punkt nr 3
ellipse(px[3], py[3] ,8,8); //punkt nr 4

a żeby zobaczyć jak wygląda tak zwany ‘control polygon’, połączmy je liniami:

stroke(50,100); //ustawiamy kolor i przezroczystość linii
line(px[0], py[0] ,px[1], py[1]);
line(px[1], py[1] ,px[2], py[2]);
line(px[2], py[2] ,px[3], py[3]);

Po dodaniu powyższych linii, uruchamiamy szkic (przyciskiem run, albo ctrl+R) i widzimy krzywą jak poniżej :

bezier_2

Patrząc na ten przykład, można łatwo zauważyć podstawową właściwość krzywej Beziera : początek i koniec są styczne do linii kontrolnych, a to można sprytnie wykorzystać przy tworzeniu bardziej skomplikowanych geometrii.

Spróbujmy teraz zrobić z tego coś ciekawszego, czyli wykorzystać replikację (poprzez użycie pętli FOR – więcej informacji o tym jak jej używać jest w poprzednim tutorialu). Generalnie najciekawsze efekty daje niewielka modyfikacja współrzędnych punktów kontrolnych, i narysowanie wszystkich tak powstałych krzywych razem obok siebie. Dodajmy zatem :

noFill(); //wyłączamy wypełnianie
for (int i=0;i<20;i++) //uruchamiamy pętlę na 20 powtórzeń
{
px[0] = px[0]+5; //przesuwamy punkt 0 w prawo
py[1] = py[1]+8; // punkt 1 w dół
py[2] = py[2]-4; //punkt 2 w górę
px[3] = px[3]+2; //punkt 3 lekko w prawo
bezier(px[0],py[0],  px[1],py[1],  px[2],py[2],  px[3],py[3]); //i rysujemy krzywą
}

bezier_3

Ciekawą wizualizację krzywych razem z liniami kontrolnymi można uzyskać przenosząc dwie linijki kodu:

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

nad linię z komendą fill(255,0,0); , ponieważ wtedy w pętli znajdzie się procedura rysowania linii i czerwonych kółek. Otrzymamy wtedy obraz pokazujący dokładnie ‘wędrówkę’ punktów kontrolnych :

bezier_4

Przy zabawie parametrami można pójść trochę dalej, i dodając do nich kilka sinusów,  otrzymać geometrię jak poniżej :

bezier_6

Pewnie ktoś z czytelników zapyta.. ‘ok, wporządku, ale do czego można tego teraz użyć’ ? Otóż w parametrycznym modelowaniu często spotykamy się z modelowaniem jakiejś powierzchni (np dachu) przez przeciągnięcie jednego profilu wzdłuż krzywej (tzw. szyny – ‘sweep profile along rail curve’ ), lub zbudowanie z wszystkich krzywych jednej powierzchni (‘loft curves’). Tak też spróbujemy zrobić za kilka chwil.

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

Najpierw jednak, aby ułatwić nam nieco modelowanie trójwymiarowych obiektów, i ich przestrzenną ocenę, musimy dodać do programu element interaktywny. Inaczej będziemy ciągle w dwuwymiarowym, statycznym świecie. Ta mała dygresja jest raczej konieczna do tego, żeby przejść do kolejnego, bardziej ekscytującego (!) etapu programowania w trzech wymiarach.

W Processing możemy pisać programy na dwa sposoby : liniowy, gdzie zwyczajnie wpisujemy komendy jedna po drugiej, np :

size(300,300,P3D); //ustawiamy okno

translate(150,150); //przesuwamy układ współrzędnych na środek ekranu (połowa szerokości, połowa wysokości)

rotateX(PI/3); //obracamy układ współrzędnych wokół osi X
rotateZ(PI*1.7); //i wokół osi Y

box(50); //i rysujemy sześcian

W ten sposób program wykonuje wszystkie polecenia po kolei, i zatrzymuje się na końcu. Możemy w międzyczasie wykonywać pętle, definiować wiele graficznych elementów i pisać nieskończone ilości instrukcji – ale wszystko zostanie wykonane tylko raz.

Drugi sposób, to sposób nieliniowy, interaktywny i zorientowany zdarzeniowo. To znaczy, że po uruchomieniu programu, instrukcje będą wykonywane w niekończącej się pętli (ok 20-30 razy na sekundę), a program może w tym czasie rysować dowolne rzeczy, wydawać dźwięki, odgrywać video, i co najważniejsze reagować na zdarzenia. Takimi zdarzeniami zazwyczaj są manipulacje myszką i naciskanie klawiszy na klawiaturze, ale może to też być bardziej skomplikowany bodziec, jak na przykład obraz z kamery video, lub dźwięk z mikrofonu.

Program taki wygląda tak:

void setup()
{
println(“ta instrukcja wykona się 1 raz”);
}

void draw()
{
println(“ta instrukcja wykona się wiele razy”);
}

Czyli ma dwie części : setup, i draw. Pierwsza wykonuje się tylko raz, dokonujemy w niej ustawienia okna, początkowych zmiennych, ładujemy czcionki, obrazy i dźwięki. Druga (draw) to część która będzie wykonywać się w nieskończoność, dopóki nie zakończymy programu.

Ten sam program, w wersji interaktywnej będzie wyglądał tak :
void setup()
{
size(300,300,P3D);
//ustawiamy okno (włączamy też tryb pracy w trzech wymiarach)
}

void draw()
{
background(160);
//czyścimy tło przed narysowaniem czegokolwiek

translate(150,150); //przesuwamy układ współrzędnych na środek ekranu (połowa szerokości, połowa wysokości)

rotateX(mouseY*PI/300); //obracamy układ współrzędnych wokół osi X (wykorzystujemy pozycję myszki!)
rotateZ(mouseX*PI/300); //i wokół osi Y

box(50); //i rysujemy kostkę
}

Po uruchomieniu powyższego kodu, zobaczymy radośnie obracający się sześcian :)

box01

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

Po tej małej dygresji zacznijmy więc nowy szkic (wybierając z menu File >> New). Na początek, tak jak poprzednio, deklarujemy współrzędnych punktów kontrolnych

float px [] = new float[4];
float py [] = new float[4];

I przejdźmy do trybu 3D – robi się to poprzez deklarację size(szerokość, wysokość, tryb).  Tryb może być wyrażony przez P3D – standardowy silnik Javy (działa w oknie przeglądarki stron www), albo przez OPENGL – szybszy i dużo lepszy graficznie silnik, ale działający tylko w oknie Processingu albo po skompilowaniu szkicu do pliku .exe.

void setup()
{
size(600,400,P3D);
//tworzymy okno (tym razem trochę większe!)
}

i zaczynamy część ‘dynamiczną’

void draw()
{

background(160); //czyścimy tło
translate(300,200);//przesuwamy układ współrzędnych na środek

rotateX(mouseY*PI/300); //i obracamy go wokół osi X
rotateZ(mouseX*PI/300); //i osi Z

noFill(); //bez wypełniania
stroke(250,160); //rysujemy białym, lekko przezroczystym kolorem

Współrzędne punktów będą teraz trochę inne, a nasza krzywa będzie przypominać odwróconą literę ‘U’. Narysujemy ją 120 razy, przesuwając ją stopniowo  (użyjemy znowu pętli FOR). Zauważ, że zamieniliśmy współrzędną Y ze współrzędną Z (gdzie współrzędna Y przesuwa się od -60 do 60).

for (int i=-60;i<60;i++)
{
px[0] = -100; py[0] = -50;
px[1] = -80;     py[1] = 150;
px[2] = 80;      py[2] = 150;
px[3] = 100;    py[3] = -50;

bezier(px[0],  i*2,  py[0],   //współrzędne pierwszego punktu (początku krzywej)
px[1 ],  i*2,  py[1],    //współrzędne drugiego punktu
px[2],  i*2,  py[2],   // trzeciego
px[3],  i*2,  py[3]);
//i czwartego (koniec)
}

}

Po uruchomieniu programu, widzimy naszą pierwszą prawdziwie trójwymiarową powierzchnię :

bezier_07

W tym momencie nasz ‘dach’ jest poprostu zwyczajną powierzchnią ‘translacyjną’, czyli powstałą poprzez translację (przesunięcie) profilu w przestrzeni. Prawdziwa zabawa zacznie się jednak dopiero, gdy zaczniemy modulować profil podczas przesuwania. Jak to zrobić ? Wystarczy przy każdym przebiegu pętli zmienić lekko współrzędne punktów kontrolnych. Dobrze jest użyć do tego funkcji Sinus lub Cosinus, ponieważ łatwo nią sterować za pomocą amplitudy i okresu. Na przykład jeśli w naszej pętli zmienna i przechodzi od wartości -60 do 60, to dodając do którejś współrzędnej wyrażenie sin(i/60 * PI) * 50 , wartość wyrażenia przejdzie płynnie od sin(-PI)*50 do sin(PI)*50, czyli od -50 do 50, oczywiście płynnym ruchem, jak na sinusoidzie.

Dodając kilka takich kombinacji można uzyskać poniższy efekt :

bezier_08

A kod generujący krzywiznę wygląda tak :

for (int i=-60;i<60;i++)
{
px[0] = -100;                   py[0] = -50+sin(i*PI/60.0)*25;
px[1] =  -80+sin(i*PI/45.0)*50; py[1] = 50;
px[2] =   80;                   py[2] = 50;
px[3] =  100+sin(i*PI/60.0)*25; py[3] = -50+sin(i*PI/40.0)*15;
bezier(px[0],  i*2,  py[0],
px[1],  i*2+sin(i*PI/120.0)*150,  py[1],
px[2],  i*2,  py[2],
px[3],  i*2,  py[3]);
}

for (int i=-60;i<60;i++)
{
px[0] = -100;                                             py[0] = -50+sin(i*PI/60.0)*25;
px[1] =  -80+sin(i*PI/45.0)*50;   py[1] = 50;
px[2] =   80;                                                py[2] = 50;
px[3] =  100+sin(i*PI/60.0)*25;  py[3] = -50+sin(i*PI/40.0)*15;

bezier(px[0],    i*2,     py[0],
px[1 ],    i*2+sin(i*PI/120.0)*150,  py[1],
px[2],    i*2,     py[2],
px[3],    i*2,     py[3]);
}

Oczywiście jest to arbitralna zabawa liczbami i wyrażeniami matematycznymi, więc można dodawać i odejmować różne części wyrażeń, żeby uzyskać podobny, lub zupełnie inny efekt (np pionową fasadę zamiast poziomego dachu) – ale to już zależy od inwencji designera.

Aby zapisać tak wygenerowany ‘dach’ musimy użyć biblioteki do eksportowania geometrii do plików DXF. Tak samo jak w poprzednim odcinku, zadeklarujemy użycie tej biblioteki na samym początku programu poprzez dodanie linii

import processing.dxf.*;

Aby rozpocząć ‘łapanie’ geometrii przeznaczonej do zapisania na dysku, dodajemy linię
beginRaw(DXF, “dach.dxf”);
zaraz po linii
void draw()
{

a na samym końcu programu dodajemy endRaw(); (tuż przed nawiasem kończącym program)
}

Działający w przeglądarce powyższy przykład wraz z pełnym kodem można obejrzeć tutaj (wymagana zainstalowana Java).

Geometria zostanie zapisana w pliku ‘dach.dxf’ w tym samym folderze, w którym znajduje się nasz szkic (dobrze jest go najpierw zapisać poprzez File >> Save w głównym menu).

Należy pamiętać, żeby używać funkcji beginRaw(..) i endRaw() tylko wtedy kiedy chcemy zapisać geometrię, inaczej będzie ona spowalniać niepotrzebnie nasz program. Poza tym warto zapisywać geometrię bez żadnych obrotów – najlepiej poprostu włączyć i wyłączyć program trzymając kursor myszki poza oknem, wtedy dach będzie leżał poziomo na płaszczyźnie XY.  Można też zamienić linie obracające układ współrzędnych na rotateX(0); rotateZ(0); , lub zupełnie je wyłączyć/skomentować za pomocą symbolu //   (początek komentarza – tekst następujący po tym symbolu jest ignorowany).

Po wyeksportowaniu geometrii do pliku, możemy otworzyć go w programie CAD i zrobić z nim co nam się żywnie podoba :)

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


dach02dach03

Categories: Processing Tags: , , ,