Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 9. březen 2013, 15:57:35 Předmět: |
|
|
Tak malá video ukázka kácení stromů.
Strom i spadený kmen je SpeedTree - "animace" pádu je řízená přes server (nejedná se o běžnou animaci objektu, ale o realtime změnu rotace objektu atd.) - proto je nepřirozená, ale asi jediné řešení jak to udělat na SpeedTree.
(model klády je starý - bude předělán, tak aby korespondoval s daným stromem)
http://youtu.be/wclq5jsjUMs |
|
Návrat nahoru |
|
|
Rexistens
Založen: 29. 07. 2007 Příspěvky: 62 Bydliště: kousek od Zlina a nekdy Brno
|
Zaslal: 9. březen 2013, 16:44:33 Předmět: |
|
|
to ze to pri tom padu tak "posekava" je schvalne, slabym pc, nebo to je to jak rikas, ze to nevypada prirozene? resp se pri tom padu skoro u zmene jakoby zastavia to vyapda hodne blbe...
Kdyby to spadlo bez toho sekani tak je to myslim v pohode... _________________ Osobní stránky a portfolio
Stránky BlueA www.bluea.cz |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 9. březen 2013, 16:51:54 Předmět: |
|
|
Rexistens napsal: |
to ze to pri tom padu tak "posekava" je schvalne, slabym pc, nebo to je to jak rikas, ze to nevypada prirozene? resp se pri tom padu skoro u zmene jakoby zastavia to vyapda hodne blbe...
Kdyby to spadlo bez toho sekani tak je to myslim v pohode... |
To je tím, že se nejedná o animovaný 3D objekt.
Ale o řízenou změnu rotace objektu v reálném čase přes server.
SpeedTree nelze animovat jako běžné modely + potřebuji aby ostatní hráči viděli že padá strom.
Uvidím zdali se podaří udělat statickou verzi stromu a v momentě pádu ji napojit místo ST a pak zase zaměnit za ST. |
|
Návrat nahoru |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 9. březen 2013, 17:10:42 Předmět: |
|
|
To nemůžeš jenom poslat klientům command, že strom začal padat na koncovou rotaci X v čase Y a spadne v čase Z, a potom jenom clientside počítat aktuální transformaci stromu? Serverside to bude hrozný overkill
EDIT: Jinak respekt, je vidět, že na tom opravdu děláš, od první strany to už vypadá daleko lépe (i když práce na tom ještě samozřejmě bude dost a dost). _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 9. březen 2013, 17:20:23 Předmět: |
|
|
if.then napsal: |
To nemůžeš jenom poslat klientům command, že strom začal padat na stranu X v čase Y a spadne v čase Z a potom jenom clientside počítat aktuální transformaci stromu? Serverside to bude hrozný overkill |
Takto jednoduše to nejde s objekty co nejsou postaveny přes engine.
Objekty co vytvoří hráč se replikují přes server do všech klientů (a jakákoliv jejich změna se také replikuje v reálném čase) atd.
Ta "animace" přes server je hodně pracovní - uvidím co jak ještě půjde. |
|
Návrat nahoru |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 9. březen 2013, 18:00:23 Předmět: |
|
|
To upřímně moc nechápu. Ideálně bych si to představoval takto:
Level designer/GM/hráč si řekne, že postaví strom a řekne serveru "postav tu strom". Server požadavek vyhodnotí, vytvoří si v DB strom A a řekne klientům, kterých se to týká, "strom A postaven v tomto čase na téhle lokaci".
O něco později přijde ke stromu hráč X a řekne si, že ho pokácí. Řekne serveru "pokácej strom A". Server požadavek vyhodnotí a řekne klientům, kterých se to týká, "strom A se kácí od tohoto času do tohoto času a spadne sem". V průběhu padání stromů klienti interpolují jeho pozici a po spadnutí ho považují za spadlý.
Chápu správně, že tohle v Hero Engine nejde? _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 9. březen 2013, 18:17:07 Předmět: |
|
|
if.then napsal: |
To upřímně moc nechápu. Ideálně bych si to představoval takto:
Level designer/GM/hráč si řekne, že postaví strom a řekne serveru "postav tu strom". Server požadavek vyhodnotí, vytvoří si v DB strom A a řekne klientům, kterých se to týká, "strom A postaven v tomto čase na téhle lokaci".
O něco později přijde ke stromu hráč X a řekne si, že ho pokácí. Řekne serveru "pokácej strom A". Server požadavek vyhodnotí a řekne klientům, kterých se to týká, "strom A se kácí od tohoto času do tohoto času a spadne sem". V průběhu padání stromů klienti interpolují jeho pozici a po spadnutí ho považují za spadlý.
Chápu správně, že tohle v Hero Engine nejde? |
Jde i nejde:)
To co popisuješ jde a tak to i funguje na běžné operace.
Problém je ale někde jinde a to v Seamless spojení oblastí, kdy je třeba předat tyto data i do dalších oblastí - tady má HE problém a nedokáže to replikovat.
Docházelo tak k tomu, že hráč co stojí v oblasti A a sází strom, tak hráč co stoji v oblasti B nevidí žádnou změnu i když mu byla poslána.
Když pak někdo stojí na hranici oblasti A (pořád je v oblasti B) a vidí hráče jak něco kutí, tak neví co a pokud udělá krok do oblasti A tak zničehonic je před ním strom.
Ve výsledku to znamenalo, že hráč běží po světě a najednou narazí do zdi - kterou neviděl.
Sice by se dala použít replikace pro klienty - ale tam bylo ještě více problému:)
------
Na tu animaci stromu ale mohu použít animaci přes klienta - když jsem se nad tím teď zamyslel - tak pro tuto operaci mohu zavolat všechny klienty a spustit u nich animaci. (objekt ve skutečnosti už leží jako pokáceny, jen se vizuálně spustí animace - pro efekt). A zde není potřeba aby danou animaci viděl někdo z jiné oblasti - ten už uvidí pokáceny strom díky server objektu.
-----
Před pár dny jsem ale změnil fungování celého smyslu světa a Seamless spojení + design světa tak abych předvídal a mohl obejít nedostatky enginu -> takže většinu věcí budu replikovat na klienty. |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 9. březen 2013, 18:32:01 Předmět: |
|
|
BTW:
Animace přes klienta je již aplikovaná - pro tento typ úkonu je to v pohodě a nic to nenarušuje;) - díky za popíchnutí. |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 10. březen 2013, 20:11:45 Předmět: |
|
|
Tak jsem to ještě trošku vyladil.
Animaci spouštím jen pro hráče, kteří jsou poblíž (abych nezatěžoval každého klienta co je v dané oblasti).
Pokud by stromy nebyli SpeedTree, tak by to vše šlo udělat jednoduší cestou přes replikaci Animovaného assetu.
Ale tak jako tak, jedná se jen o efekt - objekt ve skutečnosti už dávno leží na zemi jako pokácený (efekt je jen pro blízké okolí a hlavně samotného hráče co kácí strom;) )
Pro zájemce ukázka kódu:
SERVER (část kódu při vygenerování kmene stromu po skácení)
kód: |
InstanceSP as NodeRef of Class GR2Instance = $EDIT._AddInstance(AssetSP,"GR2Instance","game")
InstanceSP.NI_lookupListIndexedByStringOfString = dataList//predame DB data
//build help object
$EDIT._EditCMDSetInstanceProperties(SYSTEM.REMOTE.CLIENT, "", InstanceSP, fieldsSP, valuesSP, rawSP )
//GLOM HELP OBJ
GlomClass("NI_BUILDWORDOBJECT",InstanceSP)//napojime server tridu pro onmouse efekt
//set parent instance
InstanceSPClass as NodeRef of Class NI_buildWordObject = InstanceSP
InstanceSPClass.NI_parentNode = Instance
//EFEKT KACENI
when akce
is "kacet"
//CALL CLIENT ANIM EFFECT
players as List of ID = GetPlayersInArea(GetAreaNumber(),GetInstanceNumber())
call client players %NI_ITEM.runAnimEffectKaceniSPGom(InstanceSP, Instance)
.
.
|
SERVER zavolá každého online klienta v dané oblasti přes CLIENT prototyp NI_ITEM
kód: |
remote method runAnimEffectKaceniSPGom(object as NodeRef, parentNode as NodeRef)
objectC as NodeRef of Class SpeedTreeNode = parentNode
Player as NodeRef of Class CharacterNode = GetPlayerCharacterNode()
ObjectPos as Vector3
PlayerPos as Vector3
Vzdalenost as Float = DistanceSquaredBetweenNodes(Object,Player)
if (Vzdalenost <= 100)
//Spoustime klient animaci
GlomClass("NI_dynamicFlora",objectC)//dynamic flora client class
//run dynamic flora
StartNode as NodeRef of Class NI_dynamicFlora = objectC
StartNode.padaStromStart()
.
.
|
Pokud je hráč v požadovaném dosahu tak se spustí proces animace
kód: |
method padaStromStart()
Object as NodeRef of Class SpeedTreeNode = me
ObjectRot as Vector3 = GetNodeRotation(Object)
//Spoustime klient animaci
ObjectRot.x = 0//narovnani objektu
SetNodeRotation(Object,ObjectRot)
//
me.NI_string = "kacet"
me.timeIndex = (SYSTEM.TIME.NOW+00:00:10)
me.NI_timeInterval = 00:00:00.06
me.NI_timeIndex02 = SYSTEM.TIME.NOW
//
RegisterForPerFrameMethodCallback(me)
.
method onFrameUpdate(elapsed as TimeInterval)
when me.NI_string
is "kacet"
Object as NodeRef of Class SpeedTreeNode = me
AnimObjectRot as Vector3 = GetNodeRotation(Object)
//
EndTime as DateTime = me.timeIndex
Interval as TimeInterval = me.NI_timeInterval
IntervalTime as DateTime = (me.NI_timeIndex02+Interval)
//
if(EndTime >= SYSTEM.TIME.NOW )
if(SYSTEM.TIME.NOW > IntervalTime)
//set new interval end
me.NI_timeIndex02 = SYSTEM.TIME.NOW
//anim
if(AnimObjectRot.x > -5)
AnimObjectRot.x = AnimObjectRot.x-0.5
else if(AnimObjectRot.x > -10)
AnimObjectRot.x = AnimObjectRot.x-1
else if (AnimObjectRot.x > -45)
AnimObjectRot.x = AnimObjectRot.x-5
else
AnimObjectRot.x = AnimObjectRot.x-10
.
padEnd as Float = -90
if(AnimObjectRot.x <= padEnd)
AnimObjectRot.x = -90
SetNodeRotation(Object,AnimObjectRot)
me.NI_string = "kacet_end"
me.timeIndex = (SYSTEM.TIME.NOW+00:00:10)
me.NI_timeInterval = 00:00:00.05
me.NI_timeIndex02 = SYSTEM.TIME.NOW
else
SetNodeRotation(Object,AnimObjectRot)
.
//
.
else
AnimObjectRot.x = -90
SetNodeRotation(Object,AnimObjectRot)
UnRegisterForPerFrameMethodCallback( me )
.
.
is "kacet_end"
Object as NodeRef of Class SpeedTreeNode = me
AnimObjectRot as Vector3 = GetNodeRotation(Object)
//
EndTime as DateTime = me.timeIndex
Interval as TimeInterval = me.NI_timeInterval
IntervalTime as DateTime = (me.NI_timeIndex02+Interval)
if(EndTime >= SYSTEM.TIME.NOW )
if(SYSTEM.TIME.NOW > IntervalTime)
//set new interval end
me.NI_timeIndex02 = SYSTEM.TIME.NOW
//anim end effect
if(AnimObjectRot.x = -90)
AnimObjectRot.x = AnimObjectRot.x+2//88
else
AnimObjectRot.x = AnimObjectRot.x-90.1
.
padEnd as Float = -90
if(AnimObjectRot.x <= padEnd)
AnimObjectRot.x = -90
SetNodeRotation(Object,AnimObjectRot)
UnRegisterForPerFrameMethodCallback( me )
else
SetNodeRotation(Object,AnimObjectRot)
.
.
else
AnimObjectRot.x = -90
SetNodeRotation(Object,AnimObjectRot)
UnRegisterForPerFrameMethodCallback( me )
.
.
default
UnRegisterForPerFrameMethodCallback( me )
.
.
.
|
|
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 11. březen 2013, 20:02:42 Předmět: |
|
|
Vylepšená verze kácení stromů (borovice a jabloň).
Stromy již generují korektní klády.
+ byla aplikovaná váha objektů, a první jazykové mutace atd.
http://youtu.be/X3OjkFC_F3w |
|
Návrat nahoru |
|
|
Dlaha
Založen: 30. 07. 2007 Příspěvky: 598 Bydliště: Olomouc
|
Zaslal: 12. březen 2013, 08:56:21 Předmět: |
|
|
Připomněl jsi mi Komando, kde Schwarzeneger na začátku tahá na rameni obrovskou kládu stromu, jakoby se nic nedělo.
Ale oproti němu je ta tvoje slečna mnohem větší frajer, koukám _________________ Other Inside
Greenlitnuto! |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 12. březen 2013, 09:05:13 Předmět: |
|
|
Dlaha napsal: |
Připomněl jsi mi Komando, kde Schwarzeneger na začátku tahá na rameni obrovskou kládu stromu, jakoby se nic nedělo.
Ale oproti němu je ta tvoje slečna mnohem větší frajer, koukám |
No dle váhy to do báglu dá
Ale zvažuji ještě zapojit objem - nebo určit zdali objekt lze dát do báglu nebo ne.
Ve výsledku unese postava 3 malé klády z jabloně (což není moc) a max jednu z borovice.
Bylo by asi pěkné kdyby je měla na zádech nebo tak nějak, ale to je ještě daleko...
Musím zvážit pro a proti. Nechci jít cestou kde má člověk v inventáři 100ks prken:) Ale také zase nechci aby to bylo až moc přehnané a ovlivňovalo moc hratelnost (nosit půl dne klády do tábora abych pak udělal pár prken není taky moc zábavné právě . |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1552
|
Zaslal: 12. březen 2013, 09:26:25 Předmět: |
|
|
V reálu by člověk použil koně nebo něco. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 12. březen 2013, 09:35:38 Předmět: |
|
|
frca napsal: |
V reálu by člověk použil koně nebo něco. |
Tj. koně , vozík apod. (to si bude muset ale prvně vyrobit a ochočit)
Ale musím počítat s tím že postava začíná skoro bez ničeho ve světě který nezná a je plný nebezpečí - má jen holé ruce + hitech věcičku (ta by mohla pár věcí vyřešit, ale to nechci zatím moc rozvádět - ještě to nemá 100% logiku pro všechny situace). |
|
Návrat nahoru |
|
|
Dlaha
Založen: 30. 07. 2007 Příspěvky: 598 Bydliště: Olomouc
|
Zaslal: 12. březen 2013, 10:08:23 Předmět: |
|
|
Jestli je ta high-tech věcička dámská kabelka, tak tam by se i ten strom klidně ztratil
Podle mě si ze začátku bude muset hráč udělat tábor u zdrojů surovin, pokácí strom a hned vedle lesa si postaví třeba chatrč. Až se trochu posune v technologii, postaví si vozík, ochočí si mezka, tak bude moci přepravovat suroviny na větší vzdálenosti. _________________ Other Inside
Greenlitnuto! |
|
Návrat nahoru |
|
|
|