Autor | Zpráva | ||
---|---|---|---|
1Pupik1989 Profil |
#1 · Zasláno: 14. 1. 2013, 22:18:27
Zdravím, opět otravuji, ale snad už naposledy.
Snažím se už nějaký ten pátek vytvořit hru v HTML5 Canvasu. Nenašel jsem nikde hezký návod s příklady, proto se opět po měsíci obracím sem, protože jsem se do toho úplně zamotal. Teď už otázky. 1. K čemu je inverzní matice? 2. Mám čtvercovou matici m x n. Mám správně vektory left, up a forward na obrázku? ![]() 3. Pokud mám cameru na pozici (0,0,0) a dívá se na (0,0,1) a bod je na (0,0,2). Kde bude bod ve View Space? Myslel jsem že bude na (0,0,2) pořád, když kamera se nehnula, ale vyjde mi (0,0,-2) čili se vlastně otočil o 180%. Hodně mě zmátlo, že třeba OpenGL má translaci jednou na a31,a32,a33 a jindy zase na a13,a23,a33. Já samozřejmě chci používat druhou verzi (viz. obrázek struktury matice). Vím že OpenGL má matici typu n x m (sloupec x řádek) ale tu translaci opravdu nechápu. 4. Jak vlastně otočím pohled kamery? Myslel jsem si, že když otočím vektorem kam se dívá, tak to bude to pravé ořechové, ale není. Kameru vytvářm pomocí LookAt funkce jako je v XNA. To je zatím asi vše. Za každou odpověď budu rád. Už se s tím trápím dlouho. Kdyby někdo chtěl vidět jmenovitě nějaké funkce, tak je sem postnu. Děkuji všem předem. |
||
nevim Profil * |
#2 · Zasláno: 15. 1. 2013, 09:13:18
|
||
1Pupik1989 Profil |
LookAt bych řekl, že mám správně.
N3D.Matrix.CreateLookAt = function(eye,target,up){ var vz = N3D.Vector3.Sub(eye,target).normalize(); var vx = N3D.Vector3.Cross(up, vz).normalize(); var vy = N3D.Vector3.Cross(vz, vx); return new N3D.Matrix([ [vx.x,vx.y,vx.z,-N3D.Vector3.Dot(eye,vx)], [vy.x,vy.y,vy.z,-N3D.Vector3.Dot(eye,vy)], [vz.x,vz.y,vz.z,-N3D.Vector3.Dot(eye,vz)], [0,0,0,1] ]); }; Řídil jsem se podle obrázku pro XNA: ![]() Čerpal jsem na této stránce Pro perspektivu používám N3D.Matrix.CreateFrustum = function(left,right,bottom,top,near,far){ var x = 2 * near / (right - left), y = 2 * near / (top - bottom), a = (right + left) / (right - left), b = (top + bottom) / (top - bottom), c = -(far + near) / (far - near), d = -2 * far * near / (far - near); return new N3D.Matrix([ [x,0,a,0], [0,y,b,0], [0,0,c,d], [0,0,-1,0] ]); }; N3D.Matrix.CreatePerspectiveFieldOfView = function(fov,aspect,near,far){ var ymax,ymin,xmin,xmax; ymax = near * Math.tan(fov/2); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; return N3D.Matrix.CreateFrustum(xmin,xmax,ymin,ymax,near,far); }; |
||
1Pupik1989 Profil |
#4 · Zasláno: 16. 1. 2013, 20:19:03
Doporučíte mi někdo alespoň nějaké fórum pro tento problém? Tady se moc odpovědí nedočkám, což chápu.
|
||
1Pupik1989 Profil |
#5 · Zasláno: 18. 1. 2013, 11:45:25
Ví někdo jak to zrychlit? Metoda offline kreslení to stáhne ještě o 4 fps dolů. Stačilo by mi poradit, jakým způsobem vytáhnu z pole vytáhnu položky s nejmenší proměnou, niž bych ho musel třídit. Takhle to setřídím, což je jeden cyklus a druhým to až vykresluji. No při 2217 trojúhelníkách je to docela dost.
Kameru už asi není třeba řešit, tu jsem nakonec dodělal, i když možná moc složitě. ![]() |
||
Časová prodleva: 4 dny
|
|||
kozusnik.jan Profil * |
#6 · Zasláno: 22. 1. 2013, 15:10:29
nevim:
Dobrý den, co byste teda použil na vykreslení 3D grafiky do prohlížeče? Potřebuji řešení univerzální pro všechny prohlížeče. Děkuji |
||
Chamurappi Profil |
#7 · Zasláno: 22. 1. 2013, 16:28:44
Reaguji na 1Pupika1989:
„Stačilo by mi poradit, jakým způsobem vytáhnu z pole vytáhnu položky s nejmenší proměnou, niž bych ho musel třídit.“ Zkus Math.min.apply(null, pole) .
|
||
1Pupik1989 Profil |
#8 · Zasláno: 22. 1. 2013, 16:48:15
Chamurappi:
To mi ale vrátí jen jednu. Dejme tomu, že mám těch 2217 trojúhelníků. Já z toho potřebuji jen ty trojúhelníky, které mají z>0.1, čili z větší než začátek ořezávací roviny. Myslím, že asi jinak než cyklem to prostě nepůjde. Zároveň musí platit z<100. Proměnnou z samozřejmě průměruji ze třech bodů trojúhelníku. |
||
Časová prodleva: 12 let
|
0