>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Doomoidní techniky <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Začneme Wolfem ... kdo z vás ho nikdy neviděl ? Ze nikdo ? No tak to půjde snadno. Jak si osobně vzpomínám, Wolf byl takovej svět složenej z kvádrů a neměl ani strop ani podlahu (myslim). Když ale nejste obyčejní pařani, který koukaj kde by koho sundali, sestřelili, zavraždili (vrrrr ... kdo dá se mnou Dooma ?), všimnete si, že se systémem mapování textur uvedeným výše na tuhle gamesu prostě nemáte (rychlostně)... Kde je rozdíl ? No v tom, že ta předešlá pracuje s polygonem definovaným dvěma vektory, kdežto taková nevinná zeď ve Wolfovi je spíš lichoběžník : A takle vypadaj zdi ve Wlkovi Už je to vidět ? Takže musíme "vymyslet" jinou metodu. Výhoda zdi je ta, že má dvě strany paralelní. A to prostě nejde toho nezneužít. Ale jak ? Dost napoví další obrázek : Nějakej Karel nebo co Celý fígl je v tom, že si vydělíme X-velikost textury velikostí max_x (= a), uděláme smyčku, v níž půjdeme od bodu s nejmenším X do bodu s největším X. No a potom nenásleduje nic jiného, než pro každé X najít body y1 a y2 , odečíst je od sebe (větší od menšího) a vydělit to Y-velikostí textury (=b). Následuje další smyčka, a to od y1 do y2. Každé y mezi těmito dvěmi vynásobíme číslem b, a každé x číslem a. Získáme tak odpovídající souřadnice tohoto pixelu v textuře. Kód by moh vypadat takhle : ... zjisti minimální x (=minx) ; zjisti maximální x (=maxx) ; deltaX = maxx - minx ; def_koef_X = X_velikost_textury / deltaX ; for I = 0 to deltaX do { pro J spočítej Y1 a Y2 // viz poznámka deltaY = (Y2 - Y1 ) ; def_koef_Y =Y_velikost_textury / deltaY ; for J = 0 to deltaY do { oriY = J * def_koef_Y ; oriX = I * def_koef_X ; putpixel ( I+minx , J+miny , textura[oriY,oriX] ); // předpokládám, že textura je dvourozměrné pole } } Poznámka : Možná není úplně jasné, jak vypočítat ty proklaté body y1 a y2 ... Vysvětlení je jednoduché : Každá přímka má svojí obecnou rovnici (tzn. něco ve tvaru ax + by + c = 0, kde čísla a,b jsou souřadnice normálového vektoru na tuto přímku. Parametr c lze vypočítat tak, že do rovnice dosadíme nějaký bod ležící na přímce (já nevim, třeba jeden z vrcholů polygonu)). Jakmile máme rovnici kompletní, zůstávejí jen dvě neznámé - x a y . Ale nám tam zbyde jen jedna, neboť X známe. Můžu jí zkusit napsat : mějme přímku, která vede z bodu [x1,y1] do bodu [x2,y2]. Potřebujeme pro jakýkoliv X-bod vypočítat Y souřadnici : obecná rovince: ax + bx + c = 0 směrový vektor přímky: (x2-x1, y2-y1) normálový vektor: (y2-y1, x1-x2) a tedy: (y2-y1)*x + (x1-x2)*y + C = 0 dosadíme třeba bod 1 (můžeme klidně i bod 2): C = - (y2-y1)* x1 - (x1-x2) * y1 no a dostaneme: (y2-y1)*x + (x1-x2)*y - (y2-y1)*x1 - (x1-x2)*y1 = 0 redukce: (y2-y1)*(x-x1) + (x1-x2)*(y-y1) = 0 a vypočtem Ypsilon : (y2-y1)*(x-x1) Y = --------------------- + Y1 (x1-x2) Myslím, že by to nemělo dělat problémy. No a pokud si dobře vzpomínám (jako že jo), tak v Doomu už byly i podlahy a stropy. Co že je na nich tak těžkého ? Vůbec nic. Je to jenom obdoba zdi s tím, že je o 90 stupňů otočená. Takže se akorát "jede" po Y souřadnicích a počítaj se iXový. That's all. Ještě poznámka : výše uvedený algoritmus není optimalizován ; dalo by se tak udělat vyhozením pár věcí před cyklus a nahradit násobení permanentním přičítáním. Když to "řácky" vyšperkujete, dostanete slušně rychlý algoritmus ... a Doom III. může být váš ... výheň