Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 27. únor 2008, 22:09:53 Předmět: |
|
|
Augi napsal: |
Na ten sample v DirectX jsi se díval? Jakou chybu ti to hází? Není to náhodou NullReferenceException? A četl jsi vůbec dokumentaci? Ta mluví jasně ohledně toho parametru: Pointer to an ID3DXAllocateHierarchy interface. Tzn., že vytvoříš instanci třídy, která implementuje rozhraní ID3DXAllocateHierarchy a předáš ji jako parametr. Na té instanci nic nevoláš. |
Ano přesně tuto chybu mi to háže.. Na dokumentaci se snažím dívat stále ale nějak tam nechápu ten výklad, také trochu problém je že veškeré ukázky jsou psané v C++ tak mi chvylku trvá než se tim prokoušu, v C++ jen zatím ještě nedělal..
ps: Mohl by jsi sem hodit nějaký příklad, nebo trochu podrobněji to vysvětlit.. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 27. únor 2008, 22:20:16 Předmět: |
|
|
No tak tu chybu jsem jen tipl a to VB ani VB.NET vůbec neumím. Jako tohle jsou naprostý základy programování, že nemůžeš dereferencovat proměnnou, ve které je null (Nothing ve VB?).
Hodně podrobně je to celé popsáno v DX SDK v popisu samplu SkinnedMesh a také v popisu jednotlivých funkcí... |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 27. únor 2008, 22:38:16 Předmět: |
|
|
Augi napsal: |
No tak tu chybu jsem jen tipl a to VB ani VB.NET vůbec neumím. Jako tohle jsou naprostý základy programování, že nemůžeš dereferencovat proměnnou, ve které je null (Nothing ve VB?).
Hodně podrobně je to celé popsáno v DX SDK v popisu samplu SkinnedMesh a také v popisu jednotlivých funkcí... |
Ano to já také vím proč mi to padá na chybu, ale nevím jak proměnou typu AllocateHierarchy, mám nadefinovat, nebo vytvořit...
Také koukám na ten sampl, ale pokud správně chápu syntaxi C++, tak veškeré funkce týkající se AllocateHierarchy, jsou tam definované znovu a po svém, je ale možné že jsem se také spletl, už toho mám dnes přeci jen nějak dost  |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 28. únor 2008, 10:16:10 Předmět: |
|
|
Musíš si naprogramovat třídu, která bude implementovat rozhraní ID3DXAllocateHierarchy (tato třída tedy bude implementovat všechny metody, které ji toto rozhraní předepisuje implementovat). Do funkce LoadHierarchyFromFile pak pošleš instanci této třídy. To je celé.
P.S.: DirectX je objektově orientované API, takže pro jeho využívání je potřeba znalost OOP. Z Tvých dotazů se mi zdá, že v tomto trošku pokulháváš, takže bych určitě nastudoval z nějaké učebnice základy OOP (včetně dědění a virtuálních metod). Neber to jako nějaký navážení do Tebe, chci Ti jen dát dobrou radu... |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 28. únor 2008, 22:35:38 Předmět: |
|
|
Tak byla to celkem fuška, ale nakonec se mi povedl načíst soubor za pomcí netody LoadHierarchyFromFile.. Díky za dosavadní rady.
Nyní však mám další problém, potřebuji to samo sebou vykreslit. Co se týká samlu v Directx, dívám se do něho i do dokomentace, ale nějak moc moudrej z toho nejsem. Možná je problém v tom že se jen špatně dívám ale kdo ví.
Tak potřeboval bych nějaký hrubý postup co vše je nutné udělat pro vykreslení, ale pouze mnou načtené proměné typu AnimationRootFrame. Stačí alespoň začátek abych veděl kde mám začít hledat.. Díky |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 28. únor 2008, 23:25:05 Předmět: |
|
|
Funkce D3DXLoadMeshHierarchyFromX Ti v předposledním parametru vrací ukazatel na D3DXFRAME. V této struktuře je vždy ukazatel na následující frame na stejné úrovni hierarchie (pFrameSibling) a ukazatel na prvního potomka (pFrameFirstChild). Tímto způsobem je tedy popsána celá hierarchie. D3DXFRAME dále obsahuje položku pMeshContainer typu LPD3DXMESHCONTAINER, která popisuje vlastní geometrii, nastavení materiálu pro geometrii atd. Dalšími položkami D3DXFRAME je její jméno a dále velmi důležité - transformační matice pro daný frame (právě tato matice se mění během animace).
Hierarchii načtenou ze souboru si tedy můžeš představit jako strom (obecně je to les, ale to je detail), kde uzlem je vždy D3DXFRAME. Tato struktura obsahuje ukazatel na další uzel na stejné úrovni stromu a dále ukazatel na prvního potomka daného uzlu. Těmito ukazateli je tedy úplně popsána celá hierarchie načtená ze souboru. Dále každý uzel stromu (tedy D3DXFRAME) obsahuje informace o geometrii, použitých materiálech, efektech (shaderech) apod. Ty vlastní metody, které implementuješ pro rozhraní ID3DXAllocateHierarchy Ti právě slouží k tomu, aby jsi místo D3DXFRAME vracel nějakého potomka této struktury, do které si uložíš nějaké vlastní informace navíc (teď konkrétně mluvím o metodě ID3DXAllocateHierarchy::CreateFrame). Podobné je to s metodou ID3DXAllocateHierarchy::CreateMeshContainer. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 2. březen 2008, 14:02:44 Předmět: |
|
|
Augi napsal: |
Funkce D3DXLoadMeshHierarchyFromX Ti v předposledním parametru vrací ukazatel na D3DXFRAME. V této struktuře je vždy ukazatel na následující frame na stejné úrovni hierarchie (pFrameSibling) a ukazatel na prvního potomka (pFrameFirstChild). Tímto způsobem je tedy popsána celá hierarchie. D3DXFRAME dále obsahuje položku pMeshContainer typu LPD3DXMESHCONTAINER, která popisuje vlastní geometrii, nastavení materiálu pro geometrii atd. Dalšími položkami D3DXFRAME je její jméno a dále velmi důležité - transformační matice pro daný frame (právě tato matice se mění během animace).
Hierarchii načtenou ze souboru si tedy můžeš představit jako strom (obecně je to les, ale to je detail), kde uzlem je vždy D3DXFRAME. Tato struktura obsahuje ukazatel na další uzel na stejné úrovni stromu a dále ukazatel na prvního potomka daného uzlu. Těmito ukazateli je tedy úplně popsána celá hierarchie načtená ze souboru. Dále každý uzel stromu (tedy D3DXFRAME) obsahuje informace o geometrii, použitých materiálech, efektech (shaderech) apod. Ty vlastní metody, které implementuješ pro rozhraní ID3DXAllocateHierarchy Ti právě slouží k tomu, aby jsi místo D3DXFRAME vracel nějakého potomka této struktury, do které si uložíš nějaké vlastní informace navíc (teď konkrétně mluvím o metodě ID3DXAllocateHierarchy::CreateFrame). Podobné je to s metodou ID3DXAllocateHierarchy::CreateMeshContainer. |
Tak pokud jsme vše správně pochopil a napsal, tak by se dalo říct že pro vykreslení se pouřívá rekurzivní funkce, neboť tato funkce volá sama sebe s následujícim parametrem..
Tímto také postupuji na další problém, při psaní kódů jsem "opisoval" hnedz několika zdrojů, proto je možné že jsem někde udělal chybu.. Nyní mám problém takový, vše se mi v pořádku načte ale nevykreslí..
Abych byl přesnější, pokud načnu nějaký soubor.x který má jednu texturu a je složen z jednoho objektu (např tiger.x ze sdk directx) vše se zobrazí správně, ale pokud načtu nějaký složitější objekt např airplane 2.x také z sdk, zobrazí se mi pouze kolečka letadla a ani nemají správnou barvu. Už se to snažím nějak kontrolovat celkem dlouho ale na závažné hcyby jsem nepřišel. Nenapadá Vás kde by mohla být chyba? Popř v čem, vím že bez kódu se to těžko říká, ale snačí alespoň nějaký nápad co bych měl překontrolovat znovu.
ps: Vím že jsem chtěl vykreslit animace, ane napřed se snažím touto metodou vykreslit obyčejný 3Dobjekt a až mi toto bude chotit, vrhnu se na vykreslení animace  |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 2. březen 2008, 14:38:43 Předmět: |
|
|
Juraj napsal: |
Tak pokud jsme vše správně pochopil a napsal, tak by se dalo říct že pro vykreslení se pouřívá rekurzivní funkce, neboť tato funkce volá sama sebe s následujícim parametrem.. |
Jo, je to tak. Pro vykreslování se dá pěkně použít rekurzivní funkce.
Juraj napsal: |
Tímto také postupuji na další problém, při psaní kódů jsem "opisoval" hnedz několika zdrojů, proto je možné že jsem někde udělal chybu.. Nyní mám problém takový, vše se mi v pořádku načte ale nevykreslí..
Abych byl přesnější, pokud načnu nějaký soubor.x který má jednu texturu a je složen z jednoho objektu (např tiger.x ze sdk directx) vše se zobrazí správně, ale pokud načtu nějaký složitější objekt např airplane 2.x také z sdk, zobrazí se mi pouze kolečka letadla a ani nemají správnou barvu. Už se to snažím nějak kontrolovat celkem dlouho ale na závažné hcyby jsem nepřišel. Nenapadá Vás kde by mohla být chyba? Popř v čem, vím že bez kódu se to těžko říká, ale snačí alespoň nějaký nápad co bych měl překontrolovat znovu. |
No těžko takhle od boku střelit, kde bude chyba. To už si asi budeš muset nějak oddebugovat sám.
Nejdřív bych zjistil, jestli se hierarchie správně načte ze souboru. Jestli používáš nějaké kvalitnější IDE, tak by mělo stačit si dát breakpoint za volání funkce D3DXLoadMeshHierarchyFromX a proklikat si, jestli sedí počet a názvy framů ve vrácené hierarchii. Pokud to nesedí, tak bych se asi zaměřil na metody, které jsi implementoval pro rozhraní ID3DXAllocateHierarchy (např. je zkusit nahradit nějakým triviálním tělem).
Pokud je hierarchie načtená korektně, tak bych zkusil v té Tvé vykreslovací funkci udělat výpis na konzoly nebo do nějakého logu (např. si tam zapsat název Framu, který vykresluješ). Tím zjistíš, jestli tu hierarchii správně procházíš.
Teď mě napadá, že by mohl být zádrhel ještě v jedné věci. Struktura D3DXFRAME totiž obsahuje člen TransformationMatrix. Toto je imho pouze lokální transformační matice, tedy definuje posun/rotaci/scale vůči nadřazenému framu. Abys dostal správnou world matici pro daný frame, musíš si v každém framu držet také globální matici. Tu vypočítáš jednoduše jako součin globální matice nadřazeného framu a lokální matice daného framu. Z toho mimo jiné vyplývá, že pokud dojde ke změně matice v nějakém framu, tak musíš přepočítat globální matice ve všech potomcích daného framu.
Globální matici framu, který nemá žádného předka, vypočítaš jako součin world matice objektu (jak je celý objekt posunutý/orotovaný/...) a lokální matice. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 2. březen 2008, 21:19:58 Předmět: |
|
|
Tak konečně problém vyřešen, IDE mám celkem slušné a breakpoint a klik jsem dělal už před tím, ale nevšiml jsem si že se mi neukládají textury, všecno bylo vytvořené správně jen tam něco chybělo. Stačilo výsledý nesh, nedefinovat jako globální proměnou pro třídu AllocateHierarchy, ale pouze pro danou metodu CreateMeshContainer. Tak nyní se jdu vrhnout na animace, to už bude asi trochu težší, pevně veřím že se ještě určitě ozvu  |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 2. březen 2008, 21:45:59 Předmět: |
|
|
No dodělat tam ty animace zas tak hrozný nebylo. Ten AnimationController vlastně jen mění ty lokální matice jednotlivých framů a určuje, jakým způsobem se na poloze jedné kosti podílí matice ostatních kostí. Ale tohle si už fakt moc nepamatuju, takže to budeš muset vykoukat z DX SDK  |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 4. březen 2008, 21:53:08 Předmět: |
|
|
Tak ty animace nejsou zase až tak jednoduché, jak jsem si myslel.. No ale nyní jsme se dostal na chybu a opravdu nevm co s tím, už jsem zkoušel debugovat a na nic jsem nepřišl. Nevíte co s tím??
chyba
System.AccessViolationException was unhandled
Message="Došlo k pokusu o čtení nebo zápis v chráněné paměti. Zpravidla se jedná o indikaci, že došlo k poškození další paměti."
Source="Microsoft.DirectX.Direct3DX"
StackTrace:
v Microsoft.DirectX.Direct3D.BaseMesh.DrawSubset(Int32 attributeID)
v WindowsApplication1.Cdraw.DrawMeshContainer(CCustomMeshContainer mesh, CCustomFrame parent) v G:\VB\Game\Engine\frmHlavni.vb:řádek 341
v WindowsApplication1.Cdraw.DrawFrame(CCustomFrame fr) v G:\VB\Game\Engine\frmHlavni.vb:řádek 285
v WindowsApplication1.Cdraw.DrawFrame(CCustomFrame fr) v G:\VB\Game\Engine\frmHlavni.vb:řádek 291
v WindowsApplication1.Cdraw.DrawFrame(CCustomFrame fr) v G:\VB\Game\Engine\frmHlavni.vb:řádek 291
v WindowsApplication1.frmHlavni.Render() v G:\VB\Game\Engine\frmHlavni.vb:řádek 164
v WindowsApplication1.frmHlavni.hlForm_Paint(Object sender, PaintEventArgs e) v G:\VB\Game\Engine\frmHlavni.vb:řádek 254
v System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
v System.Windows.Forms.Form.OnPaint(PaintEventArgs e)
v System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
v System.Windows.Forms.Control.WmPaint(Message& m)
v System.Windows.Forms.Control.WndProc(Message& m)
v System.Windows.Forms.ScrollableControl.WndProc(Message& m)
v System.Windows.Forms.ContainerControl.WndProc(Message& m)
v System.Windows.Forms.Form.WndProc(Message& m)
v System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
v System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
v System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
v System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
v System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
v System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
v System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
v System.Windows.Forms.Application.Run(ApplicationContext context)
v Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
v Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
v Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
v WindowsApplication1.My.MyApplication.Main(String[] Args) v 17d14f5c-a337-4978-8281-53493378c1071.vb:řádek 81
v System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
v System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
v Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
v System.Threading.ThreadHelper.ThreadStart_Context(Object state)
v System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
v System.Threading.ThreadHelper.ThreadStart() |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 4. březen 2008, 22:58:32 Předmět: |
|
|
Tak to chce jít do Start -> Programy -> Microsoft DirectX SDK -> DirectX Utilities -> DirectX Control Panel a tam zapnout debug verze DirectX knihoven. Když pak povolíš v projektu debugování unmanaged kódu (ve vlastnostech projektu), tak se Ti bude do Output okna vypisovat přesnější popis chyby. Takhle těžko hádat... |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 5. březen 2008, 20:15:55 Předmět: |
|
|
Tak a teď trocu z jiné soudku...
1) Když vykresluji mapř model tiny.x z SDK, kolikrat mi na jedno vykreslení má proběhnout metoda DrawSubset()? Nějak nevím jak ty proměné mají vypadat a poté se mi zde dost špatně hledají chyby..
2) K čemu slouží vlastnost AnimationController, asi je to špatně ale zatím jsem ji nikde nepoužil..?
Abych byl přesný, něco už to vykresluje, ale místo chodícího člověka, tam mam jakousi snůžku objektů zaplácaných do sebe které se nijak nepohybují.. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 5. březen 2008, 20:37:08 Předmět: |
|
|
1) Teoreticky by to měla být suma přes všechny framy, které mají pMeshContainer různý od NULL, ve které bys sčítal počet materiálů v MeshContaineru.
2) Abys posunul animaci dál, musíš zavolat metodu ID3DXAnimationController::AdvanceTime. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 9. březen 2008, 22:22:53 Předmět: |
|
|
Tak animace kompletně hotové, jak jinak než hurá a všem díky...
Měl bych další otázku, není to až tolik o animacích, ale co.. Pokud se vytváří nějaká 3D oblast, myslím např něco jako jako jedna mapa v nějaké 3D hře. Z hlediska engine, tento prostor by se dal chápat jako jedna obrovská kostka, která má své hranice, je plná nějakých objektů a můžeme se v ní kamerou pohybovat... Tak:
1) co se týká nastavení, zda daný objekt (např. hráč) může nějaký objekt projít/ neprojít, vyjí/nevyjít, tak o toto se stará nějaké nastavení objektů (modelů), nebo se prostě bude počítat kde se zrovna daný hárč nachází a zda je tam nějký objekt který se dá projít/neprojít atd..
2) jak vykreslím na hranu prostoru "kostky" nějaké textury? Musím tam nandat nějaké 3D otexturované objekty, nebo je nějaká možnost jak otexturovat hranice prostoru "kostky"??
předem díky za odpovědi |
|
Návrat nahoru |
|
 |
|