Autor Zpráva
1Pupik1989
Profil
Zdravím, už třetí den řeším triangulaci čtyřúhelníku. Nejde mi do hlavy ten výpočet úhlů a následné zkosení.

Pro představu to myslím takto:


Toho chci přesně dosáhnout. Jde o to, že pokud má obrázek všechny vrcholy třeba na x:-100, tak to prostě nerozdělím. Proto mě logicky napadlo počítat to až po aplikován perspektivy. Nebo jde nějakým způsobem vykreslit síť u ve 3D?

Jako vždy potřebuji jen nakopnout.
Děkuji všem za nápady.
peta
Profil
má obrázek všechny vrcholy třeba na x:-100
delka = odm (a*a + b*b + c*c)
http://www.karlin.mff.cuni.cz/katedry/kdm/diplomky/jan_koncel/rovina.php?kapitola=vzdalenost
http://www.karlin.mff.cuni.cz/katedry/kdm/diplomky/jan_koncel/prostor.php?kapitola=vzdalenost
Se muzes podivat, jak to resi tady
http://blog.nihilogic.dk/2008/03/javascriptcanvas-3d-renderer-now-with.html
http://www.nihilogic.dk/labs/canvas3dtexture_0.2/
Tady maji dokonce podobnou plachtu. Nevim ale jestli to mrizkovali scriptem...
http://gyu.que.jp/jscloth/
juriad
Profil
Nedávno jsi petovi radil s jeho otočením ve 3D, není toto snad stejná úloha?

* - jen nad body A, B, C, D
budeš mít body A, B, C, D - vrcholy čtyřúhelníku
všechny body, které se ve čtyřúhleníku vyskytují vypočítáš:
pseudokód (počítání s vektory JS neumí)
var maxI = 4; // vodorovne
var maxJ = 4; // svisle
for(var i = 0; i<=maxI; i++) {
  for(var j =0; j<=maxJ; j++) {
    var v1 = A+(i/maxI)*(B-A); // na usečce AB
    var v2 = D+(i/maxI)*(C-D); // na úsečce DC
    var v = (j/maxJ)*v1+((maxJ-j)/maxJ)*v2; // vnitřní bod
    poleBodu[i][j] = v;
    // pokud je i>0, tak propoj s bodem vlevo - poleBodu[i-1][j]
    // pokud je j>0, tak propoj s bodem dole - poleBodu[i][j-1]
    // pokud je i>0 && j>0, pak propoj s bodem sikmo dolu vlevo - poleBodu[i-1][j-1]
    usecky.push([v, druhyBodUsecky]);
  }
}
během výpočtu bodů si do pole ukládáš jednotlivé hotové úsečky, tak jak na ně budeš narážet
** - nad všemi body v poli usecky
vykreslíš všechny úsečky

v místě *, nebo ** projedeš maticovou transformaci; jelikož je lineární, nezáleží na tom, jestli budeš počítat síť ve 2D nebo 3D
určitě se vůbec nechceš zabývat výpočtem úhlů, stačí ti přece znát koncové body úsečky
1Pupik1989
Profil
Otočit to umím, na to jsem si udělal speciálně objekt pro matice. Jde o to, že třeba čtverec nebo obdélník umím rozdělit jen podle X a Y Už ale neumím podle Z. Bohužel je to asi jediná možnost, jak obrázek transformovat libovolně v prostoru.

Já vlastně vytvořím trojúhelník a přiřadím mu souřadnice v textuře. Takže jeden bod má proměnné x, y, z, u a v a po transformaci jen x,y,u,v.

Bohužel jsem na tom s myšlením tak blbě, že ani ten příklad nechápu.

Na ty stránky mrknu, děkuji.
peta
Profil
http://gyu.que.jp/jscloth/
Tohle je nahodou pekna hracka. Kliknutim na tu vlajku se to rozvlni :) Ale nevim, zda to resi tvuj problem nebo to tam maji napevno definovane, kde daji mrizku.
1Pupik1989
Profil
Už se v tom ztrácím, jsem z toho tupý ja poleno. Asi to budu muset vymyslet úplně jinak.
juriad
Profil
Asi nechápu o co se snažíš. Máš čtyři body v rovině, které reprezentují čtyřúhelník a ty na něj chceš namapovat texturu; k tomu potřebuješ provést triangulaci popsanou obrázkem nahoře, poté chceš výsledný čtyřúhelník vykreslil ve 3D.
Myslel jsem, že jen nevíš jak vypočítat vnitřní body čtyřúhelníku a úsečky jednotlivých trojúhelníčků. To jsem ve svém příspěvku snad popsal.

