Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 11. září 2008, 15:05:35 Předmět: Sphere UV |
|
|
Mám takový trapný dotaz potřeboval bych vypočítat UV koordináty pro mapování textur ze souřadnic vertexů koule, takovým způsobem, aby byla na celou kouli natažena jedna textura právě jedenkrát. Buď mám špatně vzoreček nebo ještě neco jiného. Kód sem vkládat radši ani nebudu. (nevím jestli to tu už nebylo - nicméně sem to tu nenašel). |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 11. září 2008, 15:11:15 Předmět: |
|
|
mno jednak napis jak si delas kouli - jestli si ji pocitas sam - nebo jako gluSphere
gluSphere ma totiz problem ze spatne resi poly - smrskava je
ale jinak v noci pohledam zapoctak ze skoly kde jsem mapoval na kouli nejakou texturu zemekoule |
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 11. září 2008, 15:23:14 Předmět: |
|
|
Nikdy sem kouli netexturoval a tak sem to chtel proste zkusit, takze ten kod je trosku prasarna...
kód: |
//vytvoření
m = Mesh.Sphere(d3dDevice, 0.02f, 10, 10);
//výpočet UV
//v cyklu pochopitelně (verts - PositionNormal, verts1 - PositionNormalTextured):
verts1[i].Position = verts[i].Position;
verts1[i].Normal = verts[i].Normal;
verts1[i].Tu = verts1[i].X / (float)Math.Sqrt(Math.Pow(verts1[i].X, 2) + Math.Pow(verts1[i].Y, 2) + Math.Pow(verts1[i].Z, 2));
verts1[i].Tv = verts1[i].Y / (float)Math.Sqrt(Math.Pow(verts1[i].X, 2) + Math.Pow(verts1[i].Y, 2) + Math.Pow(verts1[i].Z, 2));
|
ještě přiložím obrázek textury a výsledné otexturování
|
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 20. září 2008, 10:09:52 Předmět: |
|
|
Takže opravdu nikdo neví, jak otexturovat kouli? |
|
Návrat nahoru |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 20. září 2008, 10:42:12 Předmět: |
|
|
Vzato kolem a kolem, koule se texturuje hrozne blbe - ono rozumne natahnout ctverec na vec, ktera nema nikde zadnou hranu, proste nejde. Takze si musis vybrat nerozumny zpusob, jakym to udelas... nejsem grafik, takze nevim co pouzivaji oni, ale ja bych zvolil asi klasicky "atlasovy" zpusob, kde z textury udelas valec kolem te koule a pak to na ni prilepis (podobne jako to je u mapy sveta, kde je potreba obrazek koule natahnout na stranku).
To, co potrebujes, je prevest souradnice bodu z 3D kartezskych (tj. x, y, z) na polarni (tj. uhly na kouli) a pak upravit tak, aby ti sedely do rozmeru textury. Prevod provedes tak, ze si pro kazdy bod urcis, o jaky uhel je natoceny od pocatku soustavy souradnic (tj. treba od vektoru (1, 0, 0)) podle osy Y a podle osy Z. Tim dostanes dve cisla (dva uhly), ktere ti urci pozici v texture. Reci cisel
kód: |
U = atan(z/x) [resp. PI/2 pro x = 0 a z > 0, -PI/2 pro x = 0 a z < 0]
V = atan(y/x) [resp. PI/2 pro x = 0 a z > 0, -PI/2 pro x = 0 a z < 0]
|
kde x,y,z jsou souradnice toho bodu, pro ktery pocitas pozici textury (s tim, ze predpokladam, ze stred koule je v (0, 0, 0)). Vysledek jsou dve cisla bud v radianech nebo ve stupnich, ktere si podle toho vydelis bud 2PI, nebo 360.
Texturove koordinaty byvaji mezi 0 a 1 (v OpenGL urcite, v DX asi taky), takze tim jsi hotovy. _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 20. září 2008, 16:10:36 Předmět: |
|
|
ondra - promitnuti valce dost zkresluje imho
ja to minule delal tak ze natahnes ctverec na kouli - akoratze to mrsi poly - takze udelas fintu - a posledni usek od posledni rovnobezky udelas jako triangle-fan - cimz sice prijdes o cast dat, ale vypada to lip - protoze to neni tak rozmaznuty |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 20. září 2008, 19:35:31 Předmět: |
|
|
1) Buď to dělat mapováním válce na kouli, jak řekl ondrasej.
2) Nebo jako krychli, tzn. máš 6 textur a z každé strany jednu plácneš. Na to se hodí cubemapa, kde jenom zadáš těch 6 textur, jako koordináty použiješ normály té koule a máš to hotový. Žádný koordináty v tomto případě netřeba počítat, je to jednoduché a přímočaré řešení. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 20. září 2008, 22:09:14 Předmět: |
|
|
No vida že to jde sice se mi ještě ani jedno řešení nepodařilo realizovat (nevím co dělám špatně), ale díky všem... budu na tom pracovat až do úplněho pochopení |
|
Návrat nahoru |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 21. září 2008, 09:42:53 Předmět: |
|
|
rezna> jak jsem psal... namapovat ctverec na kouli bez deformace jde fakt spatne _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 21. září 2008, 23:32:04 Předmět: |
|
|
Ale namapovat 6 textur na kouli jde krásně, viz např. obloha/pozadí/skybox/skydome/whatever ve hrách. Pokud by si chtěl někdo toto řešení s cubemapou naprototypovat, dá se použít RenderMonkey, tam se to dá naklikat do minuty a snadno se pochopí princip. Vlastní implementace v kódu pak bude jasnější. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
|