Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 1. únor 2010, 18:16:54 Předmět: Normaly u framovanych modelu |
|
|
Zdarec,
delam na framovych animacich a bohuzel jsem se setkal s problemem, ze kdyz exportnu nejaky primitivum z maxu (kostka,koule...etc) tak se mi normaly nespocitaji dobre. Ale modely z her jako Q2, CS:S a podobne co jsem zkousel tak se spocitaji spickove. Stalo se vam to? Nebo jsem u toho zase ocas a mam nekde blbe nastavenej max nebo napsanej kod? Vim mozna to patri do sekce 3D grafika ale pokud se to moderatorum nelibi tak at to prehodi.
kody vypoctu normal: http://nopaste.ceske-hry.cz/222878
struktura vec3: http://nopaste.ceske-hry.cz/222879
ms script: http://nopaste.ceske-hry.cz/222880
jen pozn. v fcich u vec3 by nemel byt problem protoze je pouzivam jinde a funguji spickove.
diky moc za pomoc.
EDIT: chyba byla v CrossProduktu - prohozeny promenny ale porad to nevyresilo problem. Vsechno funguje krome krychli, krychle ma dycky osvetlenej vrsek a spodek.
Jeste pro upresneni, cokoliv co ma okolo 12facu se nespocita. Tudiz slozity modely sou bez problemu |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 2. únor 2010, 10:40:29 Předmět: |
|
|
Jak ta krychle vypadá?
Počítáš s tim, že máš v rohu krychle 3 vertexy, ne jeden?
Stejně bych si dovolil navrhnout ti jiný řešení, poněvadž tvoje počítá pouze ploché stínování.
Exportuj normály už z maxu a interpoluj je stejně jako ty vertexy (normalizace je samozřejmě stále nutná). Bude to rychlejší na výpočet a budeš mít normály přesně jak ti je nastaví grafik. Tu normalizaci můžeš udělat ve vertex shaderu, což bude rychlejší. Samozřejmě tohle řešení má větší paměťový nároky. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 2. únor 2010, 10:57:23 Předmět: |
|
|
Semo: ano mas pravdu ze je to pomalejsi ale kdyz normaly vyexportuju z maxe, tak sou jeste horsi nez ted - zkousel jsem si s tim hrat ale z tech vyslednych vyexportovanych normal se mi budou blbe pocitat tangenty etc.. Predevsim u krychle je ten stejnej problem. Krychle vzdycky maji osvetlenou jenom vrchni a spodni stranu. Tyto normale pocitam stejne jenom kvuli perpixelu - v tom kodu neni prepocet tangent a bitangent ale to neni potrebny protoze se to nevztahuje k problemu.
kód: |
VertA.x = object[o].interpverts[object[o].face[n].a].x; //Prvni vertex
VertA.y = object[o].interpverts[object[o].face[n].a].y;
VertA.z = object[o].interpverts[object[o].face[n].a].z;
VertB.x = object[o].interpverts[object[o].face[n].b].x;//Druhej vertex
VertB.y = object[o].interpverts[object[o].face[n].b].y;
VertB.z = object[o].interpverts[object[o].face[n].b].z;
VertC.x = object[o].interpverts[object[o].face[n].c].x;//Treti vertex
VertC.y = object[o].interpverts[object[o].face[n].c].y;
VertC.z = object[o].interpverts[object[o].face[n].c].z;
vec3 v1 = VertB - VertA; //odectu druhej od prvniho
vec3 v2 = VertC - VertA; odectu treti od prvniho
vec3 normal = Normalize(Cross(v2,v1)); vycrossuju a znormalizuju
|
takze si myslim ze mam 3 vertexy do jednoho rohu.
 |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 2. únor 2010, 13:50:14 Předmět: |
|
|
Tak leda tohle:
Máš 8 vertexů (opravdu fyzicky 8 vertexů v bufferu). Chceš kreslit krychli, která má per-face normály, ale aplikuješ je per vertex. Uložíš 8 normál pro 8 vertexů a je tu chyba, protože jich má bejt 24 (V každým rohu kostky 3).
Může to být tohle? Jinak už nevím a navrhuju použít debug vykreslení normál. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 2. únor 2010, 14:26:34 Předmět: |
|
|
]semo[ napsal: |
Tak leda tohle:
Máš 8 vertexů (opravdu fyzicky 8 vertexů v bufferu). Chceš kreslit krychli, která má per-face normály, ale aplikuješ je per vertex. Uložíš 8 normál pro 8 vertexů a je tu chyba, protože jich má bejt 24 (V každým rohu kostky 3).
|
jo to bude ono. Pogooglim jak se pocitaji normaly per vertex a napisu. |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 2. únor 2010, 15:28:11 Předmět: |
|
|
Ja je teda pro vrcholy počítal tak, že jsem sečetl normály sousedících polygonů. Nicméně u té krychle a podobných tvarů člověk většinou nechce, aby mu to takhle automaticky "smoothovalo" na hranách. Automatické řešení je zvolit si mezní úhel, od kterého to nesmoothuje (to znám třeba z Lightwave SDK), ruční řešení je např. smoothing groups od grafika. _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 2. únor 2010, 15:42:52 Předmět: |
|
|
Per vertex normály ti sežerou další výkon. Je skutečně lepší interpolovat už hotový normály. Pokud ti to ale opravdu nevyhovuje a chceš je mít per-face, tak bude nejrychlejší mít všechny vertexy duplikované právě tolikrát, kolik faců ho sdílí. Vzhledem k architektuře grafických karet nemůžeš snadno použít dva index buffery (jeden pro vertexy, druhej pro normály) - což by bývalo bylo ideální.
Jestli se bojíš špatných dat (kvůli tangent space), tak bys mohl interpolovat již hotový normály, ale předpřipravit si je sám při nahrátí modelu, ne vzít exportovaný z maxe. Při tom nahrávání ošetříš všechny chybový případy a duplikuješ pouze ty vertexy, který jsou potřeba. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 4. únor 2010, 12:09:46 Předmět: |
|
|
Semo: predpokladam ze predpocitanejma normalama myslis normaly pro kazdej fram v souboru si predpocitat v programu a ty normaly mezi sebou interpolovat ze? Mel jsem to takhle a rozdil zadnej. Ani zvyseni fps / rychlosti nacitani. Ted k problemu ty normaly mi zatim takhle postacuji ale potrebuju k tangentam a bitagnentam UV koordinaty. Samozdrejme ze je v tom hacek - kdyz exportuju z maxu tak na me vyzkoci hlaska "mesh tvertex out of range 605". To se stava jenom u slozitejsich modelu. U jednoduchych modelu se to nestane ale zase jsou spatne vyexportovany tex.koordinaty - predpokladam ze pro ty potrebuju taky nejakej index. A ted uz se opravdu nechytam. Ty koordinaty se musi exportovat zvlast nebo co? jsem z toho solidne jelen
PS. google mi na tu hlasku rekl uplny prd. Napadlo me ze ten model nema tex. koordinaty ale zkousel jsem render a ma na sobe normalne namapovanou texturu takze tam problem nebude. |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. únor 2010, 12:46:38 Předmět: |
|
|
citace: |
predpokladam ze predpocitanejma normalama myslis normaly pro kazdej fram v souboru si predpocitat v programu a ty normaly mezi sebou interpolovat ze? Mel jsem to takhle a rozdil zadnej. |
Jestli je počítáš stejným způsobem, tak budou i stejně špatně.
Pro export UV v maxu musíš použít indexy, který ti vrátí funkce getTVFace (tak nějak se asi jmenuje). Ve výsledku je to složitý, protože máš facy geometrický a facy texturový. Dělal jsem to tak, že sem exportoval pro každý trojúhelník fyzicky 3 vertexy a 3 UV koordináty, takže počet vertexů byl vždy 3*počet trojúhelníků. Tim se ti zjednoduší exporter. Takovýhle data jsou ale naprd, protože pro optimální běh potřebuješ, aby trojúhelníky vertexy sdílely (u interpolace geometrie to platí ještě víc). Proto byla v mým systému zařazena ještě command line utilita, která se při exportu z maxu automaticky spustila a vyházela duplicitní vertexy a upravila index buffer. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 4. únor 2010, 12:51:55 Předmět: |
|
|
]semo[: no zkousel jsem nejaky pokusy a znas fci "at time x"? problem je v ni, kdyz ji nepouziju a vyexportuju statickej objekt tak nejsou problemy s texturama a ani s normalama..Jelikoz ted se mi vyexportuje 20 vertexu a 12 facu (predtim 8,12) a diky tomu mi funguji normaly a tex. koordinaty. Takze bud nekde delam chybu nebo neexistuje jeste nejaka jina volba jak to vyexportovat framove bez te fce? |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. únor 2010, 13:12:29 Předmět: |
|
|
Je to možný, že to bez "at time" funguje, ale správný je použít getTVFace. Aspoň doufám, používal jsem to. Zkus pohledat v nápovědě od MaxScriptu. Případně se inspiruj v nějakým cizím exporteru. Víc už ti asi neporadím. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 4. únor 2010, 13:14:14 Předmět: |
|
|
jn, podivam se ale moc toho neni. Nevim jestli se na to nevykaslu a neudelam kosti |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. únor 2010, 13:37:06 Předmět: |
|
|
Celkem doporučuju exportovat to tak, jak sem psal: Z maxu jednoduše a funkčně, ale s následným preprocessem. Výhoda je, že ten preprocess můžeš napsat až později, až bude potřeba optimalizovat. Neni to žádnej hardcore a budeš mít dobrej pocit z toho, že máš "čistý" data. To že se max občas chová podivně, to se ví. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 4. únor 2010, 15:39:09 Předmět: |
|
|
]semo[: vyresil jsem to timhle
kód: |
for v = 1 to tmesh.numverts do
(
local TexFaces = (meshop.getFacesUsingVert tmesh v) as array
local TexVert = 0
local MeshFace = getFace tmesh TexFaces[1]
local MappingFace = meshop.getMapFace tmesh 1 TexFaces[1]
if MeshFace.x == v then(
TexVert = MappingFace.x
) else if MeshFace.y == v then(
TexVert = MappingFace.y
) else (
TexVert = MappingFace.z
)
local VertUVW = meshop.getMapVert tmesh 1 TexVert
vert = getVert tmesh v
format "\nv % % % % %" (vert.x*-1) (vert.y) (vert.z) (VertUVW.x) (VertUVW.y*-1.0+1.0) to:out_file
)
|
normaly takle jak jsou mi bohate staci protoze pri perpixelu neni problem a jak jsem rikal ogl svetlo budu pouzivat jenom pri vypnutym bumpmappingu atd. Pri modelech +12 facu se neda poznat ze je nekde problem takze to neresim. |
|
Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. únor 2010, 16:02:20 Předmět: |
|
|
A to skutečně funguje? Co když budeš mít u jednoho vertexu 2 nebo víc texturových koordinátů? _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
 |
|