Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
hybr1D
Založen: 02. 09. 2007 Příspěvky: 22
|
Zaslal: 18. listopad 2013, 15:21:42 Předmět: smerovy vekto na uhly |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 18. listopad 2013, 16:20:53 Předmět: |
|
|
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?  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
hybr1D
Založen: 02. 09. 2007 Příspěvky: 22
|
Zaslal: 19. listopad 2013, 10:44:58 Předmět: |
|
|
Ď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?  |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 19. listopad 2013, 11:22:55 Předmět: |
|
|
Hehe, no, skoro 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 |
|
 |
hybr1D
Založen: 02. 09. 2007 Příspěvky: 22
|
Zaslal: 19. listopad 2013, 11:47:00 Předmět: |
|
|
Z matiky som mal v skole vsetko a uz som aj vsetko zabudol Toho som sa bal, ze budem musiet cosi nastudovat ale tak trochu som to tusil Neviete niekto nejaky dobry tutorial ohladom tejto problematiky?
Dakujem |
|
Návrat nahoru |
|
 |
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
|
Návrat nahoru |
|
 |
hybr1D
Založen: 02. 09. 2007 Příspěvky: 22
|
Zaslal: 21. listopad 2013, 11:13:09 Předmět: |
|
|
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 |
|
 |
hybr1D
Založen: 02. 09. 2007 Příspěvky: 22
|
Zaslal: 25. listopad 2013, 11:55:33 Předmět: |
|
|
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 |
|
 |
|