ArchiMAD-lehti

Koordinaattimuunnokset GDL:ssä - ArchiMAD

Kirjoittanut Heikki Malkki | 02 joulukuuta 2022

Tässä artikkelissa esitellään GDL-kielen koordinaattimuunnoskäskyt, jotka yhdistettyinä silmukointikäskyihin antavat jo hyvän pohjan erilaisten objektien toteuttamiseen yksinkertasillakin elementeillä. 

Jos et tiedä mitään GDL-ohjelmoinnista, näillä ohjeilla voit kuitenkin kokeilla esimerkkejä: 

  • Luo uusi GDL-objekti: Arkisto Kirjastot ja objektitUusi objekti... 
  • Valitse vasemmalta 2D-ohjelma ja kirjoita koodikenttään "PROJECT2 3, 270, 2". Tämä käsky yksinkertaisesti luo pohjakuvaan automaattisesti piirrokset ohjelman 3D-elementeistä. 
  • Valitse 3D-ohjelma ja kirjoita kokeeksi "BLOCK 1,1,1". Artikkelin esimerkit tulevat tänne. Ohjelmissa huutomerkin jälkeen olevat tekstit ovat kommentteja, ne voi jättää pois. 
  • Tallenna objekti sisäiseen kirjastoon. 
  • Sijoita objekti pohjaan. Jos kaikki meni hyvin, pitäisi pohjassa ja 3D:ssä näkyä metrin kokoinen kuutio. 

3D 

Archicadin koordinaattijärjestelmä on oikeakätinen, eli jos oikean käden peukalon ja etusormen laittaa suoraan kulmaan (X- ja Y-akselit) ja keskisormen niitä vasten kohtisuoraan, se osoittaa Z-akselin suunnan. 

Koordinaatistossa voi siirtyä erilaisilla siirto- ja kiertokäskyillä. Lisäksi koordinaatistoa voi litistää tai venyttää eri akselien suhteen. Siirtymiä kannattaa ajatella omasta perspektiivistään: Jos käännyn 90° oikealle ja kävelen metrin Y-akselini suuntaan eli eteenpäin, päädyn metrin päähän X-akselin suuntaan origosta. 

Siirtoja tai muita muunnoksia perutaan DEL-käskyllä, jonka parametriksi annetaan peruttavien käskyjen määrä. DEL TOP peruu kaikki muunnokset, jolloin palataan objektin origoon. Objektien monimutkaistuessa on kuitenkin parempi perua aina tunnettu määrä muunnoksia, jotta mahdolliset aiemmat koko objektia koskevat muunnokset pysyvät loppuun asti mukana. 

Siirto 

Tavallisin koordinaattimuunnos on yksinkertainen siirto. Jokaiselle akselille on oma käskynsä, tai neljäs käsky, joka yhdistää nämä. 

ADDX x      ! Siirry x metriä oikealle 
ADDX y      ! Siirry y metriä eteenpäin 
ADDX z      ! Siirry z metriä ylöspäin 
ADD x, y, z ! Edelliset 3 yhdistettynä 

Esimerkki: Kaksi kuutiota. Yleensä ohjelmointikielissä sisennyksiä käytetään vain funktioissa sekä ehto- ja toistolauseissa, mutta usein GDL:ssä koodia selventää myös koordinaattimuunnosten alla olevien käskyjen sisennys. 

BLOCK 1, 1, 1     ! Ensimmäinen kuutio 
ADD 1, 1, 0       ! Siirrytään oikealle (x) ja eteen (y) 
    BLOCK 1, 1, 1 ! Toinen kuutio 
DEL 1             ! Perutaan siirtyminen eli palataan lähtöpisteeseen 

Kierto 

Kiertäminen tapahtuu myös oikeakätisesti: Kun oikealla kädellä tarttuu akseliin niin, että peukalo on akselin suunnassa poispäin origosta, sormien suunta kertoo mihin suuntaan kiertokulma kasvaa. Positiivinen suunta on siis vastapäivään ja negatiivinen myötäpäivään. 

