.[ ČeskéHry.cz ].
XNA a kreslenie čiar

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Jefo



Založen: 02. 07. 2011
Příspěvky: 58

PříspěvekZaslal: 1. červenec 2013, 20:08:31    Předmět: XNA a kreslenie čiar Odpovědět s citátem

Ahoj

potreboval by som poradiť s kreslením čiar v XNA. Mohol by mi prosím niekto napísať ako na to a doplniť to aj kratkym zdrojákom.

Ďakujem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dlaha



Založen: 30. 07. 2007
Příspěvky: 598
Bydliště: Olomouc

PříspěvekZaslal: 2. červenec 2013, 10:01:57    Předmět: Odpovědět s citátem

Tohle je kupodivu trochu komplikovanější a musíš zabrouzdat do 3D. SpriteBatch pro to metodu nemá (pokud má, tak jsem hlupák, že jsem ji za ty roky nenašel).
Pročti si tohle: http://msdn.microsoft.com/en-us/library/bb975154.aspx

Potřebuješ efekt na kreslní (o efektech viz. v odkazu výše). Nejrychlejší bude vytvořit si BasicEffect na kreslení (můžeš si ale napsat i vlastní). Potom mu musíš nastavit vykreslovací matice (opět by o tom měli psát v odkazu výše).

kód:

BasicEffect basicEffect;

basicEffect.World = Matrix.Identity;
basicEffect.View = Matrix.CreateLookAt(new Vector3(5, 5, 5), Vector3.Zero, Vector3.Up);
basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(
    MathHelper.ToRadians(45),  // 45 degree angle
    (float)GraphicsDevice.Viewport.Width /
    (float)GraphicsDevice.Viewport.Height,
    1.0f, 100.0f);

Tady je použita projekční matice s perspektivou, ale tobě se bude asi hodit víc Orthogonální, jestli kreslíš přes SpriteBatch (něco o tom určitě přes google najdeš).

Dál musíš mít co vykreslit, takže si uděláš pole s jednotlivými body. Plus indexování těchto bodů (pořadí ve kterým se budou kreslit).

kód:

VertexCollection<VertexPositionColor> vertices = new VertexPositionColor[2];
short[] indexes = new short[2];

// a naplnis to
vertices[0].Position=new Vector3(-1,1,0);
vertices[1].Position=new Vector3(1,-1,0);
indexes[0]=0; indexes[1]=1;


A pak vykreslíš v metodě Draw:

kód:

foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) {
  pass.Apply();
  GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
                        PrimitiveType.LineStrip,
                        vertices, 0, vertices.Length,
                        indexes, 0, indexes.Length - 1
                    );
}

Tenhle kód kreslí všechny průchody efektu, což u BasicEffect není nutné, ale může se ti to hodit vědět.


Nevím jistě, jestli jsem se nedopusil nějaké chyby a bude to fungovat, nezkoušel jsem kompilovat. Barvu vykreslované čáry a nějaké další vlastnosti si pak můžeš nastavit v třídě BasicEffect.
Počítám s tím, že používáš XNA 4.0.
_________________
Other Inside
Greenlitnuto!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Jefo



Založen: 02. 07. 2011
Příspěvky: 58

PříspěvekZaslal: 2. červenec 2013, 16:02:58    Předmět: Odpovědět s citátem

Ok. Dakujem už sa mi pdarilo niečo nakresliť cez XNA 4.0. Pomohlo by mi keby mi ešte poradíte ako zmeniť hrúbku čiary. Našiel som niečo cez "GraphicsDevice.RenderState.PointSize" len to mi v XNA 4 nefunguje.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1533
Bydliště: u Prahy

PříspěvekZaslal: 3. červenec 2013, 09:29:46    Předmět: Odpovědět s citátem

Pokud vím, tak XNA je nad Direct3D, a ten tloušťku čar neumí (viz příšerné pixel tlusté vlasy hrdinky v jednom starém 3D Marku). To jde jen v OpenGL (antialiasované čáry, ale vyžaduje řazení a není podporováno s novými profily). "point size" se bude asi týkat point sprites. Takže pro XNA pravděpodobně nezbude než tesselovat čáru do polygonů se zprůhledňujícími se okraji. Jako to měly v iOS vezi Cut the Rope. Což mě napadá - pro co ta aplikace má být? Když je to XNA, tak pro webové prohlížeče a Windows 8 Metro můžeš programovat v JavaScript/Canvas, kde ty antialiasované tlusté čáru jsou.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 3. červenec 2013, 18:39:13    Předmět: Odpovědět s citátem

Jen doplnění Ladise - Teoreticky je nemusíš tessellovat, ale stačí použít alpha blending a texturu namapovanou na "čáru z polygonů". Ostatně tak se to dělá i v OpenGL (pokud nepoužíváš staré profily).
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
satik



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 4. červenec 2013, 08:41:43    Předmět: Odpovědět s citátem

Ja to resil tak, ze jsem vykresloval bily pixel obarveny podle zadane barvy a roztahnuty na sirku na delku cary a na vysku na tloustku cary a orotovany podle potreby (Atan2 ti zjisti uhel).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Jefo



Založen: 02. 07. 2011
Příspěvky: 58

PříspěvekZaslal: 9. červenec 2013, 17:46:04    Předmět: Odpovědět s citátem

No uz kreslím čiary jedna radosť ide to super. Akurat mam problem s nastavením "Projection". Nastavil som ho takto

kód:

efekt.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.Pi / 4 , GraphicsDevice.Viewport.Width / GraphicsDevice.Viewport.Height,1.0f, 10f);

efekt.View = Matrix.CreateLookAt(new Vector3(0,0,0),Vector3.Zero,Vector3.Up);


Problem je že nič nevidím.
Ďalej som skúšal kresliť trojuholnky teda face. No niečo som nakreslil a pod "Orthographic" projekciou mi to aj zobrazilo no neviem ako mam ist správňe na to. Skúšal som takto.

kód:

body[0] = new VertexPositionColor(new Vector3(graphics.GraphicsDevice.Viewport.Width / 2 - 50f, 40f, -1f), Color.Yellow);
body[2] = new VertexPositionColor(new Vector3(graphics.GraphicsDevice.Viewport.Width / 2 - 50f, 90f, -1f), Color.Yellow);
body[1] = new VertexPositionColor(new Vector3(graphics.GraphicsDevice.Viewport.Width / 2 +50f, 90f, -1f), Color.Yellow);
body[3] = new VertexPositionColor(new Vector3(graphics.GraphicsDevice.Viewport.Width / 2 + 50f, 40f, -1f), Color.Yellow);

indexes = new short[6];
indexes[0] = 0;
indexes[1] = 1;
indexes[2] = 2;
indexes[3] = 0;
indexes[4] = 1;
indexes[5] = 3;



Kreslím to takto
kód:

GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, body,0,4,indexes, 0, 2);


Vie mi prosím niekto pomôcť s nastavením projekcie a so správnym kreslením tych fejsov(trojuholnikov). Ďakujem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jefo



Založen: 02. 07. 2011
Příspěvky: 58

PříspěvekZaslal: 9. červenec 2013, 18:48:54    Předmět: Odpovědět s citátem

Problem mam v tom ze mi to nekresli druhy trojuholnik
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna