Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1 2
Zdravím,
potřeboval bych poradit s jedním algoritmem, který by mi zobrazil krychli na ploše (tzn. převedl její body v prostoru do roviny) a zároveň mi umožnil s krychlí otáčet (stačí po ose x a y).
Přemýšlím nad tím už několik týdnů a ne a ne na to přijít. Zobrazil jsem si krychli (to takový problém nebyl - abych si to ulehčil, střed krychle je na souřadnicích [0,0,0]) a dokážu ji i otáčet po ose x/y pomocí dvou kružnic (jedna mi vyjadřuje otáčení po ose x a druhá po ose y), jak je Vám už ale asi jadné, toto otáčení nefunguje v případě, kdy je krychle otočena (aspoň na jedné z os) o jiný úhel než násobek 90°. A tady si už právě nevím rady.
Napadlo mě otáčet krychli ne po kružnicích, ale po elipsách (na ploše to je vlastně kružnice v prostoru). Z každé elipsy bych si zjistil souřadnice (X1, Y1 a X2,Y2) a souřadnice bodu (vrcholu krychle), který chci zobrazit by ležel mezi těmito body ve středu (aspoň taková je moje teorie - jestli je správná, to nevím).
Vzhledem k tomu, že je to sakra těžké na představivost (uvědomit si, kdy jsme ještě v 3D prostoru a kdy už v 2D), našel jsem ještě něco o Polárních souřadnicích (v 3D prostoru to jsou myslím Sférické a potom bych musel asi použít Transformační rovnice na promítnutí na plochu). Bohužel je to učivo vysokých škol a já jsem středoškolák, takže jsem si vše musel načíst (učitelé mi moc neporadili) a nejsem z toho vůbec chytrý. Mohl by mi někdo, prosím, vysvětlit jak s nimi promítnout krychli (vrcholy krychle, u kterých znám souřadnice) na plochu a abych s krychlí mohl otáčet (pokud jsem to pochopil dobře, tak neotáčím s krychlí, ale s bodem, ze kterého se dívám (kamerou) a to už jsem se ztratil uplně).
Bohužel nevím, která varianta je výhodnější (přes sférické souřadnice měnit bod zobrazení a potom preš transformační rovnice přenést souřadnice na plochu nebo přes dvě elipsy otáčet s krychlí a potom ji zobrazit na plochu). Pokud by mi někdo dokázal poradit, byl bych mu moc vděčný.
Předem děkuji za každou radu. Pazzi
Offline
Jo, chci si napsat program, ve kterém si budu moct otáčet s krychlí. No když jsem používal DirectX.3D, krychle se mi sbíhala do úběžníku, což já nechci. Potřebuju, aby všechny rovnoběžné čáry byly opravdu rovnoběžné, proto jsem se rozhodl, že si zkusím zobrazení (a otáčení) krychle napsat sám.
Offline

↑ Pazzi:
Tomu se říká perspektiva :) - vzdálenější objekty jsou menší.
Třeba v OpenGL lze nastavit několik pohledů zobrazení a některé perspektivu ignorují. Třeba to jde i v DirectX.
Offline
ano, perspektiva, bohužel nevím, jak ji v DirectX nastavit, proto jsem se rozhodl napsat vlastní přepočítávání.
VSTUP 3D souřadnice [x,y,z], VÝSTUP 2D souřadnice pro zobrazení na monitoru [x,y]
Offline
↑ Pazzi:
Ahoj,
to čo potrebuješ sa volá projekcia. Najčastejše sa používa perspektívna projekcia, ktorá spôsobuje dojem, že objekty ďalej sa zdajú menšie. Ale to je to čo ty nechceš preto by si mal použit takzvanu ortograficku projekciu. Tam sú priamky projekcie kolmé na rovinu na ktorú scénu premietaš a tým zachovávajú rovnobežnosť, ktorú potrebuješ. V podstate ide len o posunutie a škálovanie, čo sú základné transformácie súradníc.
Teda celá projekcia je len ďalšou transformáciu súradníc teda dá sa to vyjadriť maticou, ktorou ti stačí prenásobiť súradnice a dostaneš to čo potrebujes. Odvodenie oboch projekcnych matic a aj popis ako sa používajú v DirectX nájdeš tu.
Offline

↑ Pazzi:
Přesně tohle jsem myslela, to co píše Billy.
Offline
A přes transformační matice dokážu i krychli otáčet? Co jsme se tak díval, tak u transformačních matic budu potřebovat vyjádřit rovinu, na kterou chci promítat. Jenomže s touto rovinou já budu chtít otáčet (po ose x a y) - otočit ji po jedné ose není pro mě problém, ale nevím jak (když mám třeba otočenou rovinu po ose x o 30°), jak ji otočit po ose y třeba o 45°.
PS: Když se bavím o osách, myslím osy roviny (ne osy v soustavě souřadnic)
Offline

Matice dokaze i otacet: Odkaz. Kdyz das za sebe (vynasobis) dve matice tak se porvede nejdriv jedna transformace, a pak druha, takze to muzes otocit treba nejdriv podle osy x a pak podle y. Projekcni matice ani projekcni rovinu v tvem pripade nepotrebujes (odhaduju), staci, kdyz proste z vysledku ve 3D vynechas slozku z a mas to ve 2D.
Offline
Mohl bys, prosím, uvést nějaký příklad (či obecný vzorec) jak postupovat? Např. bod A[-50;-50;50], střed otáčení (střed krychle) = [0;0;0] a chci kdyhli otočit po ose x o 30° a po ose y o 50%.
Z té wikipedie jsem zmatený, nevím které vzorce se týkají mě a jak je použít. Matice znám jen okrajově (jsem na střední, učitelka se o nich kdysi zmínila, ale že nás to nebude učit, protože to je učivo vysokých škol).
Offline

Tohle je matice otoceni podle x:
1 0 0
0 cosU -sinU
0 sinU cosU
Tohle je otoceni kolem y:
cosU 0 sinU
0 1 0
-sinU 0 cosU
(U je uhel o ktery otacis)
Napriklad ta pro x pri uhlu 30 bude vypadat:
1 0 0
0 0.87 -0.5
0 0.5 0.87
(Omlouvam se za upravu neumim TeX zatim)
Vis, jak se nasobi matice mezi sebou, pripadne matice s vektorem?
Offline
Na násobení matic se kdyžtak poptám ve škole. Ale nějak v tom nevidím, jak dostanu ty souřadnice. Kde používám souřadnice bodu, který otáčím? Mohl bys ještě, prosím, napsat jak postupovat od 3D souřadnic bodu přes otočení po obou stranách (to už jsi napsal) až po zjištění 2D souřadnic, které zobrazím na obrazovce?
Asi chápu, že musím napsat souřadnice bodu do matice (ale v matici máš 9 čísel a souřadnice jsou jen 3) a tuto matici vynásobím s maticí pro otočení (tu, kterou jsi napsal) a potom s druhou maticí pro otočení. A nyní mi vyjde 9 čísel, ale jak z nich zas udělat souřadnice x,y,z netuším.
Offline

Souradnice bodu, ktery otacis, je vlastne vektor, ale pouzivas ho jako matici 3x1, napriklad ten bod A je matice:
-50
-50
50
Takze vynasobis transformacni matici (matice) touto matici bodu, a dostanes 3x1 matici, ve ktere mas uz vysledne souradnice. Napriklad:
[1 0 0 ] [-50] [ 50 ]
[0 0.87 -0.5 ] x [-50] = [-68,5]
[0 0.5 0.87] [ 50] [18,5 ]
Takze po transormaci mas souradnice x=50, y=68.5, z=18.5
(Mel jsem to spatne, ta vysledna matice ma byt na vysku, ne na sirku, opravil jsem to)
(Mimochodem napriklad v OpenGL a DirectX je to slozitejsi, tam se pouzivaji matice 4x4 a orientovane vektory jsou tam take zapsany jako 4x4 matice, ale to pro tvuj pripad nepotrebujes jestli se nepletu)
Offline
Tak jsem zkoušel zobrazit tu krychli přes ty matice, jak píšeš a nefunguje to.
1. "Krychle" se mi otáčí po konstantních osách souřadnic (já potřebuju, aby se otáčela krychle po svých vlastních osách - pokud teda otočím krychli po ose x, změní se mi osa y a naopak).
2. Vypustit zetovou souřadnici nemůžu, protože jinak se mi krychle ani nezobrazí, zobrazí jen nějaký čtverec, kterým otáčím sem a tam.
3. Pokud otočím "krychli" o 45° na ose Y a o -45° na ose X, dostanu bod (správně by měl vzniknout pravidelný šestiúhelník).
Napíšu to jak jsem to řešil přes kružnice (třeba někoho něco napadne):
A[x,y,z]; alfa (otočení po y); beta (otočení po x); gama (momentální odchylka bodu na ose y od kladné osy x);
delta (momentální odchylka bodu na ose x od kladné osy y)
A`[x2,z2] převedené souřadnice bodu na 2D a připravené k zobrazení na ploše
gama = inv cos(x/odmocnina(z*z+x*x) //upravená rovnice pro výpočet úhlu dvou vektorů
delta = inv cos(y/odmocnina(z*z+y*y) //upravená rovnice pro výpočet úhlu dvou vektorů
x2 = sin(alfa+gama)*odmocnina(x*x+z*z) //odmocnina je poloměr kružnice, po které bod otáčím
y2 = cos(beta+delta)*odmocnina(y*y+z*z) //odmocnina je poloměr kružnice, po které bod otáčím
tohle je bohužel řešení, jen pro případ, že chci otáčet krychli jen po jedné ose (buď x nebo y) - jakmile je krychle otočena o jakýkoli úhel po jedné ose a chci otáčet po druhé ose, krychle se rozbije (vznikne z ni kvádr, potom kosočtverec a nakonec přímka)
Offline

Omlouvam se, ze ti to nefunguje. Psal jsem to asi moc obecne a nezkousel jsem tvuj pripad naprogramovat, tak mozna to vyzkousim aby se to dotahlo do konce. Co me ted napada:
1. Tohle jsem si neuvedomil, v tom pripade bys mel nasobit transformacema zprava, tahkle:
[1 0 0 ]
[-50 -50 50] x [0 0.87 -0.5 ] = [-50 -18,5 68,5]
[0 0.5 0.87 ]
2. Mel jsem na mysli vynechat zetovou souradnici az po transformaci, ale to uz predpokladam jsi delal predtim, kdyz se ti krychle zobrazovala.
Jeste se na to podivam a neco napisu.
Offline

Zkousel jsem to ted narychlo v excelu, a funguje to. Co se tyce obecne teorie k tem transformacim a maticim, bylo by to na dlouho, to bys musel nekde nastudovat.
Oprava k tomu memu bodu 1 - nasobeni zprava ti mozna pomuze, mozna ne, zalezi na tom, jak to pocitas. To, jestli se krychle otaci po vlastnich osach nebo ne - to neni tak jednoducha otazka. Nejspis chces jenom obratit poradi tech transformaci. Kdyz otocis nejdrive podle x a pak podle y v souradnicich krychle, je to to same, jako bys otocil nejdrive podle y a pak podle x v souradnicich pohledu.
K bodu 3 - To nevim, jak je mozne :-)
Abych konkretne videl, v cem je problem, asi bys musel ukazat primo ten kod (nebo cast), tak jestli se ti chce, tak ho sem dej.
Jinak jestli kdokoliv jiny ma k tomu nejake pripominky, nebo vi jak to udelat jinak, jednoduseji (treba pomoci te kruznice), tak at napise.
Offline

Uz to vidim, pres ty kruznice to muze nejspis byt jednoduche, mozna bude fungovat neco takoveho:
gama = inv cos(x/odmocnina(z*z+x*x) //upravená rovnice pro výpočet úhlu dvou vektorů
x2 = cos(alfa+gama)*odmocnina(x*x+z*z) //odmocnina je poloměr kružnice, po které bod otáčím
z2 = sin(alfa+gama)*odmocnina(x*x+z*z)
delta = inv cos(y/odmocnina(z2*z2+y*y) //upravená rovnice pro výpočet úhlu dvou vektorů
y2 = cos(beta+delta)*odmocnina(y*y+z2*z2) //odmocnina je poloměr kružnice, po které bod otáčím
Kdyztak to zEdituju jeste jestli to neni spravne.
Offline
Tak určitě se nemusíš omlouvat, že ti to nefunguje. To já můžu být rád, že mi pomáháš.
Nějak jsem nepochopil, jak to myslíš s těma kružnicema (spíš proč tam počítáš souřadnici z)? Ty moje kružnice mi to už právě přepočítají na 2D souřadnice [x,y] a žádná "z" neexistuje... Nebo jak to myslíš? Že bych pomocí kružnic otočil krychli a potom to přes matice převedl na plochu nebo jak?
A mohl bys mi tady napsat ty matice 4x4 jak jsi psal výše? To by teoreticky mohlo být ono. Nejlepší by bylo, kdyby byla nějaké vyjádření kružnice v prostoru (že by byla nakloněna v prostoru) a potom bych otáčel vrcholy pomocí pohybu po kružnici (akorád by byla v prostoru). Otočil bych vlastně krychli po kružnici (třeba po ose y) a potom bych otočil krychli po kružnici po ose x (ale to už by nebyla osa souřadnic, ale krychle) - tu bych si vyjádřil jako přímku, která by měla body střed strany ADHE a střed strany BCFG.
Bohužel jsem nenašel žádné vyjádření kružnice v prostoru, tak jsem to zkoušel přes elipsy (což je nakloněná kružnice v prostoru), ale to taky nedopadlo dobře...
Nebo ještě mě napadá, jestli existuje nějaká obecná rovnice koule (protože vrcholy krychle se při otáčení pohybují v kouli), tak že bych mohl použít nějaký pohyb po kouli.
Offline

Tu souradnici z tam pocitam proto, ze to otacim nejdriv podle jedne osy, a pak podle druhe. Problem je v tom, ze nemuzes tu krychli otocit najednou podle x i podle y, muzes otacet jen podle jedne osy v jednu chvili, jinak se ta krychle zdeformuje. Ta souradnice z2 se pouziva k vypoctu 'delta' a 'y2', ale dal uz ji nepotrebujes, a proste ji nikde nepouzijes.
Co se tyce tech 4x4 matic, tak tim to neni - tam je ctvrty sloupec pouzity pro posunuti, ve cvrtem radku byvaji nuly a na pozici [4,4] rhw, coz byva bud 0 nebo 1.
Zkousel jsi vymenit v tvem programu ty tvoje radky za ty moje? (pro tu kruznici)
Offline

Jeste jsem nad tim premyslel, a rekl bych, ze jsem mozna pochopil, co vlaste presne chces (drive mi to nedoslo). Ty chces otoceni ve smeru x a zaroven y z pohledu te promitaci plochy, a ne kolem osy x nebo y, je to tak?
Jestli ano, tak pomoci kruznic to nebude uplne jednoduche.
Jde o to, ze potrebujes vzdy jednu osu, kolem ktere otacis. V tomhle pripade to tedy bude kolmice na smer ve kterem chces jakoby otacet. Pomoci transformacni matice by to melo jit takhle:
U = odmocnina(alfa*alfa + beta*beta)
ux = beta/U
uy = -alfa/U
x a y je smer te osy kolem ktere otacis, U je celkovy uhel, o ktery otacis. Po dosazeni do matice rotace kolem osy vznikne tohle:
cosU+ux^2*(1-cosU) ux*uy*(1-cosU) uy*sinU
ux*uy*(1-cosU) cosU+uy^2*(1-cosU) -ux*sinU
-uy*sinU ux*sinU cosU
Kdyz se ta matice vynasobi vektorem, vznikne:
x2 = X*(cosU+ux^2*(1-cosU)) + Y*(ux*uy*(1-cosU)) + Z*(uy*sinU)
y2 = X*(ux*uy*(1-cosU)) + Y*(cosU+uy^2*(1-cosU)) + Z*(-ux*sinU)
(z2 = ... neni potreba)
Po vynasobeni vektoru touhle matici by melo vyjit to, co ches (doufam). A jestli ne, tak uz nevim :-)
Offline
Jo, je to přesně tak jak píšeš. Chci otáčet zároveň po ose x a y.
S těma kružnicema jsem to ještě nezkoušel (nebyl jsem doma a ani jsem pořádně nepochopil, jak to myslíš). Teď už to můžu vyzkoušet, ale větší naději vidím v tom, co jsi napsal naposled.
Ale zaráží mě, že tam nepočítáš se souřadnicí "z". Přece ji jen tak nemůžeš vypustit - musí ti nějak ovlivnit 2D souřadnice, které ti mají vzniknout, protože když si vemeš krychli (pohled zepředu), tak body A a D jsou totožné, ale jakmile začneš otáčet po ose y, jeden bod jde doleva a druhý doprava. Jak se tak dívám na ty matice, tak mi připadá, že se oba body budou chovat stejně, když se souřadnicí "z" nepočítáme.
Offline

Se souradnici 'z' se tam pocita, akorat jsem to napsal tak, ze je to matouci (to 'x' a 'y' nejsou souradnice bodu, ale souradnice osy otaceni). Prepisu to aby se to nepletlo.
Offline
Super, díky, počítal jsem to teda přes matice, jak jsi napsal a už to konečně vypadá jako krychle, ať to ji otočím jakkoli (akorád když je pohled zepředu - tzn. natočení o x=0°, y=0° - mi krychle zmizí, ale to snad půjde nějak ošetřit, ještě jsem nekontroloval ani kde je chyba). Takže určitě díky za pomoc.
Akorád jakmile začnu otáčet i po druhé ose, tak nastanou 2 problémy:
1. Krychle se neotáčí po své ose, ale po ose souřadnicové
2. Druhá osa, po které se krychle otáčí není uplně rovná (např. při natočení o 45°a 45° by se měly dva vrcholy střetnout uprostřed pravidelného šestiúhelníku, ale protože není osa rovná, vznikne mezi vrcholy mezera cca 1/10 strany krychle, což je docela velká mezera. (Chyba při zaokrouhlení by být nemělo, protože se všechny výpočty provedou naráz a tak se výsledné číslo zaokrouhlí až nakonec a dál se s ním nic neděje.)
Jo a vysvětlil bys mi, prosím, proč se to počítá tak jak se to počítá (třeba nevím, jak jsme došli k tomu, že U = odmocnina(alfa*alfa + beta*beta); ux = beta/U a uy = -alfa/U.
A ještě jednou díky za pomoc.
Offline

↑ Pazzi:
Pri 0 a 0 bude mizet no, chyba je v tom, potom U=(0*0 + 0*0), takze pak ux = 0/0 (a taky y), a tim padem tam vznikaji divna cisla. To osetris asi nejlepe IFem.
1. Znamena to, ze potrebujes, aby se krychle otacela jakoby podle nejakeho jejiho rohu, a ne podle stredu? Myslim ten [0,0,0].
Jestli ano, tak budes muset bud tu krychli posunout tak, ze jeden bod bude [0,0,0], a nebo pouzit pri transformaci i nejake posunuti (4x4 matice).
2. Jestli se nepletu, tak je to zpusobene prave tim U = odmocnina(alfa*alfa + beta*beta) - vznikne z toho jedna rotace o 63.6°. Kdybys to otocil priblizne o 31.8° a 31.8°, tak by to melo vyjit temer na stred.
Zkusim to vymyslet nejak s tim U, ux a uz aby to vyslo na tech 45°. Pocita se to tak proto, protoze jsem to tak napsal :-) neni to nijaka standardni metoda. Jeste to vysvetlim pozdeji kdyztak.
Offline
Nene, já potřebuju, aby se otáčela krychle ve středu, ale aby se otáčela po své vlastní ose (tzn. osa povede mezi středy dvou protisobě ležících stran). Momentálně je osa, po které otáčíme, totožná s osou souřadnic, což já nepotřebuju.
Potřebuju totiž u krychle měnit jen nadhled, podhled a pohled zleva, zprava
Offline
Stránky: 1 2