.[ ČeskéHry.cz ].
smerovy vekto na uhly

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



Založen: 02. 09. 2007
Příspěvky: 22

PříspěvekZaslal: 18. listopad 2013, 15:21:42    Předmět: smerovy vekto na uhly Odpovědět s citátem

Dobrý deň.
Chcel by som sa spýtať, či by mi niekto vedel pomôcť s nasledujúcim problémom. Mám program, ktorý vykresluje guľe v priestore (glSphere). Začína sa od jedného bodu. Ten má určený smer rastu pomocou vektoru (trebars (0,1,0) čo je kolmo nahor v smere osi Y). Pomocou tohto vektoru vypočítam pozíciu nového bodu a pridám ho. Tomuto novo pridanemu bodu sa vypočíta nový smerový vektor a pomocou neho sa zas vypočíta nová pozícia ďalšieho nového bodu (vytvára sa stromová štruktúra). Vektory sú normalizované. Ja by som potreboval, aby sa mi novo pridaná guľa (sphere) otočila v smere rastu. Čiže potrebujem nejak prepočítať smerový vektor na uhly, o ktoré sa má daný bod otočiť.
Vedel by mi niekto prosím poradiť, ako na to?

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



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 18. listopad 2013, 16:20:53    Předmět: Odpovědět s citátem

Nemas na to dostatok informacii. Okolo toho vektoru sa totiz moze ten model (gule) tocit hocijako. Takze potrebujes este aspon jeden "bazovy" vektor, ktory urci nielen to, kde je "dohora", ale aj kde je "dopredu" (a ich vektorovy sucin aj "doboku").

Namiesto jednoduchej pozicie budes potrebovat poziciu + rotaciu, cize napriklad 4x4 (4x3) maticu. Posun potomkov voci predkovi nebude vektor, ale relativna matica, ktora sa prinasobi k matici predka a vysledok sa pouzije na zobrazenie pomocou API (prepokladam OpenGL, tak rovno do glLoadMatrix).

Takto nejako funguju kostrove systemy napriklad pre animovanych panakov.

Sounds easy, right? Smile
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu  
hybr1D



Založen: 02. 09. 2007
Příspěvky: 22

PříspěvekZaslal: 19. listopad 2013, 10:44:58    Předmět: Odpovědět s citátem

Ďakujem. Takže ak som to dobre pochopil, tak kazdy bod (gula) bude mat namiesto 3 suradnic maticu, ktora bude vypadat trebars takto:

1;0;0;90 -> určenie smeru doprava
0;1;0;90 -> smer hore
0;0;1;0 -> smer dopredu
0,5;0,1;0,03 -> pozia bodu (napriklad)

a ked pridam novy bod tak si vypocitam jeho poziciu, zapisem ju do matice na posledny riadok a vynasobim tu maticu maticou jeho predka a ziskam uhly tak v prvych 3 riadkoch uhly, o ktore treba rotovat. Som zhruba v obraze alebo som uplne mimo? Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu  
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 19. listopad 2013, 11:22:55    Předmět: Odpovědět s citátem

Hehe, no, skoro Very Happy Ale obavam sa, ze si budes musiet nieco nastudovat o maticiach a homogennych suradniciach. Co si uz z matiky mal v skole?

Chlapi, kto poradi nejaky lepsi a nazornejsi sposob, ako toto interpretovat s minimalnymi znalostami?
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu  
hybr1D



Založen: 02. 09. 2007
Příspěvky: 22

PříspěvekZaslal: 19. listopad 2013, 11:47:00    Předmět: Odpovědět s citátem

Z matiky som mal v skole vsetko a uz som aj vsetko zabudol Very Happy Toho som sa bal, ze budem musiet cosi nastudovat ale tak trochu som to tusil Smile Neviete niekto nejaky dobry tutorial ohladom tejto problematiky?

Dakujem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu  
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 19. listopad 2013, 14:04:07    Předmět: Odpovědět s citátem

Jedná se konkrétně o tohle:

http://cs.wikibooks.org/wiki/Geometrie/Afinn%C3%AD_transformace_sou%C5%99adnic

Je to součást lineární algebry, takže se k tomu hodí, trochu si o ní něco nastudovat.

Takový rychlý náhled do toho, o co se jedná bez nutnosti znalosti teorie:
http://www.root.cz/clanky/opengl-5-transformacni-matice-a-linearni-transformace/. Moc z toho nepochopíš, jak to funguje, ale dobře pochopíš, co to dělá. A je to o staré verzi OpenGL.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu  
hybr1D



Založen: 02. 09. 2007
Příspěvky: 22

PříspěvekZaslal: 21. listopad 2013, 11:13:09    Předmět: Odpovědět s citátem

No po preštudovaní pár tutoriálov som si osviežil pamäť ohľadom transofrmácii v 3D priestore. Ale stále mi nie je jasné ako vypočítať ten uhol otočenia. Na začiatku mám 1 bod a jeho maticu, ktorá vypadá nejak takto:
1;0;0;0
0; cos(90);-sin(90); 0 -> otočenie na osi X o 90 stupňov
0; sin(90); cos(90); 0 -> otočenie na osi X o 90 stupňov
x;y;z;1 -> x,y,z sú súradnice počiatočného bodu
Touto maticou vynásobím s modelview (ktorá je po LoadIdentity), dám do LoadMatrix, vykreslím guľu a prvý bod je na svete.
Vypočítam si nejaký vektor pre druhý bod. Vyvorim si novu maticu:
1;0;0;0
0;1;0;0
0;0;1;0
tx;ty;tz;1 -> tx,ty,tz sú hodnoty, o koľko musím nový bod posunúť na každej ose. Túto maticu vynásobím s modelview maticou predka a dám ju do LoadMatrix a vykreslím ďalší bod. To je ale iba posunutie (aj to neviem, či je to správne). Tú rotáciu neviem ako vypočítať, keďže nepoznám uholy, o ktoré treba bod otočiť. Vedel by niekto pomôcť prosím?

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



Založen: 02. 09. 2007
Příspěvky: 22

PříspěvekZaslal: 25. listopad 2013, 11:55:33    Předmět: Odpovědět s citátem

Tak uz som to z casti vyriesil bez tych maticovych operacii. Tu je cast kodu, ako to robim:

Vypocet uhlov o ktore musim otocit bod na kazdej osi:

kód:

bod = new BodGL();  //novy zaznam
            bod.Quad = GLU.gluNewQuadric(); //novy Quad v zazname pre vykreslenie glSphere
            bod.bod = new clsBod();    //novy bod v zazname
            bod.bod.Pozicia = pos;    //pozicia
            bod.bod.SmerRastu = SmerR;

            rotX = (Math.Atan((pos.Z - BP[otec].bod.Pozicia.Z) / (pos.Y - BP[otec].bod.Pozicia.Y)) * 180) / Math.PI;
            rotY = (Math.Atan((pos.X - BP[otec].bod.Pozicia.X) / (pos.Z - BP[otec].bod.Pozicia.Z)) * 180) / Math.PI;
            rotZ = (Math.Atan((pos.X - BP[otec].bod.Pozicia.X) / (pos.Y - BP[otec].bod.Pozicia.Y)) * 180) / Math.PI;

            if (double.IsNaN(rotX)) rotX = 0;
            if (double.IsNaN(rotY)) rotY = 0;
            if (double.IsNaN(rotZ)) rotZ = 0;

            bod.bod.Rotation = new Vektor(rotX, rotY, rotZ);



Vykreslovanie bodov:
kód:

            //posun
            GL.glTranslatef(xpos, ypos, zoom);

            //rotacia
            GL.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
            GL.glRotatef(yrot, 0.0f, 1.0f, 0.0f);

            foreach (BodGL B in poleBodov)  //prejdem vsetky body
            {
                GL.glPushMatrix();

                GL.glTranslatef((float)(B.bod.Pozicia.X), (float)(B.bod.Pozicia.Y), (float)(B.bod.Pozicia.Z));    //nastavim sa na poziciu bodu

                GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview);
                GL.glRotatef((float)B.bod.Rotation.X, (float)modelview[0], (float)modelview[4], (float)modelview[8]);

                GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview);
                GL.glRotatef((float)B.bod.Rotation.Y, (float)modelview[1], (float)modelview[5], (float)modelview[9]);

                GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview);
                GL.glRotatef((float)B.bod.Rotation.Z, (float)modelview[2], (float)modelview[6], (float)modelview[10]);

                VykresliAtrBod(B); //vykreslim gluSphere

                GL.glPopMatrix();
            }


uhly pocita spravne ale problem je v tom, ze ked urobim prvu rotaciu okolo osi X, uz mi nesedia suradnice, lebo sa cela scena pootoci. Tak som rozmyslel, ze by som po kazdom otoceni okolo nejakej osi, este prepocital zvysne uhly pomocou sinusov a kosunusov (napr. ak zarotujem okolo osi X o uhol A, precpocitam si uhly B a C o ktore budem este rotovat na osiach Y a Z). Chcel som sa spytat, ci nemate nejaky lepsi a jednoduchsi napad ako na to.

Dakujem.[/code]
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 -> 3D API / 3D Enginy Č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