AABB méretének kiszámítása
2013-02-16T20:33:44+01:00
2013-02-24T07:36:43+01:00
2022-08-17T06:15:34+02:00
TheLittleElf
Sziasztok!

Az lenne a kérdésem, hogyan lehet kiszámítani egy AABB (axis-aligned bounding box) méretét Direct3D-ben a következők ismeretével:
- az objektum mérete (szélesség/magasság/hosszúság)
- transzformációs mátrixok szorzata
(mTransform=mScale*mRotation*mTranslation; Ez a transzformáció vonatkozik az AABB-vel határolt objektumra.) Valaki segítene? Köszönöm!
Mutasd a teljes hozzászólást!
Mindegy, D3DXVec3TransformCoord()-dal mindent megoldottam.
Mutasd a teljes hozzászólást!

  • ha jól értelmezem, akkor a "sima" bounding box-át ismered ("
    következők ismeretével: - az objektum mérete (szélesség/magasság/hosszúság)
    ")

    biztos buta megoldás, de én arra gondolok, hogy "arra" elvégezve a transzformációkat, a kapott 8 pontra, jobban mondva azok koordinátáira min/max kereséssel meghatározhatod az AABB-t, nem?

    szerkesztve: nyilván feltételeztem, hogy valójában egy téglatestről van szó, ellenben szerintem nem áll elégséges adat rendelkezésre (nem elegendő a szélesség/magasság/hosszúság, ismerni kell a "formát" is)

    szerkesztés szerkesztése: 2D-ben szemléltetve, ha mondjuk van két alakzatod:
    #
    ##
    és
    ##
    ##
    ezeknek a szélessége/magassága úgy-e egyforma: 2-2 egység,
    ha elfordítod őket 45 fokkal, akkor az AABB-jük nem lesz egyforma, hiszen az első nem lesz (attól függően, hogy merre forgattad) ugyanolyan "magas"/"széles" mint a másik,
    Mutasd a teljes hozzászólást!
  • Pontosan erről van szó. Hogy jobban érthető legyen, amit én az objektum méretének fogalmaztam, az OBB (oriented bounding box) méretére értettem. Elvégre ugyanaz a kettő.
    Mutasd a teljes hozzászólást!
  • Nem kifejezetten értem a problémád. Ha adott a model szélessége magassága illetve hosszúsága, valamint ismert a modelspace - legjobb esetben identitity matrix, akkor mi tart vissza? Legalábbis nem értem hol van a gond? A doboz méretét megtudod határozni, a model méreteiből pl. Nekem nem szoktak meglenni a model méretek .
    Na mindegy. Fogsz egy kockát ami kezdjen mondjuk 1-1-1 oldalhosszakkal. Át transzformálod a modelspace-be (A modeled koordináta rendszerébe) a change-of-coordinate transformation mátrixszal. Ezt követően a kocka "origója" ugyanarra a helyre kerül mint a model "origója". Ettől fogva, a model magasságából/szélességéből/mélységéből már egyértelműen tudod, a kocka méreteit. Ahhoz, hogy a kocka ugyanabba a helyzetbe kerüljön amibe a model; a model transzformálása után a következő lépés, hogy a bounding box-ot is ugyanazzal a transzformációs mátrixszal transzformálod.
    És nagyjából ennyi a dolog, én nem látok benne nehézséget. HA van konkrét kérdésed hogy hol akadsz el akkor azt tedd föl, mert egyébként ezt elég sok könyvben taglalják 10-20 oldalon keresztül, értelem szerűen nem fogom levezetni, sem kódot adni hozzá.
    Mutasd a teljes hozzászólást!
  • Odáig megvan, hogy van egy 1.0f oldalhosszúságú kocka. De például elfordítjuk az objektumot 30 fokkal x irányba, akkor az AABB mérete y és z irányban nő. Tehát ahogy forog az objektum, úgy növekedjen és csökkenjen az AABB mérete is.
    Mutasd a teljes hozzászólást!
  • Mi növekszik hol? Ha 30 fokkal forgatod a modelt, akkor 30 fokkal forgatod a bounding box-ot is! Ugye nem ray tracelni szeretnél (mert azt biza nem így kell)?
    Mutasd a teljes hozzászólást!
  • szbzs.2 világosan leírta, hol van a növekedés, elolvastad?
    Egyelôre nem érted a problémát sem, az a gyanúm.
    Mutasd a teljes hozzászólást!
  • Mindegy, D3DXVec3TransformCoord()-dal mindent megoldottam.
    Mutasd a teljes hozzászólást!
  • Elárulod, hogy ez mit segített megoldani? Ez csak egy transzformációt hajt végre egy adott vektoron.
    Konstruálsz egy sima BoundingBox-ot. Ez gondolom megy, mert megvan a modell mérete x,y,z térben (szélesség, magasság, mélység). Eddig meg is voltál.
    1. Transzformálod a modellt T transzformációval.
    2. Transzformálod a BoundingBox-ot ugyanazzal a T transzformációval.
    3. min/max keresést végzel a BB 8 vertexén, hogy meglegyen mind x,y,z szerint a legnagyobb és legkisebb pont. Kiválasztod a MIN-t és a MAX-ot. Voala megvan az AABB

    MIN**********
    *M E *
    * O L C *
    * D L S E*
    * E K *
    **********MAX

    LINK

    DirectX esetében (x,y) sík alapértelmezésben, HACSAK nem máshogy definiálod a dolgokat magadnak. Pl a kamera UpVectora sem a (0,1,0).
    Mutasd a teljes hozzászólást!
  • Kiegészítésnek még annyit, hogyha túlvagy a transzformáción akkor már gyakorlatilag célegyenesbe is értél: a DX SDK tartalmaz egy D3DXComputeBoundingBox funkciót, ami elvégzi a koordináta tengelyhez (neked már erre transzformált) viszonyított bounding-box kiszámítását.
    Mutasd a teljes hozzászólást!
  • Aha! D3DX-ben még voltak ilyen finomságok is? Kár, hogy azt soha nem optimalizálták SSE2-re illetve, hogy azzal nincs átjárás más platformok felé. Mindenesetre elnézve a leírást ez ugye kiadja a bounding-box-ot. Ebből az Axis-Aligned a legegyszerűbb módon:
    Véggimegyünk a BB 8 vertexén és keressük: min_x max_x min_y max_y
    Ha ezek megvannak, akkor megvan az AABB:
    (min_x, min_y) (min_x, max_y) (max_x, max_y) (max_x, min_y)
    Mostmár kezdek rájönni, hogy a kérdező fix-pipeline-t használ egyelőre, tehát a TransformCoord-al hajtja végre a transzformációkat . Én pedig már azt hittem, hogy mindenki programmable-pipeline-t használ .
    Mutasd a teljes hozzászólást!
  • hát remélem arra gondolt
    am nem hülyeség SSE-vel próbálkozni, 3-4 float-cmp egyszerre...
    Mutasd a teljes hozzászólást!
  • Pontosan így
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd