Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Vojtas
Založen: 10. 08. 2012 Příspěvky: 11 Bydliště: Chrudim
|
Zaslal: 2. prosinec 2013, 19:31:56 Předmět: Unity - problém pro pokročilé |
|
|
Dobrý den!
Omlouvám se, že sem píši pravděpodobně článek nevhodný. Ale po hodinách a hodinách tápání jsem nesvedl rozhodnouti lépe.
Většina z vás mě tu asi nezná, jelikož zde nejsem aktivní, tedy ozývám se ve stavu drobné nouze... Pracuji na nové hře (sám) a nejsem pokročilý programátor, i když plošinovku se vším okolo vytvořit v Unity, kde jsem relativně nový, jakž takž zvládnu. Avšak narazil jsem na problém, ve kterém nepříjemně plavu...
Už jsem o tomto problému psal na VCH i na oficiální fórum Unity (http://forum.unity3d.com/threads/213537-Quite-difficult-mesh-deformation), kde sice odpověď jakž takž našli, ale počítají s mými nezměrnými zkušenostmi. Které postrádám. Snažil jsem se do problému ponořit s grácií, ale on mě zase s grácií vyplivl na břeh... Proto se ptám, je tu někdo, kdo by mi mohl pomoci?
Potřebuji docílit mechaniky napodobující ohýbání papíru... Ideálně přes sprity v nové verzi, pravděpodobně však bude jednodušší se uchýlit k řešení pomocí meshů... V diskusi mi poradili překrývat dva meshe přes sebe a zneviditelňovat jejich části, byť bez možnosti více ohybů... Světlo světa spatřilo toto demo: https://dl.dropboxusercontent.com/u/157182894/Builds/test/MeshFold/MeshFold.html
A já si po dalším bádání pořád neuvědomuji, jak kýženého efektu docílit. Je mi trapné zahlcovat tyhlety internety spamem, ale zoufalost mi trochu káže...
Tedy, našel by se kdosi ochoten mě zasvětit do problému? Protože já ani tak nepotřebuji výsledek mít, jako spíše mu opravdu porozumět...
Najde-li se jakýkoli ochotník, nechť se, prosím, ozve tu, či mě kontaktuje na voj.koci@seznam.cz...
Děkuji za jakoukoliv odezvu a přeji hezký den!
PS: Na oplátku mohu poskytnout nějakou drobnou grafickou službu, i když nejsem nikterak kvalitní čmárač... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. prosinec 2013, 10:31:26 Předmět: |
|
|
A co budeš skládat? Jde o to, že přeložit mesh nebude takový problém, jako ho zase rozložit - jako třeba když skládáš šipku z papíru. To by byl už větší mazec.
Odkazované diskuze jsem nečetl, ale to demo funguje asi celkem jednoduše. Kliknutím na rožek papíru označíš bod A, tažením vznikne bod B (pozice kurzoru myši). Znormalizovaný vektor B-A je normála toho ohybu. Přímka ohybu prochází bodem (A+B) / 2, tj. bod na polovině cesty mezi A a B. Přímka ohybu má směr (-AB.y, AB.x)..tj normála otočená o 90 stupňů.
Samotný ohyb je asi taky celkem vpohodě: jednou vykreslí sprajt s nulovou alfovanou "nad" přímkou ohybu a potom ho kreslí znovu, ale otočenej a posunutej podle ohybu (nechce se mi vymejšlet teď jak přesně) a s nulovou alfou "pod" přímkou. Pojmy "nad" a "pod" jsou zavádějící, ale souvisí s obecnou rovnicí přímky. Každopádně tu alfu lze snadno udělat v shaderu, abys nemusel nijak modifikovat pixely sprajtu.
Je ale jasný, že to má svoje omezení. Jak si psal, těžko uděláš více ohybů. A už vůbec ne nějaký složitý chování papríu, že bys z toho něco skládal. To by tam asi musela bejt geometrie a možná ještě něco navíc. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Vojtas
Založen: 10. 08. 2012 Příspěvky: 11 Bydliště: Chrudim
|
Zaslal: 3. prosinec 2013, 17:38:46 Předmět: |
|
|
Děkuji za reakci... V tomto postupu mám docela jasno, to chápu a s tím jsem problém na vymyšlení neměl. Mám ale problém se samotným převedením geometrie do kódu.
Co se týče více ohybů, ty bych docela potřeboval, ale pro začátek bych se bez nich mohl obejít...
Vše potřebuji do nové hry, kterou tvořím, nerad bych rozebíral detaily... Nicméně vše bude 2D, což by mělo být jednodušší. O dimenzi jednodušší
Také mi jeden sympatický pán na VCH radil deformovat body meshe, čímž by se dalo docílit i vícenásobných ohybů... Ale první řešení je mi mnohem sympatičtější, i když jeden ohyb je trochu problém..
Jak ale říkám na tu geometrii ohybu jsme přišel sám, jen vše nesvedu převést do čistého a, pokud možno, na jakýkoliv sprite použitelného kódu... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. prosinec 2013, 18:01:02 Předmět: |
|
|
A co ti na tom nejde, konkrétně? _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Vojtas
Založen: 10. 08. 2012 Příspěvky: 11 Bydliště: Chrudim
|
Zaslal: 3. prosinec 2013, 19:12:11 Předmět: |
|
|
Vím, bude to znít trapně, ale nějak netuším, jak zajistit, aby se zneviditelnila správná část obou meshů. Dokážu jakž takž definovat linii ohybu vzniklou tažením myší, další detaily (pevná základna, případné omezení pohybu atp. bych snad také po nějakém čase dal do kupy.
A tak to mám pořád. Vím třeba, jak "vytáhnout" z obecné rovnice přímky většinu informací, ale netuším, jak vše definovat kódem... Bohužel, jsem jaksi nucen při těchto pokročilejších problémech hledat vždy řešení na Googlu, v tomto případě jsem moc řešení neobjevil. Jen pomocí projektorů, ale to souviselo s trochu jiným problémem...
Každopádně, jak říkám, budu rád za jakoukoliv pomoc... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. prosinec 2013, 10:31:14 Předmět: |
|
|
Vojtas napsal: |
Bohužel, jsem jaksi nucen při těchto pokročilejších problémech hledat vždy řešení na Googlu |
Ale nejsi, existujou i knížky a hlava :-).
Zneviditelnění části spritu podle nějaké linie uděláš třeba tak, že napíšeš pixel shader, kterýmu předáš tu rovnici přímky (tzn. 3 čísla). Někde v tabulkách (nebo na tom googlu) se podiv, jak zjistit vzdálenost bodu od přímky. Je to velice jednoduchý test. Vrací to i znaménko, podle kterýho určíš, jestli ten bod zprůhledint, nebo nechat být. A ten zjištovaný bod, to je samozřejmě pozice pixelu.
Pokud neumíš psát shadery, mohl bys to asi dobastlit přes nějaký maskování, ale radši shader. Tak tedy, pokud je neumíš, tak si o tom něco najdi. Je to jednoduché a bude se ti to hodit. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Vojtas
Založen: 10. 08. 2012 Příspěvky: 11 Bydliště: Chrudim
|
Zaslal: 4. prosinec 2013, 20:54:47 Předmět: |
|
|
Dobrá, děkuji za doporučení, pokusím se najít a hlavně pochopit... Takže moc děkuji za odezvu... A jen ještě jedna drobná otázka, kdybych se chtěl snažit o vícenásobný ohyb, pravděpodobně je nejjednodušší použití meshů, což?
Výše zmíněné řešení rozřířit nelze, předpokládám? I když mi připadá zvláštní, že by nešel přidat další sprite a zneviditelnit více jeho částí...
Ale i tak moc děkuji za jakoukoliv odezvu... Najdu-li řešení, dovolím si ho sem napsat, kdyby někdo řešil podobný problém...
EDIT: Zkoušel jsem ještě k večeru experimentovat a pomocí všehomožného jsem dal do kupy toto:
kód: |
using UnityEngine;
using System.Collections;
public class Deform : MonoBehaviour {
public Transform obj2;
Vector3 clickedPos;
Vector3 dir;
Vector3 midLine;
Vector3 perpendicular;
Matrix4x4 m;
Vector3 currentMouse;
void Start () {
//obj2 = Instantiate(this, new Vector3(this.transform.x, this.transform.y-100, 0), Quaternion.identity);
}
void Update () {
if(Input.GetButtonDown("Bend")) {
clickedPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
if(Input.GetButton("Bend")){
currentMouse = Camera.main.ScreenToWorldPoint(Input.mousePosition);
dir = currentMouse - clickedPos;
midLine = ( clickedPos + currentMouse ) / 2;
perpendicular = new Vector3( dir.y, -dir.x, 0 );
}
Debug.DrawLine (perpendicular,perpendicular*5);
obj2.position = ( Vector3.Project( -midLine, perpendicular ) + midLine ) * 2 + Vector3.forward * -0.1f;
obj2.rotation = Quaternion.LookRotation( Vector3.forward, clickedPos - obj2.position ) * Quaternion.LookRotation( Vector3.forward, currentMouse);
}
} |
Nevím, řekl bych, že jsem snad na relativně správné cestě k samotné změně pozice a rotace objektu, který je na vrchu. Pravda je, že nic moc nefunguje, vše reaguje jen při prvním kliknutí... Asi je tenhle kód neuvěřitelná prasárna, za což se moc omlouvám, ale myslíte, že byste mohli případně vypíchnout očividné chyby? Snažil jsem se vše jakž takž uchopit, ale očividně jsou moje schopnosti dost nepřesvědčivé...
Díky moc za ochotu... |
|
Návrat nahoru |
|
|
Vojtas
Založen: 10. 08. 2012 Příspěvky: 11 Bydliště: Chrudim
|
Zaslal: 7. prosinec 2013, 13:19:17 Předmět: |
|
|
Tak, základní pohyb mám jakž takž hotov, vše funguje relativně spolehlivě... Jen ani na Googlu nejsem schopen dohledat, jak počítat v shaderu vzdálenost každého pixelu od přímky. "Poslal" jsem do shaderu souřadnice vektoru, který přímku udává, ale nejsem jaksi schopen zajistit další zpracování. Myslíte, že byste mě kdokoliv mohl v tomto bodě lehce popostrčit? Byl bych vděčný za každou pomoc.
Moc se omlouvám za masivní otravování vašich adventních dnů. A předem děkuji za jakoukoliv pomoc... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 9. prosinec 2013, 11:32:17 Předmět: |
|
|
Proč na google? Vzdálenost bodu od přímky se učí na střední škole tuším ve třetím ročníku. Je to "obecná rovnice přímky".
Možná by mohl trochu zlobit výpočet pozice pixelu (kvůli interpolaci), ale to by se projevilo nějakou nepřesností a potom bysme se o tom mohli pobavit. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Vojtas
Založen: 10. 08. 2012 Příspěvky: 11 Bydliště: Chrudim
|
Zaslal: 12. prosinec 2013, 20:20:05 Předmět: |
|
|
Dobrá, děkuji za reakci. Právě jsem ve třeťáku a toto učivo nás teprve čeká. Nicméně jsem se učil něco málo dopředu a už se mi povedlo zneviditelnit část nad přímkou, bohužel ne zcela nad zamýšlenou... S kýženou přímkou je sice rovnoběžná, ale neprochází bodem (zde nazvaný midLine)... Pravděpodobně tedy nesedí argument c v obecné rovnici přímky, přitom jej mám definovaný podle vzorce, myslím:
kód: |
renderer.material.SetFloat("_a", dir.x);
renderer.material.SetFloat("_b", dir.y);
renderer.material.SetFloat("_c", -dir.x * midLine.x -dir.y * midLine.y); |
V shaderu pak mám:
kód: |
clip (_a*IN.uv_MainTex.x + _b*IN.uv_MainTex.y + _c); |
Hodně s tím experimentuji, vcelku bez výsledku, ale snad se někdy k vytouženému výsledku dohrabu. Nicméně, kdyby někdo tušil, kde jsem udělal chybu, budu rád za poučení...
Opět se omlouvám za svou očividnou stupiditu a přeji hezký den... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 13. prosinec 2013, 09:56:53 Předmět: |
|
|
Místo "dir" tam má být "normal" - tedy kolmý vektor (-dir.y, dir.x). _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Vojtas
Založen: 10. 08. 2012 Příspěvky: 11 Bydliště: Chrudim
|
Zaslal: 13. prosinec 2013, 20:34:12 Předmět: |
|
|
Myslím, že tady by problém být neměl. Vektor dir je již kolmý na jiný vektor. Výsledná chybná přímka je rovnoběžná s onou vytouženou, jen je ve špatné vzdálenosti, navíc nejde o konstantní vzdálenost obou přímek...
Netuším, kde by mohla být chyba, pokusím se najít řešení... Asi mám něco špatně s výpočtem argumentu "_c".
Děkuji za odezvu! |
|
Návrat nahoru |
|
|
|