Autor Zpráva
1Pupik1989
Profil
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 *
Canvas neslouží přímo ke generování 3d grafiky jako XNA, proto je to trochu složitější,viz. odkaz

Ale ohledně lLookAt, by mohlo pomoct viz. odkaz.
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
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
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ě.

kozusnik.jan
Profil *
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
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
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.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: