Page 1 of 1

Area marking?

Posted: 04 Jan 2014, 13:33
by DonSonz
Nogen der har erfaring med hvordan man når frem til den effekt der bl.a. benyttes i Rome Total War (se de røde markeringer i vedhæftede billede), til markering af områder i landskabet?

Jeg formoder at der benyttes Bezier Curves (B-Splines), men er på ingen måde sikker på dette. Og hvis det er, hvordan opnås så areafill inden for det markerede område?

Re: Area marking?

Posted: 04 Jan 2014, 16:52
by Peter
Jeg har ikke spillet Total War, men formoder at markeringerne skal udregnes automatisk alt efter hvad brugeren har valgt? Eller er det brugeren der trykker og/eller maler på meshet?

Hvis det er helt automatisk alt efter hvilke enheder der er valgt, så virker Bezier kurver som et fornuftigt nok valg. Man skal så finde ud af hvor kontrol punkter skal sættes for at give den ønskede kurve. Det kræver formentligt at man kombinere med noget pathfinding og har helt styr på hvad der er vand og land.

Areafill effekten kan opnås ved at udregne en signed distance til kurven på terrainet og så shade baseret på de afstande. Der er en fin diskussion af det her, incl kodestumper og webgl eksempler: http://www.pouet.net/topic.php?which=9119&page=1

Re: Area marking?

Posted: 04 Jan 2014, 19:28
by DonSonz
Ja det er noget der skal udregnes automatisk, men mine punkter er noget lettere at definere (se evt. min video i Mafioso).

Mange tak for linket, vil se om det ikke kan lade sig gøre at lave noget tilsvarende i unity. Fedt der også er kode eksempler.

Re: Area marking?

Posted: 15 Jan 2014, 16:00
by DonSonz
Så er koden til Bezier curves på plads.

Er stadig meget i tvivl om hvordan jeg skal lave Areafill!

Har måske overvejet at triangulerer for at omdanne til en mesh - men er det vejen at gå?
Bliver det mon for langsomt?

Har ikke helt styr på hvordan jeg skal shade endnu! - så der er lidt arbejde med det endnu.

Re: Area marking?

Posted: 21 Jan 2014, 19:01
by Pegepinden
DonSonz wrote:
Har måske overvejet at triangulerer for at omdanne til en mesh - men er det vejen at gå?
Bliver det mon for langsomt?
Lyder som en fin ide, og nej bliver ikke for langsomt. Kræver ikke meget at skrive et mesh i Unity, kun mesh colliders er tunge, men dem har du jo ikke rigtigt brug for.

Re: Area marking?

Posted: 21 Jan 2014, 20:37
by Peter
Jeg havde forestillet mig at du ville udregne signed distance til dine kurver i den pixel shader der også rendere terrainet. På den måde er det ikke nødvendigt at have ekstra geometri, men du kan lave effekten i shaderen direkte. Hvis det ikke kan lade sig gøre, så burde det være muligt at triangulere for at få et mesh som du så kan rendere som en form for overlay. Ved ikke om triangulering af den type data du har allerede er bygget ind i Unity, men mon ikke nogle har implementeret delaunay triangulation eller lignende.

Glæder mig til at se nogle resultater :)

Re: Area marking?

Posted: 28 Jan 2014, 22:13
by DonSonz
Cumming up :D

Har ikke haft så meget tid til at lege med det, men har kode til bezier curves og dynamic mesh (næsten klar).
Mangler så bare at få mesh til at blive bygges udfra punkter på Bezier Curve.

Rent spilmæssigt ift. mafioso ser jeg også anden vej såsom hex-tiles, men mere om det på den anden side af weekenden. Med mindre der er nogen der har andre planer på mine veje på hjemmefronten :D

Re: Area marking?

Posted: 01 Feb 2014, 17:32
by DonSonz
Som lovet lige en lille video over hvordan jeg har valgt at løse areafill.

Først vil jeg lige pointere at jeg på ingen måde er kodehaj. Undgår helst at kode, men komme detsværre ikke uden om det hvis jeg skal lave Mafioso :lol:

Dette er derfor mit ydmyge forslag til hvordan det kan laves.

Jeg har lavet det ved at lave nogle bezier curves med 4 kontrolpunkter og to tangenter. Herefter benytter jeg punkter fra kurverne til veritices til at danne en mesh (triangulerer). I update funktionen ændrer jeg på vertices og triangles. Jeg har ikke lagt shader og UV på så derfor den flotte lyserøde farve :D

Mht. mafioso er jeg ved at teste hex og Square grid based movement! - og tror det er mere sandsynligt at jeg kommer til at benytte dette i stedet. Video af dette vil være det næste jeg lægger op.

Hvis nogen har lyst til at kommentere mine valg er I mere end velkomne!



Re: Area marking?

Posted: 02 Feb 2014, 00:23
by Peter
Af en der helst undgår at kode så går det da meget godt :)

Det kunne være interessant nok at se den i wireframe, men har en ide om hvordan det vil se ud. Hvis effekten skal ligge ovenpå et terrain er jeg stadig ikke overbevist om at det er nødvendigt at generere et nyt mesh, man burde kunne rendere terrainet med den effekt direkte. Dog giver det måske noget ekstra fleksibilitet, og hvis dit target er PC så bliver performance nok ikke noget problem.

Godt arbejde. Ud fra videoen at dømme har du i hvert fald løst problemet godt.

- Peter

Re: Area marking?

Posted: 03 Feb 2014, 15:25
by DonSonz
Peter wrote:Af en der helst undgår at kode så går det da meget godt :)

Det kunne være interessant nok at se den i wireframe, men har en ide om hvordan det vil se ud. Hvis effekten skal ligge ovenpå et terrain er jeg stadig ikke overbevist om at det er nødvendigt at generere et nyt mesh, man burde kunne rendere terrainet med den effekt direkte. Dog giver det måske noget ekstra fleksibilitet, og hvis dit target er PC så bliver performance nok ikke noget problem.

Godt arbejde. Ud fra videoen at dømme har du i hvert fald løst problemet godt.

- Peter
Har googlet en del omkrign signed distance og shader, men må indrømme at jeg ikke helt har haft hjerne nok til at kunne forstå det :D

Ved ikke om det er fordi det er Unity, jeg benytter og derfor ikke tænker så meget over hvordan terrain bliver genereret. Omvendt så var der ok med beskrivelser/teori af Bezier Curves, delaunay triangulation og procedural mesh generation. Så at skrive kode til dette faldt mig lidt lettere, men noget siger mig at det nok ikke er det mest effektive :?

Men du har nok også ret i at jeg kan benytte denne kode i andre sammenhænge også, så mere fleksibilitet.

Er lidt nysgerrig - Har du selv prøvet at lave noget lignende tidligere?

Re: Area marking?

Posted: 03 Feb 2014, 22:24
by Peter
Jeg har lavet mange forskellige typer shadere, både i Unity og i andre engines. Dog ingen der evaluere kurver eller lign. Bezier kurver og flader har jeg implementeret i c++ engang.
Jeg tror nu ikke at din metode er specielt ineffektiv, især ikke hvis meshet ikke er dynamisk men bare skal laves en gang pr. "mange" frames. Jeg spekulere mest over om det mesh du generere kommer til at ligge helt perfekt oven på terrainet, hvis det f.eks har mange højdekurver.
Lavede man en shaderløsning ville der givetvis også være en del at tage i betragtning før den blev optimal.

-Peter

Re: Area marking?

Posted: 15 Feb 2014, 12:20
by DonSonz
Peter wrote:Af en der helst undgår at kode så går det da meget godt :)

Det kunne være interessant nok at se den i wireframe, men har en ide om hvordan det vil se ud. Hvis effekten skal ligge ovenpå et terrain er jeg stadig ikke overbevist om at det er nødvendigt at generere et nyt mesh, man burde kunne rendere terrainet med den effekt direkte. Dog giver det måske noget ekstra fleksibilitet, og hvis dit target er PC så bliver performance nok ikke noget problem.

Godt arbejde. Ud fra videoen at dømme har du i hvert fald løst problemet godt.

- Peter
Hej Peter

Har ikke haft så meget tid til denne, da jeg har koncentreret min tid på Mafioso.
Men her er lige en video der også viser wireframe. Jeg har udvidet kode til at indeholde UV også.

Next step er at få dette til at lægge sig på Terrain og her er jeg selv meget i tvivl om hvad det vil betyde mht. antallet af højdepunkter i terrain. Jeg forestille mig noget i stil med dette :

for (int i = 0; i < vertices.length; i++)
{
vertices.y = Terrain.activeTerrain.SampleHeight(position);
}

Eller skal jeg hellere forsøge mig ad Mesh overlay vejen?
(her er jeg bare på rimelig bar bund :shock: )



Re: Area marking?

Posted: 17 Feb 2014, 17:57
by Peter
Hej

Hvis vertices er de hjørnepunkter jeg ser i din wireframe rendering i videoen, så vil det nok kun virke fornuftigt for helt plane terrains da der jo ikke er nogen vertices inde på selve fladen men kun på kanten.

Du kan evt. subdivide dit bezier mesh så der er mange flere vertices, også inde på fladen. Så vil den simple metode med at tage højden direkte fra terrainet muligvis se ok ud.

Men det bedste ville nok være at lave et nyt mesh som er en projektion af din flade bezier model ned på terrainet. I.e. forestil dig at du lægger dit bezier mesh ovenpå terrain height mappet og så generere et mesh med en vertex i hver af de pixels fra height mappet som dit bezier mesh dækker over. så vidt jeg lige kan forestille mig så vil det give et mesh der skulle passe ovenpå dit terrain. Jeg har dog ikke gennemtænkt det helt 100%, så der kan sagtens være nogle problemer/detaljer jeg ikke har tænkt over.

- Peter

Re: Area marking?

Posted: 17 Feb 2014, 20:49
by DonSonz
Ok, det må afprøves en dag hvor jeg har overskud af tid.

Unity har en projektor funktion, men om den passer med min Mesh ved jeg ikke.
Et andet problem er at Bezier curven ikke er en del af denne mesh så om de vil passe sammen er spændende.

Lige i øjeblikket arbejder jeg på kampscenerne i Mafioso, hvilket er ret morsomt. Jeg er ved at have et trækbaseret kampsystem på plads, så leger en del med selve kampene lige nu (afbalancering m.m).