ROTX x ! Kallistu taaksepäin x astetta 
ROTY y ! Kallistu oikealle astetta 
ROTZ z ! Käänny vasemmalle z astetta 

Neljäs kiertokäsky ROT eroaa näistä: sen avulla voi itse määritellä akselin, ja antaa sille sitten kiertoarvon. 

ROT x, y, z, kulma ! Kierrä kulman verran vektorin (x, y, z) suhteen 

Esimerkki: Kierretään kuutiota sen pisimmän akselin (kulmasta kulmaan) suhteen. 

ROT 1, 1, 1, 90
    BLOCK 1, 1, 1 
DEL 1 

Venytys 

Venytyskäskyjä on neljä: 

MULX x       ! Skaalaa X-akselin suhteen kertoimella x 
MULY y       ! Skaalaa Y-akselin suhteen kertoimella y 
MULZ z       ! Skaalaa Z-akselin suhteen kertoimella z 
MUL x, y, z  ! Edelliset 3 yhdessä 

Venytyskäskyille on harvemmin käyttöä ja niitä on hankalampi visualisoida. Toisaalta voi ajatella, että MULY 2 tekee kaikesta paksumpaa, mutta jos tahdotaan pysyä siinä ajatuksessa että oma perspektiivi on aina normaali, pitäisi ajatella, että kaikki muu on Y-suunnassa puolet litteämpää. Kaikki on suhteellista.  

Venytyksiä voi käyttää esimerkiksi silloin kun tahdotaan skaalattu versio jostain peruskappaleesta. Tehdään vedin puolikkaasta toruksesta: 

MULX 3 
    ELBOW .05, 180, .01 ! Kaaren säde, kaaren kulma, 'putken' säde 
DEL 1 

Kertoimet voivat olla myös negatiivisia, jolloin elementit peilautuvat peilattua akselia kohtisuoraan olevan tason suhteen. 

CALL "Nainen odottaa 26" PARAMETERS ALL 
ADDX .4 ! Siirrytään vähän sivuun etteivät objektit mene päällekkäin 
MULX -1 ! Peilataan X-akselia kohtisuoran YZ-tason suhteen 
    CALL "Nainen odottaa 26" PARAMETERS ALL 
DEL 2 

Yksi käyttötapaus on skaalata koko kappale, jotta voidaan käyttää esimerkiksi millimetrimittoja metrien sijaan. Tämä on tosin hiukan kyseenalaista ja saattaa aiheuttaa sekaannusta. Millin kokoinen kuutio: 

MUL 0.001, 0.001, 0.001
    BLOCK 1, 1, 1 
DEL 1 

Vapaa muunnos 

Viimeinen 3D-koordinaattimuunnoskomento on XFORM (transform, muunnos), joka pitää sisällään kaikki edelliset muunnokset ja on lähimpänä tietokoneen omaa käsitystä niistä. Käsky on kuitenkin hankalakäyttöinen ja useimmiten turha ihmiselle, ja usein käytetty lähinnä tuotettaessa GDL-koodia koneellisesti. 

XFORM xn_kerroin_xlle, yn_kerroin_xlle, zn_kerroin_xlle, xn_siirto,
      xn_kerroin_ylle, yn_kerroin_ylle, zn_kerroin_ylle, yn_siirto, 
      xn_kerroin_zlle, yn_kerroin_zlle, zn_kerroin_zlle, zn_siirto 

Lasketaan siis uusi koordinaatti yhdistelemällä lähtökoordinaatteja kertomalla ne annetuilla kertoimilla ja lisäämällä niihin vakio (siirto). Eli uusi_x = vanha_x * xn_paino_xlle, vanha_y * yn_paino_xlle, vanha_z * zn_paino_xlle + xn_siirto . 

Yksi käyttötapaus XFORMille on vinoutuksen (englanniksi shear), harvoin käytetyn muunnoksen, toteuttaminen. Esimerkissä 'kallistetaan' kuutiota X-akselin suuntaan kulman verran sen korkeuden kuitenkin pysyessä samana. Diagonaalisesti kulkevat ykköset kertovat, että objektin mittasuhteet pysyvät muuten samoina (uusi X on vanha X kerrottuna yhdellä jne.), mutta X-suunta on kertoimen TAN(kulma) verran sidoksissa Z-koordinaattiin. TAN(45) = 1, joten yhden metrin korkeudella olevat pisteet siirtyvät oikealle 1 x 1 m verran. 

kulma = 45 
XFORM    1, 0, TAN(kulma),0,  ! X 
         0, 1, 0         ,0,  ! Y 
         0, 0, 1         ,0   ! Z 
    BLOCK 1, 1, 1 
DEL 1 

2D 

Pohjaan piirrettäessä käytetään samankaltaisia käskyjä kuin 3D:ssä. Kannattaa huomata, ettei Archicad anna virhettä, jos 2D-komentoja on 3D-ohjelmassa tai päinvastoin. DEL-komento on sama myös 2D:ssä. 

ADD2 x, y  ! Siirry  
ROT2 kulma ! Kierrä kulman verran vastapäivään 
MUL2 x, y  ! Skaalaa X- ja Y-suunnassa 

Siirrosten logiikasta 

Usein kannattaa hetki miettiä, miten toteuttaa sarja siirroksia. Ihmismäinen toimintatapa ei välttämättä ole paras ratkaisu GDL-koodiksi. Miten toteuttaa tällainen tuolirinki?

Ensimmäisenä voi tulla mieleen asettaa tuoli, ottaa askel oikeaan, kääntyä hiukan, ja asettaa sitten toinen, ja toistaa tätä kaavaa silmukalla. Tämä kuitenkin vaatisi tuolien kulman lisäsäää, jotta ne saa suunnattua keskikohtaan, ja kehää myöten kulkiessa tulee hankalaksi säätää kehän sädettä jne. 

Parempi ratkaisu on purkaa siirtyminen kahteen askeleeseen: kääntymiseen ja siirtymiseen eteenpäin. Näitä voisi toistaa putkeen, mutta on yksinkertaisempaa nollata siirtymä ja alkaa alusta. 

FOR kulma = 0 TO 360-1 STEP 360/7
    ROTZ kulma   ! Kulman verran vastapäivään 
    ADDY 1       ! Metri eteenpäin 
    CALL "Tuoli 01 26" PARAMETERS ALL 
    DEL 2        ! Palataan alkuun 
NEXT kulma

Silmukoidessa usein kannattaa käyttää kokonaislukumuuttujia eikä suoraan kulmia tai pituuksia. Näin pääsee käsiksi esimerkiksi rivi- ja sarakenumeroihin silmukan sisällä, ja askelia on helpompi muuttaa. 

xsiirtyma = 1.1 
ysiirtyma = 1.6 

FOR nx = 0 TO 9 
    FOR ny = 0 TO 9 
        ! Kolme siirtymää on eroteltu selvyyden vuoksi erillisiksi. 
        ! Voisi käyttää myös yhtä ADD-käskyä. 
        ADDX nx * xsiirtyma  
        ADDY ny * ysiirtyma 
        ! Jos palikan rivi- ja sarakenumeron summa on 
        ! jaollinen kolmella, nostetaan puoli metriä. Miksipä ei. 
        ADDZ ((nx+ny) % 3 = 0) * 0.5  
            BLOCK 1, 1, 1 
        DEL 3 
    NEXT ny 
NEXT nx

Toisaalta siirroksiin ei tarvitse aina suhtautua turhan suunnitelmallisesti – kokeiluista ja virheistäkin voi syntyä jotain mielenkiintoista ja inspiroivaa.