Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 21. duben 2008, 09:41:18 Předmět: |
|
|
Juraj napsal: |
Tak jelikož moje matematika v 3D prostoru trochu pokulhává, potřeboval bych od Vás pomoct.
Potřebuj si vypočítat souřadnice např kvádru kolem vykresleného objektu, tak abych mohl testovat zda jsem náhodou neklik na daný objkt.
Osobně si myslím, že pro výpočet použiji nějaké body z world matice objectu, ale nevím jak dostat ty správné abych to mohl testovat při kliku na plátno. |
"body z world matice" whe?
jinak co treba si u kazdeho objektu ulozit jeho bounding box a pak ho postupne rotovat s objektem podle matice daneho objektu?
pripade se pouzivaji AABB -> axis aligned bounding box |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 21. duben 2008, 09:51:14 Předmět: |
|
|
No skoro jsi mi odpoveděl, ale mě právě jde jak vypočítat ten pomyslný bounding box?
Mám to tako: object načtu ze souboru a nějak ho poupravím. Abych mohl podporovat i aniamce, rozeberu modely na části (pokud mají) a já potřebuji vypočítat např že:
elektrana je od 0,10 do 20,30 abych to mohl otestovat na klick na celé plátno..
ps: nezajímá mě to kolik to má částí ale jako celek pro označení, také můsíme brát v úvahu posun dále od kamery nebo blíže. Kvůli tomu si také myslím že se k výpočtu musí použít nějaké body world matice objektu, protože pro myš bude políčko různě veliké podle toho jak bude blízko kamery.
Naposledy upravil Juraj dne 21. duben 2008, 09:53:45, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 21. duben 2008, 09:52:52 Předmět: |
|
|
AABB se dá zjistit jednoduše. Zjistíš si ze všech vrcholů nejmenší hodnotu v X, potom největší hodnotu v X, dál nejmenší v Y, největší v Y a to samý pro Z. A máš AABB. _________________ Mám strach |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 21. duben 2008, 09:55:15 Předmět: |
|
|
Quiark napsal: |
AABB se dá zjistit jednoduše. Zjistíš si ze všech vrcholů nejmenší hodnotu v X, potom největší hodnotu v X, dál nejmenší v Y, největší v Y a to samý pro Z. A máš AABB. |
ano něco takového jsem myslel , díky
a tímto ošetřím i rotece posuny objectu?? |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 21. duben 2008, 10:01:10 Předmět: |
|
|
Tohle vypočítáš v základní poloze objektu. Pak s tím budeš točit a hýbat stejně jako s objektem. Bude to v souřadnicích objektu, takže pro zjištění kliku to budeš muset vždy přetransformovat do souřadnic obrazovky. _________________ Mám strach |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 21. duben 2008, 12:30:14 Předmět: |
|
|
Quiark napsal: |
Tohle vypočítáš v základní poloze objektu. Pak s tím budeš točit a hýbat stejně jako s objektem. Bude to v souřadnicích objektu, takže pro zjištění kliku to budeš muset vždy přetransformovat do souřadnic obrazovky. |
Tak už vím jak to spočítat, ale nyní nevím jak dostanu minimální a maximální souřadnice. Pokud bych si to defonoval sám, tak ano ale nevím jak je dostat z načítaných objectů. Nejsem si jist zda by šlo a bylo by effectivní nějak projít všechny jeho části a v tom hledat min a max souřadnice... |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 21. duben 2008, 13:09:17 Předmět: |
|
|
To záleží na tom, jestli jsou ty informace o AABB v tom modelu uloženy. A to zase záleží na tom, jaký je to formát atd. Když si to napíšeš sám, bude to asi nejjednodušší. A rychlosti bych se nebál -- je to jen pár triviálních operací na každý vrchol a když to porovnáš se samotným načítáním, je to podle mě zanedbatelné zpoždění. _________________ Mám strach |
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 21. duben 2008, 15:42:37 Předmět: |
|
|
Nevim jaky API pouzivas ale v MDX jsou na zjisteni bounding boxu nebo bounding sphere funkce:
kód: |
Geometry.ComputeBoundingBox(data, d3dMesh.NumberVertices,
d3dMesh.VertexFormat, out minBound, out maxBound);
objectRadius = Geometry.ComputeBoundingSphere(
data, d3dMesh.NumberVertices, d3dMesh.VertexFormat,
out objectCenter);
|
|
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 21. duben 2008, 20:35:59 Předmět: |
|
|
Juraj napsal: |
Potřebuj si vypočítat souřadnice např kvádru kolem vykresleného objektu, tak abych mohl testovat zda jsem náhodou neklik na daný objkt.
Osobně si myslím, že pro výpočet použiji nějaké body z world matice objectu, ale nevím jak dostat ty správné abych to mohl testovat při kliku na plátno. |
Jestli ti jde o zjisteni na jaky objekt jsi kliknul tak bych doporucil "color picking". Zakladni myslenka je napr. zde: http://www.lighthouse3d.com/opengl/picking/index.php?color1
nebo jeste lepe zde: http://gpwiki.org/index.php/OpenGL_Selection_Using_Unique_Color_IDs
Je to presne a nemusis resit matematiku typu ray vs box/sphere.
Upravenou techniku pouzivam pro muj editor.
Naposledy upravil quas4 dne 22. duben 2008, 10:12:30, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 21. duben 2008, 20:37:53 Předmět: |
|
|
Jak se začne přenášet AABB do jiných souřadnicových systémů, příchází problém - najednou máš OBB (oriented BB = AABB + rotation matrix) a tam ta matika je trochu složitější. Místo této komplikace bych ti doporučil transformovat 3D přímku do souřadnicového systému objektu a spočítat kolizi až tam. 3D přímkou myslím samozřejmě tu přímku, kterou generuje pozice myši mezi přední a zadní ořezávací rovinou. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Juraj

Založen: 06. 12. 2007 Příspěvky: 189
|
Zaslal: 29. květen 2008, 14:13:18 Předmět: |
|
|
Máte někdo trochu bližší zkušenosti s touto funkcí D3DXComputeBoundingBox (u me Geometry.ComputeBoundingBox)?
Jde mi o to, že mi vrací více nespecifikovaný error:
{"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."}
Už jsem zkoušel kontrolovat parametry, prohazovat a postupne ladit a na nic jsem nepřišel. Pokaždé mi to tak na 2/3 případů proběhne v pořádku (tedy alespoň bez erroru) a 1/3 padá na tento error.
Pokud Vás něco napadá co bych měl zkontrolovat, nebo víte jak tako funkce uvnitř pracuje, dejte vědět.
Díky |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 29. květen 2008, 14:39:44 Předmět: |
|
|
mas tu Geometry spravne nainicializovanou - uvnitr bude urcite unmanaged objekt - neni to nahodou NULL pointer nebo neco co by ukazovalo do pryc?
a jinak vyplati se misto te hlasky znat jeji chybovy kod a nebo tu hlasku v anglictine - pak se da googlit - ceskou hlasku nevygooglis |
|
Návrat nahoru |
|
 |
Deluxe

Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 29. květen 2008, 15:27:19 Předmět: |
|
|
No v jednom kodu ji pouzivam takhle:
kód: |
using (GraphicsStream data = d3dMesh.LockVertexBuffer(
LockFlags.None))
{
objectRadius = Geometry.ComputeBoundingSphere(
data, d3dMesh.NumberVertices, d3dMesh.VertexFormat,
out objectCenter);
if(objectRadius == 0.0f)
objectRadius = 0.01f;
Geometry.ComputeBoundingBox(data, d3dMesh.NumberVertices,
d3dMesh.VertexFormat, out minBound, out maxBound);
d3dMesh.UnlockVertexBuffer();
} |
a funguje to dobre... |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 29. květen 2008, 16:09:07 Předmět: |
|
|
na VC++ 6.0 je dobrá kolizní knihovna ColDet... a hlavně FREE  |
|
Návrat nahoru |
|
 |
|