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: 6. prosinec 2007, 14:01:13 Předmět: Pohyb samostatnych 3D objektu |
|
|
Potřeboval bych radu,
chtěl bych si pro začátek vytvořit editor, kde si v prostoru budu umisťovat jednotlive 3D objekty. Jde mi o to co je nejlepší používat. Už jsem si vykreslil mesh nacteny z .x souboru ale dostal jsem se k problemu ze neivm jak pohybovat s jednotlivym objektem. Vsude jsou priklady jak pohybovat pouze s matici worldu. Neco uz jsem si cetl i o HLSL.
Tak abych to shrnul, potřebuji spíše radu a nějaký stučný návod jak otáčet jednotlivé meshe bez toho abych musel transformovat matici worldu. Nevím kde mám začít hledat.
Doufam že jem můj problém alespoň trochu srozumitelně nastínil, v Direct 3D začínám. |
|
Návrat nahoru |
|
 |
tempicek

Založen: 04. 12. 2007 Příspěvky: 62
|
Zaslal: 6. prosinec 2007, 14:09:44 Předmět: Re: Pohyb samostatnych 3D objektu |
|
|
Pokud uz umis hybat s objektem pomoci world matice, tak Ti zbyva pouze tu matici spravne sestavit. Mohu to tu rozebrat vice, ale myslim, ze nejjednodussi pro Tebe bude pouzit funkci D3DXMatrixTransformation, ktera ma spoustu parametru, ale Tebe zajima jen par z nich, pro zacatek nejspis pouze Translation vektor. Ten nastavis podle toho, kam chces objekt ve scene umistit, tzn. napriklad
kód: |
D3DXVECTOR3 vec3 = { 100, 200, 300 };
D3DXMatrixTransformation( ...., &vec3 );
|
umisti ten Tvuj objekt do svetovych souradnic x=100, y=200, z=300.
Pak si muzes hrat s rotacemi, potrebujes-li.
Doufam, ze to bylo to, co jsi hledal... |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 6. prosinec 2007, 14:12:05 Předmět: |
|
|
S objekty se manipuluje ale právě pomocí world matice. Kdybys to chtěl dělat jinak, tak jedině přes modifikaci vertexů, což by bylo strašně pomalý. Takže pozici/rotaci/scale objektu měň určitě pomocí world matice. Tahle matice může být samozřejmě pro každý objekt jiná, tzn. že před vykreslením každého objektu nastavíš odpovídající world matici. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 6. prosinec 2007, 14:18:02 Předmět: |
|
|
Takže jsem to asi spravně pochoil. Něco o manipulovaní přímo s vertexy jsem čelt v tom HLSL.
A další dotaz , pokud budu nastavovat matice worldu před vykreslením meshe, nebude to nějak extra pomalé, např úři vykrelsování cca 100 jednodušších objektů? |
|
Návrat nahoru |
|
 |
tempicek

Založen: 04. 12. 2007 Příspěvky: 62
|
Zaslal: 6. prosinec 2007, 14:30:25 Předmět: |
|
|
To je bezny postup, takze to bude tak pomale, jak to byva vzdycky Par tisic jich za frame zvladnes bez problemu. |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 6. prosinec 2007, 14:33:20 Předmět: |
|
|
tempicek napsal: |
To je bezny postup, takze to bude tak pomale, jak to byva vzdycky Par tisic jich za frame zvladnes bez problemu. |
Chtěl bych si uděla takovou 3D scénu, ale i s nějakými efekty aby nebyla jak mrtvá. Tak jsem se ptal jak na to abych to v půlce nemusel předělávat na jinej spůsob. A ještě jedna věc, takže vždy před vykreslením jednotliveho meshe mu nastavim danou matici world. Pak dalsi a zase jinou matici.
Pochopil jsem to správně? |
|
Návrat nahoru |
|
 |
tempicek

Založen: 04. 12. 2007 Příspěvky: 62
|
Zaslal: 6. prosinec 2007, 14:39:30 Předmět: |
|
|
Myslim, ze jsi to pochopil spravne, ale ja to napisi radeji strukturovane, aby to bylo jasne:
Begin Frame 1
SetWorldMatrix( obj1 );
Draw( obj1 );
SetWorldMatrix( obj2 );
Draw( obj2 );
...
End Frame 1
Begin Frame 2
SetWorldMatrix( obj1 );
Draw( obj1 );
SetWorldMatrix( obj2 );
Draw( obj2 );
...
End Frame 2
No a obcas je potreba tu matici jeste aktualizovat, ale to zpravidla nedelas pro kazdy objekt kazdy snimek.[/code] |
|
Návrat nahoru |
|
 |
Peta

Založen: 28. 07. 2007 Příspěvky: 154 Bydliště: V prvnim patre hned vedle koupelny.
|
Zaslal: 6. prosinec 2007, 15:29:15 Předmět: |
|
|
Já jen dodám, že až tam budeš chtít přidat rotace, je nutné si uvědomit, že není jedno, zda objekt nejdřív posuneš a pak otočíš nebo opačně. Obojí vede k úplně jiným výsledkům. Nevím přesně jak je to realizováno v DX (co se týče programování), protože jsem v něm nedělal a mám zkušenosti jen s OpenGL, tak doufám že nekecám z cesty  _________________ Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe. |
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 6. prosinec 2007, 18:28:41 Předmět: |
|
|
Pokud vim tak je to stejny jako v gl, protoze pokazdy musis nasobit matice. pokud vim tak by to mnelo byt scale*rotace*translation, ale nejsem si jistej |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 6. prosinec 2007, 22:57:32 Předmět: |
|
|
Deluxe napsal: |
pokud vim tak by to mnelo byt scale*rotace*translation, ale nejsem si jistej |
blbost - zalezi na tom co chces delat - chces objekt posunout na danou pozici a na te ho mit natoceny o X stupnu (pak prvne rotuj pak posunuj) - chces objekt posunout a dane pozici orotovat kolem stredu (toho kde by predtim) - pak translace a potom rotace |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 6. prosinec 2007, 22:57:38 Předmět: |
|
|
D3D používá řádkové vektory a OGL sloupcové. Z toho vyplývá, že násobení matic probíhá v opačném pořadí a používané matice jsou vzájemně transponované.
Jinak jak jsi se zmiňoval o manipulování s vertexy v HLSL, tak to je něco jiného než s nima manipulovat ve vertex bufferu. Když manipuluješ v HLSL s vertexem, tak to děláš na základě parametrů, které jsi poslal do efektu, což de facto odpovídá nastavení world matrix. |
|
Návrat nahoru |
|
 |
|