"3DCS avagy sebészeti tervezés"
Részletek a hírekben!
 
   
 
 
Naprakész hírek...                                         240 fórumozó...                                         Számos magyar oktatóanyag...                                         Videóanyagok magyarul is...                                         Letölthető fájlok...                                         Textúrák...                                         Összegyűjtött linkek...
 
  Rólunk
Hírek
Fórum
Kihívás
Kapcsolatok
Galéria
Aktuális, 2015
2014, 2013
2012, 2011
2010, 2009
Leírások
Kezdő leckék
Haladó leckék
Egyéb leírás
Billentyűk
Videóanyagok
Kezdő videók
Haladó videók
Egyéb videók
Tippek, trükkök
Letöltés
BLEND fájlok
Textúrák
Linkajánló
Archivum
Projektek
BlendRace SokoTruck
Flipper MB game
 
 

Blender leírások és oktató anyagok

 

Interaktív Laptop

Előzmény

Amikor a Fórumban kecsap hozzászólásait, munkáit elolvastam és megnéztem, emlékeztem, hogy valahol van nekem a blender-mappában valami. Arról van szó, hogy egy 3d-s modellt hogyan lehet körben - a térben - megnézni, forgatni, ráközelíteni stb. Kutakodásom eredménye sikerrel járt és ahogy az már jó szokásom, közkinccsé teszem a végeredmény létrejöttének egyes fázisait. A leírásnak nem lehet pontos címet adni, mert egyrészt szerepel benne egy-két (6) python-script, valamint a Game Engine, ami egy külön fejezetet igényelne. Ezért inkább tekintsétek fejlesztői dokumentációnak az alább leírtakat, melyet ezek szerint is építettem fel.

A munka

Modellezés

A modellezéssel kapcsolatban egyetlen megjegyzésem van: a billentyűzet és a touchpad létrehozásában segítségül háttérképet használtam. (Később ebből (is) lett a textura) Igen, a Blender (és más 3d progi) így is segítheti a modellező munkáját.


A háttérkép beillesztése


A billentyűzet háttérképpel...


és háttérkép nélkül

Minden modell-részt elkészítettem - a teljesség igénye nélkül: touchPad, lcd-panel stb - és lassan testet öltött maga a "mű", mutatom...


A bill. és a touchPad a Power gombbal


A laptop alsó része


Az lcd-panel


Solid nézet

1255 Face-ből sikerült kihozni. Az alacsony polygonszám azért kellett, mert a játékmotort használom a modell interaktív megmutatására. Nos azt hiszem, rátérhetünk - ha röviden is - a texturázásra.

Texturázás

Nem kívánok részletesen foglalkozni a dologgal, megtette már más helyettem, sőt jobban! Amit azonban meg kell említenem - a képből nem látszik -, hogy maga a modell már nem egy objektum, és az lcd monitor fekete színű részének (maga a display) helyén öt másolt plane van, amire külön-külön tettem rá szubjektív megitélés alapján képeket. Az eredeti elképzelés utólag bővült ezzel, hiszen a lényeg a munkában nem a képek, hanem maga a modell (laptop) bemutatása.


A modell (egyik) textúrája


és így néz ki a modellen

Játékterv

Az írás elején említettem, hogy mi adott ötletet. Amikor megtaláltam a szükséges projektet, leültem és papírra vetettem elképzeléseimet. (Megjegyzem: hihetetlenül hasznos tud lenni egy ilyen előzetes firkálmány, és utóbb átolvasni néha mosolyogtató.) A terv egyszerű. Adott legyen a kameranézet egérrel történő mozgatása, lehessen a tárgyra közelíteni és távolodni. (elvario, rávarió, ahogy a szakma mondaná), az lcd panel egy billentyű leütésére csukódjon be és nyíljon ki. Ez volt az eredeti elképzelés. Utóbb került a projektbe a képek megmutatása, tehát máris bővűlt az elvárások listája. (Nem hallgatom el, hogy szerettem volna magát az lcd-t ki/bekapcsoló lehetőségét is betenni, de a végén elvetettem - nem mondtam le róla -, mert a lényeg nem ezen van, és időbe tellett volna a kivitelezése)

Interakciók terve

Mély szakmaiság nélkül: az interakciót ebben az esetben felhasználói beavatkozásnak értelmezem. Mi is lehetne ez? Sok fejtörést okozott, hogy a mai fiatal számítógépes generáció jelentős része - tisztelet a kivételeknek - eléggé egérközpontú. Ennek a trendnek tettem eleget, amikor úgy terveztem a beavatkozást, hogy a bal egérgombhoz a zoom-be, a jobb egérgombhoz a zoom-ki, a középső egérgomb nyomvatartásával pedig a körbenézést véltem a legkézenfekvőbb megoldásnak. A space-hez az lcd-panel zárását és nyitását rendeltem, valamint a "T"-hez ("Tovább") a képek szekvenciális megtekintését. A kétnyelvű (angol-magyar) súgó később került a munkába szintén egy-egy billentyűhöz ("E"-English / "H"-Hungaryan) rendelve, de erről még később lesz szó.

A Game Engine (Játékmotor) röviden

Minden, a jelenetben szereplő tárgyhoz hozzá kell rendelni a kívánt funkciókat. (lásd, játékterv alapján)

Három ilyen elem létezik:

1. Sensors (Érzékelők)

2. Controllers (Ellenőrzők)

3. Actuators (Végrehajtók)


A 3 GE elem

Sensors

Az érzékelők, mint azt a nevük is jelzi, valamit érzékelnek. Mi lehet ez? Vegyük az lcd-panel bezárását alapul! (megjegyzés: a panel, már a kivitelezéskor olyan pozíciót és forgáspontot (pivot) kapott, hogy a művelet során minél egyszerűbben lehessen kezelni a végrehajtást, vagyis a panel lecsukását.)


A kiválasztott LCD-panel a pivot ponttal

Tehát, kijelöltem () az LCD- panelt oldalnézetben [Num] és nyomtam egy []-t, és a Loc-ot választottam.


A mozgás első kulcskockája

A kulcskockák aktuális kijelzőjén továbbléptem az 50. kockára. Az []-el elforgattam a panelt abba a pozícióba, hogy az lecsukott állapotba kerüljön. (Pontosabban én 110 fokot forgattam, mert atz LCD- panel modellezése Z tengellyel párhuzamosan történt, vagyis az alsó résszel derékszöget zárt be a display, de amikor készen lettem vele, a középpontja (pivot) körül elforgattam 20 fokot - magyarul jobban megdöntöttem. Így talán jobban érthető, hogy a 110 fok hogyan is jött ki - 90+0=110) :-)


Az aktuális képkocka kijelzője

Ott tartunk, hogy a display panel bezáródik 50 frame-n keresztül. Le is ellenőrizhető egy [Alt] leütésével. Pompás, műxik! Lépjünk tovább! Amikor lekulcsoltuk az 50. képkockát, szinte észrevétlenül ez a mozgás rögzült egy adott helyen, ez pedig az IPO. Lássuk, miről beszélek. (persze a képernyő fel van osztva (Split Area) és én a jobb oldali panelen megváltoztatom a nézetet IPO-ra)


Az IPO ablak

Szépen látható egy világoszöld görbe, ami az animáció jellemzői mutatja. Annélkül, hogy túl sok információt mondanék az IPO-ról, azért a főbb jellemzőit érdemes megjegyezni! Úgy néz ki, mint egy koordináta-rendszer. A vizszintes tengelyén a frame, a függőleges tengelyén az elfordulás mértéke van skálázva. Pontosan leolvasható, hogy 50 frame alatt az elfordulás 110 fok lesz. (Arról most nem beszélnék, hogy miért 70 foknál kezdődik a görbe, de gondold végig, hogy ha bezár a panel, akkor 180 fok az érték, ellenkező irányban, ha teljesen nyitva lenne, akkor 0 (nulla) fok - remélem nem bonyolult!)

Látható még egy sötétebb zöld színű vonal, ez a time-line kurzor, ami a pillanatnyi animáció-frame-helyzetet mutatja. Az egérrel megfogható és húzható, ilyenkor maga az lcd-panel is követi az animációs görbét a másik ablakban. (bezáródik) Nézzük meg az ablak jobb oldalán felsorolt információkat (nem mindet, csak egyet!) :-) Három érték felirata fehér (RotX, RotY, RotZ) és a RotX előtti színes gombocska be van kapcsolva. Érdekes... A fentebb leírt műveletek mindegyikét egy helyen láthatjuk. Kulcsolás, forgatás. Logikus a kérdés: "Nem lehetne együtt a két dolgot megvalósítani?" Dehogynem! Később leírom ennek a módját is, de térjünk vissza a Sensorokhoz!

Ugye a játéktervben az írtam, hogy a Space leütésekor az lcd-panel záródjon be?! Nézzük, hogy az érzékelő hogyan működik. Ha a tárgy ki van választva, akkor a GombAblakban (Button Window) váltsunk nézetet. [] Ezt Logic-nek nevezi a program. Teljes neve: Logic Brick, logikai tégla, de pontosabban logikai építőkocka, itt kell felépíteni magát a játék működését. Amint azt a fentebb látható ábra is mutatja az LCD nevű tárgy van kiválasztva. Mellette van egy Add feliratú gomb. Adjunk a tárgyhoz egy érzékelőt! (Click az Add-ra) Az alapértelmezett Sensor az Always, ezt kell megváltoztatni a menüből, a következő módon:


Billentyű érzékelő hozzáadása a tárgyhoz

A kép (majdnem) mindent elárul - A KEY melletti mezőre, ha rákattintassz, megváltoztatható az érzékelőhöz rendelt billentyű (Ilyenkor a "Press a KEY" felirat várja, hogy lenyomj egy kívánt bill.-t) Hozzárendelhető még további un. segédbillentyű, (Hold) és "üzenet" is továbbítható egy másik tárgynak, (LogToggle), de erről most nem beszélnék. Arról viszont igen, hogy látható még egy sárga kis valamicsoda a panel mellett, jobbra. Ez az érzékelő output-ja, vagyis kimenete. Érthetőbben - Ha lenyomod a Space-t, ezen a kimeneten jelzést ad az érzékelő. A jelzést, mondhatnám, hogy egy impulzus, de mindegy minek hívom, a lényeg, hogy a jelzés tudtára hozza a GE-nek, hogy történt valami. (Tisztában vagyok vele, hogy nem beszéltem sok dologról a sensor kapcsán, de később lesz még szó ezekről.)

Controllers

A sensor hová küldi a jelet? Hát a kontrollernek! Szintén click a LCD kontroller melletti Add gombocskára! A kép sokat elárul a kontroller működéséről, most ennyi bőven elég, később lesz még szó a python kiválasztásáról. A space-hez az AND kontrollert rendeltem, és a sensor kimenetét a kontroller bemenetére húztam (Drag&Drop) Enélkül nem működne a GE, hiába van a kimeneten jel, ha az nem csatlakozik bemenetre.


A kontroller hozzákötése a sensorhoz

Actuators

Nincs más hátra, rendeljünk valami végreható elemet a tárgyhoz, a megszokott Add gombocskára click! Mit is kell az LCD panelnek művelnie? Aha... lecsukódni! Hmm... de ezt hogyan hajtatom végre? Nagyon egyszerű! Nem véletlenül beszéltem az IPO-ról. Az ábra mutatja is, hogy végrehajtó elemként a tárgyhoz lehet rendelni az IPO-t.


Végreható elem hozzáadása (IPO)

Az IPO további beállításai az animáció működését befolyásolja. Részletesen itt nem tárgyalom a lehetőségeket - van a neten ehhez teljesen érthető tutorial -, itt most csak az általam használt lehetőségről írnék kicsit részletesen. Az alapértelmezett beállítás a Play. Két érték rendelhető hozzá: Sta: Start - az animáció melyik frame-től induljon és az End: melyik képkockával zárjon. Ugye milyen egyszerű? Igenám, de ez a lejátszási mód nekünk nem felel meg, mert minden egyes Space leütésekor lejátszaná az első és az 50. képkocka között a mozgást, ami ugyebár nem lenne szép látvány - állandóan a nyitott LCD lecsukódna. A megoldást a Ping Pong beállítás jelenti. (Ugye már nem is kell mondani, hogy a működőképesség érdekében, a kontroller kimenetét át kell húzni a végreható elem bemenetére, csak így fog jól működni a dolog!) Ellenőrzésképp a []-el indítsd a játékot és [EscKEY]-el léphetsz ki belőle!


Az IPO animáció lejátszásának kiválasztása (a frame-k már beállítva)

A működés a következőképpen zajlik: A Space aktiválja az érzékelő kimenetét, mely a jelet átadja a kontrollernek. Ez továbbadja a jelet - ha a logikai feltétel bekövetkezik - a végrehajtó elemnek. A végrehajtó elem pedig lejátsza az animációt. A Ping Pong úgy működik, hogy lejátszás után (Space) megjegyzi az utolsó képkockát (End) és a következő Space által kiváltott jel érzékelésekor ettől a képkockától visszafelé játsza le az animációt. Magyarul, az LCD kinyílik a kiinduló pozícióba. Remek!! Ez kell nekünk! Tehát, a Spave-vel végeztünk, az LCD-panel nyit/zár, lépjünk tovább!

A python kód

Sajnos(?), a játékfejlesztés nincs meg programozás nélkül, ezért félve ugyan, de leírom a programhoz tartozó python kód(ok) lényegét. Akit nem érdekel, nyugodtan lapozzon tovább, de érdemes azért mégis egy pillantást vetni a leírtakra, hogy tisztába kerüljön a kedves olvasó a működés lényegével. Igyekszem érthető lenni! Már említést tettem róla, hogy a kontroller elemhez nem csak az AND és OR művelet rendelhető, hanem egy un. python lehetőség is. Beszéljünk róla kicsit részletesebben! (A python, mint program-nyelv ismertetését Ragdavil barátunk már elkezdte írni, olvasható a Blender-Kuckó Leírás szekciójában, tehát én most eltekintenék ettől - lásd: http://blender.dbs-team.hu/index.php?page=tut&l=sdoc/pyton)

A program hat python kódot tartalmaz, mindnek a kódban leírt feladatot kell teljesítenie.


A python kódok

Például a rotateH.py kód a horizontális forgatásért felelős. Felmerülhet a kérdés: "Minek a python? Enélkül nem lenne jó, vagy nem megoldható?" Nem egyszerű a válasz, de megpróbálom... Működne a program a python nélkül is, de bizonyos korlátokkal. Mi ez a korlát? Hát... egérmozgáshoz nem lehetne kötni a forgatást. Ha jobban szemügyre veszed a sensor-hoz rendelhetó Mouse beállítást, találni fogsz benne egy Movement-et, ami az egér megmozdításakor ad ki jelet az érzékelőn, de ennek a beállításnak nincs irány-érzékenysége. Vagyis, bármerre mozgathatod az egeret, annak kimenetéhez rendelt végrehajtó elem fog teljesülni. Viszont ebben az esetben egy python kód gondoskodik, hogy "figyelje" az egér irányultságát. Az egérmozgás az egyik sarkallatos pontja minden játéknak. Ezenkívül minden esetben, a létrehozott játékban el kellene végezni az összes itt nem részletezett lépés(eke)t, ellenben a py kódot csak egyszer kell megírni, és minden hasonló programban csak a modellt kell elkészíteni vagy beimportálni. Lássuk, hogy működik a kód!

Két Empty objektum (nem ojjektum!!) egymás alatt. Az egyik a horizontális, a másik a vertikális mozgásért felel. A kamera hozzá van kötve az emptyhez, hogy bármerre is mozog, képsíkja az empty felé forduljon.


A kamera és az empty(k)

Nos a rotHor nevű empty-hez 3 sensor van rendelve. (A rotVer nevű emptyhez is, de erről most nem lesz szó.)


A rotHor empty teljes Logic-ja

A képről minden leolvasható, menjünk sorjában. Az Always sensor állandó jelet küld a kimenetén (frekvenciája az "f:" értékkel állítható és egysége 1/50 értékben van meghatározva), amely csatlakozik az OR kontrollers-hez. Ezt a jelet továbbküldi az IPO-nak, melynek egy végrehajtási szerepe van, a Property (Tulajdonság). Nocsak? Mi az a property? ... és hogy jön ide az IPO property? Ez nem más, mint egy tárgyhoz rendelhető tulajdonság. A tulajdonság neve: angle (szög). Ha jobban megfigyelitek a képet, láthatjátok, hogy a baloldalon 4 tulajdonság van az emptyhez rendelve. A nevük sokmindent elárul. Egyenlőre maradjunk az angle nevünél. Értéke 0.00, típusa float (lebegőpontos) - Az IPO pedig egy végtelenített, Z tengely-irányú forgást tartalmaz. Amikor bizonyos feltétel teljesül (nyomod a középső egérgombot és mozgatod az egeret), az Empty forogni kezd Z tengely körül és a kódban megváltozik angle értéke attól függően, hogy horizontálisan merre húzod az egeret. Igen, picit bonyolultnak hangzik, de nem az...


Tulajdonság típusok

Nézzük a következő sensor-t! Mouse - Movement. Ez az érzékelő akkor küld jelet a kimenetén, amikor az egér megmozdul. Ez csatlakozik egy python beállítású kontrollerhez, és elérkeztünk a lényeghez! Ugyanis a kontroller nem küldi tovább a jelet, hanem a neki megmondott kódot futtatja (jelen esetben a rotateH.py-t)


A python-kód


Az empty IPO beállítása

Nos ez a kód minden egérmozdulat során lefut (hihetetlen gyorsan) és a megadott irányban az empty-t elfodítja. (Persze ez így pontosan nem igaz, de itt eltekintenék a kód teljes kivesézésétől) De miért van akkor a harmadik sensor is (Mouse - MiddleButton) a kontrollerhez kötve? Mert a középső egérgombot is használni kell a művelet lefutásához! (Korábban már említettem)

(Megjegyzés: sokszor átolvastam a dokumentum ezen részét, átírtam, bővítettem, kihúztam belőle, és talán ez a közzétett leírás teszi érthetőbbé, hogyan is működik együtt a python-kód a sensor-okkal és actuator-okkal. Mégegyszer hangsúlyozom! Igyekeztem mellőzni a programozást, hiszen ezen "tudás" nélkül is alkalmazható a program.) Kiegészítésként röviden vázolom, hogy a többi py kód, miért felelős.

rotateV - vertikális forgatás

setZoom.py - a tárgyra való ráközelítés, eltávolodás (a kamera Lens értékét használja fel az IPO-ban)

reset_rotation.py - alaphelyzetbe állítja a forgatást

checkLimits.py - ellenőrzi a limitált értékeket, nem lehet teljesen körbeforgatni a kamerát a modell körül vertikálisan. Bár kameranézetben úgy látszik, mintha a modell forogna, de valójában a kamera forog.

showmouse.py - mutatja a kurzort a GE futása alatt (ha a ShowMouse függvény paramétere 0 (nulla) lenne, az egér-kurzor nem látszódna)

A help-Panel készítése

Csupán két dolog van még, amit megemlítenék. Az egyik, a plane-k textúrázásá. Pontosabban a súgó-plane texturázása és beállítása. Tudom, egyértelműnek látszik, hiszen a plane-re ki ne tudna uv-s módszerrel képet helyezni? Igen, ez igaz, de a beállításnál van 1 trükk. Észrevetted, hogy a súgó fade-elve van? A Fade egy olyan megjelenési forma, mely hol eltünteti, hol megjeleníti az adott képet átmenettel. Nézzük, ezt hogyan lehet megvalósítan! Amikor elkészült a plane (Add-Mesh-Plane) hozzákötöttem a kamerához. [Ctrl] - Make Parent. Átváltottam Face Select Mode-ba [], az uv ablakban kitallóztam a képet. Png kiterjesztést használtam, mert PS-ben készítettem a szöveget, de képként mentettem, mert a png alkalmas az alpha-csatorna kezelésére. Miért kellett ilyen "bonyolult" dolgot eszközölni? ...hogy a súgó eltüntethető, megjeleníthető legyen bármikor. Szóval, ott tartunk, hogy kitallóztam a png képet. Még mindig Face Select Mode-ban az [] Texture Face panelen az ObColor és az Alpha kapcsolót bekapcsoltam és nyomtam egy Copy DrawMode-ot. (Az ObColor az objektum szineit használja a vertex-színek helyett, az Alpha pedig az áttetszőséget). Aztán újra az IPO ablakban találtam magam, mert az átmenetet IPO-val oldottam meg. Lássuk képekben, hogy hogyan lehet megvalósítani az előbb leírtakat.


A kiválasztott plane és az üres IPO ablak

Ahhoz, hogy a textura átmenettel jelenjen meg, minden színiformációt (R,G,B + A) 0 (nulla) értékről 1-re kell beállítani. Lássuk hogyan: Válaszd ki a jobb oldali listából (click) a ColR-t. (fehérre vált a felirat). Tartsd nyomva a [Ctlr] billentyűt és kattints az IPO koordináta-rendszerén a 0,0 pontra. Ha jól csináltad, az alábbi képet kell látnod.


A piros színösszetevő beállítása I.

Én úgy döntöttem, hogy 20 frame (képkocka) elég az átmenethez, tehát ha elfogadod, akkor a Ctrl nyomvatartása mellett click a 20 frame vízszintes, de az 1.00 függőleges érték metszéspontjára.


A piros színösszetevő beállítása II.

Most tartsd nyomva a [Shift] billentyűt és válaszd ki a ColG-t. (fehérre vált a felirat, de az előbb létrehozott piros összetevő is látható marad), majd végezd el az előző műveleteket, és ugyanezt készítsd el a ColB és a ColA feliratokkal is. (Megjegyzés: nagyjából ugyanarra a helyre kattints, mert nem sok vizuális jelentősége van, ha a négy összetevő kezdő és végpontjai nem nagyon esnek egybe, de arra is van lehetőség, hogy ezek egy pontból induljanak és egy pontba érkezzenek.) A végeredmény:


A három szín és az alpha görbéje

Nincs más hátra, interakciót kell hozzárendelni. A már előzőekben leírt módon billentyűzet-akciót választottam (H) és az AND kontroller kimenetére a most létrehozott IPO beállítást érvényesítettem a Ping Pong lejátszással.


A Help felirat Logic beállítása

Tehát akkor készen is vagyunk. Megjegyezném azonban, hogy egy sensor vagy kontroller kimenete nem csak a kiválasztott (ugyanolyan nevű) tárgy végrehajtó eleméhez köthető, hanem egy másikkal együtt kiválasztott tárgy actuator-ához is. Érthetőbben: egy tárgy sensora által kiváltott jel, nem csak az adott tárgy végrehajtó elemét indíthatja, hanem egy másik tárgyhoz rendelt actuatros-t is. Munkámban, a fentebb leírt módon készült el a help-panel. Igenám, de ismerőseim körében felvetődött, ha a neten is közzéteszem, nem ártana egy angol nyelvű súgó is. Igazat adtam nekik, így lemásoltam a meglévő plane-t [Shift], lecseréltem rajtuk a texturát (png), és megváltoztattam a hozzájuk rendelt Logic beállításokat. Mutatom képben, úgy érthetőbb.


Az angol és magyar súgó teljes logic beállítása

Egy újdonságot láthatunk a végrehajtó elemek között - nevesítve, a Visible. Működése nagyon egyszerű. Amikor a billentyű által kiváltott jel megérkezik a végrehajtó elemhez, akkor a beállítástól függően az actuator a tárgyat láthatóvá, vagy láthatatlanná teszi. Jól leolvasható a képről, hogy az angol help () előhívásakor a magyar súgót eltünteti és fordítva. Mielőtt negatívan véleményeznéd, hogy "...ez nagyon bonyolult", gondold végig! Fejlesztés közben új, akkor "eszembejutott" műveletet beépíteni elég kockázatos. A játékterv készítése azért hosszú idő, mert ilyenkor kell átgondolni, hogy mi kerüljön be a game-be és mi nem.

Végül, de nem utolsó sorban...

Befejezésül nincs más hátra, mint futtatható állományt készíteni. Erre a File menü Save Runtime parancs szolgál. Egyetlen hátránya ennek a módszernek - én sem ezt alkalmaztam -, hogy a létrejövő fájlt be kell másolni (mozgatni) a telepített Blender útvonalába, hiszen ha nem talál bizonyos összetevőket (Win Verzióban), akkor hibaüzenetet küld az alkalmazás. Egy későbbi dokumentációban foglalkozom majd a dll-ek nélküli exe készítésének lehetőségével, de addig is, sok sok próbálkozással igyekezzetek minél nagyszerűbb játékokat alkotni. Rögös az út, de megéri. Kérdés esetén keress a Fórumban!

Többszöri átolvasás után, ha maradtak volna helyesírási hibák, azokért elnézést kérek!

Szabó István as stewet (2007)