Pravidla Ucet
Nepřihlášen

Článek

Menu

Game engine v blenderu
Napsal: pelpet
Přidáno: 02.08. 2010

Umíte už něco v blenderu, nebaví vás hledat tutoriály na internetu psané podivnými jazyky a chcete se naučit vyrábět 3d hry v blenderu? Tak čtěte víc! ;-)

FPS človíček

Pokud jste v blenderu začátečník a nemáte na to, prosím Vás, až mi tu budete psát že to nejde, nefunguje atd. tak si dobře rozmyslete, jestli za to může můj návod, nebo Vaše začátečnické chyby!!! děkuji.
Takže, pokud jste již trochu pokročilejší, tak urá do toho. smažte kostku co se na začátku objeví a dejte místo ní plane - plocha /čtverec/:
stiskněte TAB přepne vás to do editačního módu. pomocí klávesy A označte všechny 4 vertexy a SHIFT+D je pomnožte. Stiskněte při tom kolečko /netočte, mačkejte! / aby se vám posunoval jen po jedné ose. nějak takhle by to mělo vypadat:
Klávesou E extrudujte, šipkama /ne klávesy, ty na display/ posunujte. Vytvořte toto:
dejte si pohled z vrchu klávesou 7 na numerické klávesnici. označte vertexy jako na obrázku a smažte je:
poté vždy vyberte několik vertexů a spojte je klávesou F
vyberte vždy maximálně 4 vertexy, minimálně 2, víc nebo míň by blender nepochopil! víc jich jde spojit funkcí shift+F ale tu nedoporučuji v tomto případě! udělala by nám v tom zmatek!!!
extrudujte, zvětšujte, posunujte, až do této podoby /screenshot je dělaný v objektovém módu.../:
Panáček je sice škaredý, ale až se otexturuje, bude hezčí... pokud si chcete udělat svého, udělejte, ale já použiju tohodle. pro nše účely si myslím postačí. není dobré začínat s obří hromadou vertexů! Nyní si otevřeme action editor a uděláme panákovi kostru: Klikněte do čáry mezi headerama a vyberte split area. rozpulte horní okno a potvrďte levým myšítkem :) od teď LMB /left mouse button/:
v tomto okně otevřte action editor:
dejte add new a pojmenujte si to "walk" použijte toto, protože s tím budeme pracovat, ať v tom není binec!
zasuňte action editor, zatím ho nepotřebujeme. Ale nezavírejte ho ještě!! Po té vložte armaturu:
Armatura je úžasná věc, která nám udělá polovinu práce. extruduje se a zvětšuje stejně jako vše ostatní. to je E pro extrudování a S na zvětšování. přesunuje se polohovýmí šipkami. opět jak u ostatních oběktů:
Udělejte ji celou a přidělíme jí panákovi.
NEJDŘÍVE VYBERTE PANÁKA, POTÉ ARMATURU!!!
postup vybírání dodržte, jinak to nebude fungovat!! až obojí vyberete, stiskněte ctrl+P:
po odkliknutí vyskočí další okno kde vyberte:
teď začíná tepprve piplačka! až to doděláme, bude to pohodka :) tak do toho: vyberte armaturu a přepněte se do pose módu:
vyberte jednu část kostry, stiskněte shift a vyberte panáka. přepněte se do weight paint módu, nastavte weight na nulu a přebarvěte celého panáka na modro. poté zvolte plný weight /1/ a nabarvěte jen tu část, kterou má část armatury ovládat.
Proč mám nejdříve barvit na nulu a pak zas na plno? odpověď je jasná! blender automaticky nastáví weight na různé hodnoty po celém těle. takže když má panák pohnout třeba rukou, začne hýbat půlkou těla. proto tahle piplačka
takto to MUSÍME udělat s každou částí armatury! kdo si jich tam naflákal moc, ten má fakt smůlu :D
nezapomínejte ukládat. ať to neděláme znovu!! nyní opět otevřeme action editor. označíme všechny části armatury, stiskneme I a zvolíme LocRotScale:
v action editoru se nám konečně něco objeví. teď jdeme adnimovat: Vybereme mu jednu nohu /spodní část/, v action editoru se posuneme na frame 5 a pomocí N nastavíme polohu. uložíme nastavení pomocí I > LocRotScale. nějak takto:
to samé udělejte i s druhou nohou, akorát místo 50 zadejte -50! udělejte to ve stejném frame! ať chodí přirozeně! Nakonec rozpohybujte i ruce. celá animace bude mít 19 framů: 1.noha: dopředu, zpět, dozadu, zpět 2.noha: dozadu, zpět, dopředu, zpět 1.ruka: dopředu, zpět, dozadu, zpět 2.ruka: dopředu, zpět, dozadu, zpět každý krok bude po 5-ti framech, kromě posledního. ten bude mít jen 4, aby animace navazovala při previnutí. Pojďmě dál: přepneme se do logiky (omg to zas bude xD) a nastavíme fyziku (vybereme si armaturu, ne panáka!!):
ještě zvolíme panáka a tomu nastavte no collision místo dynamic a jdeme od něj! A nyní jdeme programovat FPS a pohyb: u senzorů controllerů a actuatorů dejte add.
v prvním okýnku zvolte keyboard a klikněte na políčko key. stiskněte šipu nahoru. spojte okýnka. prostřední necháme být a teď k poslednímu: v posledním boxu jsou 3 políčka označená loc. vyzkoušejte všechny 3 a vždycky stiskněte P. tím se vám spustí hra. zmáčkněte šipku dopředu. když půjde dopředu, máme vyhráno! pokud ne, vyzkoušejte jiné /vždy zadejte jen jedno. ostatní ať maní nulu!/. Tak, teď uděláme znovu to samé. dáme add akorát zvolíme šipku dolů. u posledního boxu zadejte do stejného políka stejniu hodnotu, akorát zápornou. tím máme pohyb dopředu a dozadu. Taktéž uděláme šipky doprava a doleva. nepoužijeme však kolonky loc, ale rot /rotace, ne lokace/. tlačítka s nápisem L vedle políčak nechte tak!!!!!!!!!!! Teď k animaci: Udělejte další actuator a místo motion zvolte action. Zvolte druh loop end a do kolonky AC: napište "walk". start dejte na 1 a end na 19! tento actator spojte s controllerem od sipky nahoru, doprava, doleva i od sipky dolů. Povedou do něj tedy 4 "dráty". Nyní když si spustíte hru, bude panák hýbat nohama i rukama. /pokud budete chodit/
uděláme ještě FPS, skok a mapu: Nastavte kameru tak, aby se dívala na panáka zezadu.
vyberte kameru, poté armaturu a pak stiskněte ctrl+P. potvrďte vytvoření "parent". nyní si otevřte text editor /stejně jako jsme otevírali action editor/ a vložte do něj toto:
# define main program def main(): # set default values Sensitivity = 0.0005 Invert = 1 Capped = False # import Rasterizer import Rasterizer # get controller controller = GameLogic.getCurrentController() # get the object this script is attached to obj = controller.getOwner() # get the size of the game screen gameScreen = gameWindow(Rasterizer) # get mouse movement move = mouseMove(gameScreen, controller, obj) # change mouse sensitivity? sensitivity = mouseSen(Sensitivity, obj) # invert mouse pitch? invert = mousePitch(Invert, obj) # upDown mouse capped? capped = mouseCap(Capped, move, invert, obj) # use mouse look useMouseLook(controller, capped, move, invert, sensitivity) # Center mouse in game window centerCursor(controller, gameScreen, Rasterizer) ##################################################### # define game window def gameWindow(Rasterizer): # get width and height of game window width = Rasterizer.getWindowWidth() height = Rasterizer.getWindowHeight() return (width, height) ####################################################### # define mouse movement function def mouseMove(gameScreen, controller, obj): # Get sensor named MouseLook mouse = controller.getSensor("MouseLook") # extract width and height from gameScreen width = gameScreen[0] height = gameScreen[1] # distance moved from screen center x = width/2 - mouse.getXPosition() y = height/2 - mouse.getYPosition() # initialize mouse so it doesn't jerk first time if hasattr(obj, 'mouseInit') == False: obj.mouseInit = True x = 0 y = 0 ######### stops drifting on mac osx # if sensor is deactivated don't move if mouse.isPositive() == False: x = 0 y = 0 ######### -- contributed by Pelle Johnsen # return mouse movement return (x, y) ###################################################### # define Mouse Sensitivity def mouseSen(sensitivity, obj): # check so see if property named Adjust was added if hasattr(obj, 'Adjust') == True: # Don't want Negative values if obj.Adjust < 0.0: obj.Adjust = 0.0 # adjust the sensitivity sensitivity = obj.Adjust * sensitivity # return sensitivity return sensitivity ######################################################### # define Invert mouse pitch def mousePitch(invert, obj): # check to see if property named Invert was added if hasattr(obj, 'Invert') == True: # pitch to be inverted? if obj.Invert == True: invert = -1 else: invert = 1 # return mouse pitch return invert ##################################################### # define Cap vertical mouselook def mouseCap(capped, move, invert, obj): # check to see if property named Cap was added if hasattr(obj, 'Cap') == True: # import mathutils import Mathutils # limit cap to 0 - 180 degrees if obj.Cap > 180: obj.Cap = 180 if obj.Cap < 0: obj.Cap = 0 # get the orientation of the camera to world axis camOrient = obj.orientation # get camera Z axis vector camZ = [camOrient[0][2], camOrient[1][2], camOrient[2][2]] # create camera z axis vector vec1 = Mathutils.Vector(camZ) # get camera parent camParent = obj.parent # get parent orientation to world axis parentOrient = camParent.orientation # get parent z axis vector parentZ = [parentOrient[0][2], parentOrient[1][2], parentOrient[2][2]] # create parent z axis vector vec2 = Mathutils.Vector(parentZ) # find angle between two angle = Mathutils.AngleBetweenVecs(vec1, vec2) # get amount to limit mouselook capAngle = obj.Cap # get mouse up down movement moveY = move[1] * invert # check capped angle against against camera z-axis and mouse y movement if (angle > (90 + capAngle/2) and moveY > 0) or (angle < (90 - capAngle/2) and moveY < 0) == True: # no movement capped = True # return capped return capped ############################################### # define useMouseLook def useMouseLook(controller, capped, move, invert, sensitivity): # get up/down movement if capped == True: upDown = 0 else: upDown = move[1] * sensitivity * invert # get left/right movement leftRight = move[0] * sensitivity * invert # Get the actuators act_LeftRight = controller.getActuator("LeftRight") act_UpDown = controller.getActuator("UpDown") # set the values act_LeftRight.setDRot( 0.0, 0.0, leftRight, False) act_UpDown.setDRot(upDown, 0.0, 0.0, True) # Use the actuators GameLogic.addActiveActuator(act_LeftRight, True) GameLogic.addActiveActuator(act_UpDown, True) ############################################# # define center mouse cursor def centerCursor(controller, gameScreen, Rasterizer): # Get sensor named MouseLook mouse = controller.getSensor("MouseLook") # extract width and height from gameScreen width = gameScreen[0] height = gameScreen[1] # get cursor position x = mouse.getXPosition() y = mouse.getYPosition() #if cursor needs to be centered if x != width/2 or y != height/2: # Center mouse in game window Rasterizer.setMousePosition(width/2, height/2) # already centered. Turn off actuators else: # Get the actuators act_LeftRight = controller.getActuator("LeftRight") act_UpDown = controller.getActuator("UpDown") # turn off the actuators GameLogic.addActiveActuator(act_LeftRight, False) GameLogic.addActiveActuator(act_UpDown, False) ############################################## # Run program main()
Buď dejte add new nebo si otevřte již vytvožený "text" a poté to přejmenujte na "MouseLook.py" NESMÍ se to jmenovat jinak!!! Označte si kameru a v logice dejte všude add. vyberte mouse a typ dejte jako movement. pospojujte. Nastavte controller na Python, ne AND!! pod to do kolonky script napiště "MouseLook.py". actuator pojmenujte jako "UpDown". opět to MUSÍ být takto!!! nyní si opět označte armaturu, vložte nový actuator pojmenujte ho "LeftRight" a teď: 1) vyberte armaturu, stiskněte shift a vyberte i kameru 2) otevřte si logiku 3) spojte controller od kamery s actuatorem od armatury 4) vyberte kameru, v logice dejte add property, pojmenujte ji "Adjust" typ dejte float a nastavte tam jakou chcete hodnotu. toto je citlivost myši. já jsem použil číslo 4. nyní by měl fungovat moselook /pohled ovládaný myší/. Nyní skok: do armatury přidejte actuator, controller a sensor. sensor dejte jako keyboard>space. hodnotu F nastavte na 10. spojte s controllerem a s actatorem. v actuatoru nastavte loc Z /ta nejvíc v pravo/ na 20. tím je to hotovo Mapa: Mapu si může udělat jakou chcete. Umí to skákat, takže třeba nějaké krabice atd. V dalším dílu napíšu něco o texturování a vymakávání vzhledu. ;-) snad sem Vám pomohl! dotazy pište do komentářů, odpovím!
Ostatní díly seriálu:
Klíčová slova: game_engine , blender , logic_bricks
 

Komentáře:

Napsal: Luko8525
Přidáno: 03.11. 2010

vyborne

Trvalý odkaz

Napsal: pelpet
Přidáno: 17.08. 2010

Tak to sorry! já jsem to nečetl uplně do podrobna... četl sem, že je to komunita vývojářů her. Toto je hra, akorát není v GM. ale FPS takhle dobrej jak v blenderu v GM prostě nedáš... ty modely v gm nikdy nedoděláš takhle k dokonalosti

Trvalý odkaz

Napsal: Firejs
Přidáno: 03.08. 2010

Tak něco takovýho jsem před časem scháněl, teď už to sice nepotřebuju, ale někdy se může hodit...

Pravda, není to GM a proto ti doporučuji (jestli budeš pokračovat) to publikovat na krevetě ;)

Trvalý odkaz

Napsal: DDL Blue
Přidáno: 03.08. 2010

Počkej, ty # sou na python? Když tady dáš # n, tak to odentruje. V článku se to neukazuje. O to mi de. A ano, je pravda, že se to netýhká GM :-/

Trvalý odkaz

Napsal: Rion
Přidáno: 03.08. 2010

Prvé upozornenie, keby si čítal pravidlá tak by si to vedel: "Články se smějí týkat pouze tvorbě her v GM"

Trvalý odkaz

Napsal: pelpet
Přidáno: 03.08. 2010

to by python nepochopil....

Trvalý odkaz

Napsal: DDL Blue
Přidáno: 02.08. 2010

Hmm chtělo by to trochu vysvětlit ten kód ;) A na enterování v tom kódu používej # n, a ne #

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010