Objektum elmozgatása saját tengelyén Direct3D-ben
2013-02-24T07:55:00+01:00
2013-03-03T19:17:55+01:00
2022-08-07T12:10:30+02:00
TheLittleElf
Sziasztok!

Az lenne a kérdésem, hogyan lehet Direct3D-ben egy objektumot elmozdítani a saját tengelye irányába. Úgy értem, ha pl. elfordítjuk Y tengely mentén 45 fokkal, eltoljuk X tengelyen, akkor átlósan változtatna helyet. Ezt először úgy próbáltam megoldani, hogy a

m_mTransform=m_mScale*m_mRotation*m_mTranslation;

helyére

m_mTransform=m_mScale*m_mTranslation*m_mRotation;

ezt írtam.

Ezzel sikerült is volna a dolog, csak ugyebár egy vektor world mátrixba való transzformációja esetén a vektor helyzetét az előbbi módon számítja ki. Szögfüggvényekkel szerintem meg lehet oldani, bár nem tudom, hogyan. Valaki segítene? Köszi!
Mutasd a teljes hozzászólást!
Az objektum "saját irányát" a forgatása határozza meg. Az, hogy "odébb tolod" azt meg a pozíciója. Tehát ha odébb akarod mozgatni, akkor a pozíciójához kéne valamit hozzáadni. Kérdés, hogy mit. de mivel adott a forgatási mátrix, ezért egyszerű dolgod van. Fogsz egy egységvektort (mondjuk [0,0,1]) és a vektort eltransformálod a forgatási mátrixszal. Így megkapod, hogy a forgatás után merre néz a Z vektor. Ezt az értéket hozzáadod a pozícióhoz.
Mutasd a teljes hozzászólást!

  • Ezzel sikerült is volna a dolog, csak ugyebár egy vektor world mátrixba való transzformációja esetén a vektor helyzetét az előbbi módon számítja ki. Szögfüggvényekkel szerintem meg lehet oldani, bár nem tudom, hogyan. Valaki segítene? Köszi!


    Én ezt itt nem értem. A transzformációkkal jó irányben vagy. Először tolod el majd forgatni. A = T * R. Először ugye Eltolja a T által meghatározott irányban és mértékben. Majd ezt az eltolt állapotot elforgatja az eredeti Y tengely mentén. Tehát a modelled leír egy szép nagy kört az Y tengely körül.
    Amikor ez megvan, csak akkor hajtod végre a worldTransformation-t, majd projectionTransformation és viewTransformation-t hogy lásd a képet szépen. Tehát hol van itt aprobléma? Hogy jött ide a world transform?
    A válasz: Már megoldottad A = S * T * R
    Másodlagos válasz: DirectX SDK Sample Browser-t elindítod. DirectX 9 is van szerintem még benne szóval kiválasztod a DX9-es Transformations-c című tutorialt. Azt hiszem ez a 4-es lesz, és abban is szépen le van írva
    Mutasd a teljes hozzászólást!
  • Akkor szerintem nem olvastad el rendesen. Ha A=S*T*R-rel transzformálok, a D3DXVec3TransformCoord() az AABB-t nem az objektum helyzetéhez igazítja, hanem először eltolja, és azután forgatja. Így az objektum és az AABB-je két külön helyre esik.

    De nekem az lett volna a kérdésem, hogyan lehet egy objektumot saját (lokális térben) valamilyen irányba eltolni? Pl.:

    Global space-ben való elfordításhoz ezt a függvényt használom:

    VOID CTransform::TranslateAbs(FLOAT fX, FLOAT fY, FLOAT fZ) { m_mTranslation._41=fX; m_mTranslation._42=fY; m_mTranslation._43=fZ; }

    De hogyan oldjam meg ezt úgy, hogy az objektum a saját helyzetéhez viszonyított irányba mozduljon el A=S*R*T-vel?
    Mutasd a teljes hozzászólást!
  • Az objektum "saját irányát" a forgatása határozza meg. Az, hogy "odébb tolod" azt meg a pozíciója. Tehát ha odébb akarod mozgatni, akkor a pozíciójához kéne valamit hozzáadni. Kérdés, hogy mit. de mivel adott a forgatási mátrix, ezért egyszerű dolgod van. Fogsz egy egységvektort (mondjuk [0,0,1]) és a vektort eltransformálod a forgatási mátrixszal. Így megkapod, hogy a forgatás után merre néz a Z vektor. Ezt az értéket hozzáadod a pozícióhoz.
    Mutasd a teljes hozzászólást!
  • nem ismerem a DirectX-et, nem tudom hogy van-e erre valamilyen egyszerű megoldás, azaz kezel-e lokális transzformációkat ill. lehet-e építeni az objektumaidból hierarchiát, de...

    általános esetben ezt úgy szokás megoldani, hogy létrehozunk olyan ún. null/dummy objektumot, amely nem rendelkezik valódi geometriával, csak transzformációs mátrixokkal és ehhez "kötjük" az objektumunkat,
    azaz az elején ez a dummy objektumunk valójában a világ koordináta-rendszer középpontjában van, gyakorlatilag egy identitás mátrixnak "felel meg" a transzformációs mátrixa (azok szorzata),
    ha globálisan akarod transzformálni az objektumodat, akkor a null objektumot manipulálod,
    ha lokálisan, akkor meg az objektum transzformációs mátrixait,
    az objektum valódi helyzetét/méretét/forgatását meg a mátrixok szorzata adja meg, azaz a null objektumának a mátrixaival is felszorzod az övéit,

    ha pld. egy egyszerű naprendszer vizualizációt csinálnál, akkor a Föld objektumodhoz veszel egy ilyen null objektumot, a Földet elforgatod 23,44 fokkal, a null objektumot használod a saját tengely körüli forgáshoz, majd még egy null objektummal meg megcsinálod a Nap körüli forgást,

    szerkesztve: ez utóbbi példához: azaz ha az egyes objektumaidhoz az A1, A2, A3 mátrixok tartoznak (A1-Földé, A2-középpontjában a null-é, A3-Nap középpontjában levőé, mindegyik SRT), akkor a végén mindhárom A mátrixszal szoroznod kell, meg persze eleve azokhoz is, nyilván lehet "optimalizálni", hiszen a Földet csak elforgattad az ekliptikához képest, eltolni nem toltad, meg nem is skálázod, az első null-t meg szintén nem skálázod (arra persze figyelj, hogy itt mi a sorrend: eltolás, forgatás vagy fordítva, esetleg ha nem boldogulsz vele, akkor bontsd szét ezt a transzformációt is két null-ra, ...) (értelemszerűen csak akkor érdemes elhagyni a nem befolyásoló transzformációkat, ha átlátható, kicsi a kód, stb., azaz, ha nem hozunk létre a hierarchia kezelésére külön osztályt, stb. általános esetben absztrahálni kell/érdemes, szerintem)

    szerkesztés szerkesztése: nyilván "optimalizálhatsz" úgy is, hogy minden egyes objektumhoz a saját transzformációs mátrixain kívül tárolod a globális transzformációs mátrixát is, ha valahol a hierarchiájában változás történik, akkor ezt a globálisat újra számolod, azaz mindig "naprakészen" tartod, és a rendereléshez stb. csak mindig ezzel számolsz (nem akkor kezdesz szorozgatni), (mint írtam nem ismerem a DirectX-et, azt is el tudom képzelni, hogy valójában van erre támogatás),
    Mutasd a teljes hozzászólást!
  • Nem arról volt szó, hoyg megoldottad az AABB-t? Az előző témában ha jól rémlik ezt írtad. Azonban azt látom, hogy mégsem sikerült megoldani. A kérdést elolvastam csak értelmét nem látom. Ahogy már írtam is, fogj egy matematika könyvet és kezd el tanulni, bár középiskolás fejjel ez nemhiszem, hogy menni fog.
    Amikor transzformálod az objektumot, az AABB nem marad a helyén!!!! Egy objektum transzformálása után ugyanazt a transzformációt végre hell hajtani az objektum BoundingBox-án, majd minimum / maximum keresés a BB 8 vertexén és az AABB felépítése. Neked ez bőven elég, a másik megoldás megfelelő metematikai ismeretek nélkül teljesen fölösleges.
    Tehát. Generálsz egy AABB-t az objektum valamilyen helyzetéhez, az NEM azt jelenti, hogy ha az objektumot mozgatod az AABB megy vele. Tessék az AABB-t minden objektum transzformáció után újraszámolni.
    Mutasd a teljes hozzászólást!
  • Tényleg, vektorokkal... :) Hogy nem jutott ez eszembe
    Mutasd a teljes hozzászólást!
abcd