Napiš, co už máš a čeho se snažíš dosáhnout.
1Pupik1989
Profil
Mám krychly, mám funkci na počítání a násobení matic 4x4. Mám funkci na výpočet perspektivy z matice a vzdálenosti. Bohužel mi ale docvaklo, že to čtyřůhelník vždycky být nemusí. Mám dokonce napsanou i delónovu triangulaci. Chtěl jsem si jen ulehčit práci s definováním vnitřních bodů.

Jde o to, že už ani ten příklad nepochopím.
_es
Profil
1Pupik1989:
Niečo podobné sa riešilo v Canvas - Transformace obrázku ve třech osách.
1Pupik1989
Profil
Já vím, ale co si pamatuji, tak se vydedukovalo, že to nejde. Jenže ono to jde. Tenkrát nikdo o triangulaci nepsal a já se zaměřil na jiné zobrazení. Po dlouhé době jsem se ale vrátil k původnímu plánu a jsem rozhodnut to tentokrát pokořit.

//edit: tak teď mi teprve došlo, že si o tom psal. I transformaci mezi body mám. Já teď potřebuji jen vyplnit obrazec trojúhelníky kvůli jemnosti.
1Pupik1989
Profil
juriad:
Děkuji, už mi docvaklo co si tím příkladem zamýšlel. Nakonec se zadařilo.
1Pupik1989
Profil
Ještě mám jeden dotaz. Řešil někdo perspektivu v matici 4x4? Nemá někdo doporučení na nějakou rozumnou stránku?
1Pupik1989
Profil
Tak nakonec jsem to dokázal.


Pro mě tedy už uzavřeno. :)
juriad
Profil
1Pupik1989:
Gratuluji. Docela mi to připomíná naši úlohu na grafiku. Jen pro inspiraci, pokud bys chtěl generovat terén.
1Pupik1989
Profil
Jo, generovat terén bude potřeba, děkuji. Zatím mám jen pevně definované body a trojúhelníky pro test. Teď akorát vyměním trojúhelníky za delaunovu triangulaci ve 3d. Při počátečním generování to ušetří v kódu místo.

Ještě kamera mě zlobí. Její pozici nastavit umím, ale zorné pole už ne. Nemá s tím někdo zkušenost?
1Pupik1989
Profil
Opravdu nikdo neví? Četl jsem nějaké návody i na opengl, jenže marně. Mají definované nějaké vektory up, right a out, jenže jsem za boja nepřišel na to, kde je vzali. Dokonce jsem přepsal celou třídu Vector3, abych si to zjednodušil a pořád nic. Neleze mi to do hlavy.
juriad
Profil
můžu ti poslat svůj program v C#, který používá OpenGL; je to řešení zmíněné domácí úlohy 039terrain
možná by ti stačilo si jen projít repozitory s úlohami (potřebuješ k tomu svn-klienta)
svn checkout svn://cgg.mff.cuni.cz/grcis/trunk/

vektor out nejspíš směřuje ve směru pohledu kamery
vektory up a right je kolmé na out, udávají pozici (jak je natočená) kamery vzhledem k ose dané vektorem out
vektory up a right jsou navzájem kolmé
pro úplnou informaci o kameře je jeden z nich (out, up, right) redundantní: je vektorovým součinem ostatních

kus relevantního kódu:
    /// <summary>
    /// Camera setup, called for every frame prior to any rendering.
    /// </summary>
    private void SetCamera ()
    {
      Vector3 cameraPosition = new Vector3( 0.0f, 0, (float)upDownZoom.Value );

      Matrix4 rotateX = Matrix4.CreateRotationX( (float)-elevationAngle );
      Matrix4 rotateY = Matrix4.CreateRotationY( (float)azimuthAngle );

      cameraPosition = Vector3.Transform( cameraPosition, rotateX );
      cameraPosition = Vector3.Transform( cameraPosition, rotateY );

      GL.MatrixMode( MatrixMode.Modelview );
      Matrix4 lookAt = Matrix4.LookAt( cameraPosition, Vector3.Zero, up );

      GL.LoadMatrix( ref lookAt );
    }
1Pupik1989
Profil
No už jsem přišel na to, že up, right a out jsoum první 3 řádky v matici. Což bylo celkem podstatné. Kameře jsem vytvořil matici 4x4 s rotacemi a posunutím. Teď musím zjistit co dál. Vlastně ta matice je hodně podobná té v knihovně sylvester.

Mrknu na ten repozitář, třeba budu chytřejší, díky.

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: