Forgatás a 3D térben mátrixokkal

Forgatás a 3D térben mátrixokkal
2013-01-26T21:19:29+01:00
2013-01-28T23:31:48+01:00
2022-11-28T03:00:41+01:00
axon01
Sziasztok!

Ezen a weblapon olvasgattam kicsit a mátrixokról, de nem teljesen világos még a dolog.

Szóval ha van egy vektorom/pontom, és el szeretném forgatni/eltolni/nyújtani akkor a következőt kell tennem:

Készítek 6db 4*4-es mátrixot. Mégpedig:
-egységmátrixot
-eltolási mátrixot
-X tengely körüli elforgatás mátrixát
-Y tengely körüli elforgatás mátrixát
-Z tengely körüli elforgatás mátrixát
-és végül a nyújtási mátrixot

Ezeket össze kell ezután szorozni, majd amit kaptam azt össze kell szorozni a vektorommal, és így kapom meg az eredményt.

Nekem ez kicsit zavaros. Jól értettem hogy így kell ezt csinálni?

A válaszokat előre is köszönöm
Mutasd a teljes hozzászólást!
szerintem az általad megadott linken levő írás nagyjából a következőről szól (a megfogalmazásom pongyola lesz azért mert, nem vagyok elég alapos, meg talán így jobban érthető):

tfh. van egy pontod a térben, amit egy vektorral írsz le [x, y, z, 1] (természetesen az x, y, z helyett valamilyen konkrét értékek szerepelnek),
vannak úgy-e a mátrixok, vegyük a 4x4-es egységmátrixot, szorozzuk meg a vektort ezzel, mit kapunk?
[1, 0, 0, 0] [0, 1, 0, 0] [0, 0, 1, 0] [x, y, z, 1] * [0, 0, 0, 1] = [x*1+y*0+z*0+1*0, x*0+y*1+z*0+1*0, x*0+y*0+z*1+1*0, x*0+y*0+z*0+1*1] = [x, y, z, 1]
azaz "nem történt semmi",

most "variáljunk" kicsit a mátrixon, azaz ne csak a főátlóban legyenek 1-esek, azaz ne egységmátrix legyen, hanem például nézzük a következőt (a tx, ty, tz értékek persze adottak):
[ 1, 0, 0, 0] [ 0, 1, 0, 0] [ 0, 0, 1, 0] [tx, ty, tz, 1]
most ezzel a mátrixszal szorozzuk be a vektorunkat:
[1, 0, 0, 0] [0, 1, 0, 0] [0, 0, 1, 0] [x, y, z, 1] * [tx, ty, tz, 1] = [x*1+y*0+z*0+1*tx, x*0+y*1+z*0+1*ty, x*0+y*0+z*1+1*tz, x*0+y*0+z*0+1*1] = [x+tx, y+ty, z+tz, 1]
azaz mi történt? eltoltuk a pontunkat a [tx, ty, tz, 0] vektorral az [x+tx, y+ty, z+tz, 1] pontba,
ezek szerint a fenti mátrixszal le lehet írni az eltolást,

a többire hasonlóan végigjátszhatod,

ok ez rendben,

tfh. két műveletet akarsz elvégezni: egy eltolást és egy skálázást (ebben a sorrendben),
mit csinálunk: a vektorunkat beszorozzuk először az eltolási mátrixszal, majd a másikkal,

gondolhatod azt, hogy hoppá: van sok-sok pontom, miért nem szorzom előre össze a két mátrixot és utána szorzom meg a pontok vektorait a szorzattal, hiszen így megtakaríthatok egy sor műveletet?

miért ne? nyilván működik,

erre kérded: akkor minek a két mátrix, miért nem elég egy? miért nem írjuk fel általánosan
[a, b, c, d] [e, f, g, h] [i, j, k, l] [m, n, o, p]
alakban, minek bonyolítjuk(?) az életünket?

egyrészt azért, hogy lásd mi is történik, ne kelljen speciális esetekként ismertetni ezeket a transzformációs mátrixokat (bár nyilván ebből az irányból is lehetne magyarázni, de szerintem nehezebben lehetne megérteni),

másrészt tfh. hogy nem egy eltolást, skálázást akarsz végezni, hanem egy eltolást, skálázást, eltolást; nyilván ekkor jobban átlátható megint a helyzet, ha alap transzformációs mátrixaid vannak,

harmadrészt mondjuk azért, mert, ha egy mátrixban akarnád kezelni ezeket az alaptranszformációkat, akkor mondjuk a fenti mátrixban az 'a'-val jelölt értékről nem tudnád eldönteni, hogy az most az sx miatt annyi, vagy beleszólt az y/z tengelyek körüli forgatás, vagy ...?
kérdezheted erre: miért akarom ezt tudni?
azért, mert mondjuk írsz egy GUI-s felületet transzformációk megadására, olyat amelyikkel vissza is tudod álltani az alapértékeket, azaz csak megjelenítésben, stb. végzed el a kívánt, megadott transzformációkat; célszerűen ezt úgy írod meg, hogy magát a GUI-t függetlenül kezeled; ha sok pontod van, akkor nem szeretnél mindegyikhez külön vezérlőpanelt (mert tfh. az egyes pontokhoz önálló, más-más transzformációt szeretnél), hanem mondjuk azt csinálod, hogy amikor kiválasztod valamelyik pontot, akkor a GUI vezérlők értékeit a mátrixoknak megfelelően frissíted/állítod be, ehhez nyilván ismerni kell akkor az egyes értékeket, azaz úgy célszerű megcsinálni, hogy mindegyik transzformációs mátrixot önállóan létrehozod/kezeled és csak (esetleg) a konkrét művelet elvégzésekor szorzod össze őket, szerintem... (ez egy kicsit bonyolult példa lett, remélem azért talán van valami értelme, meg érthető is...)

stb.


ha megértetted a transzformációs mátrixokat, akkor mivel a témádnak a "
Forgatás a 3D térben mátrixokkal
" címet adtad, felhívnám a figyelmedet az ún. Gimbal lock-ra, mert jó tudni róla, az esetleges meglepetések elkerülése végett (én amikor gyakorlatban először találkoztam vele egy 3D-s animációs programban, hirtelen nem tudtam mit kezdeni vele, először valamiféle programhibára gyanakodtam és nem is tudtam tovább haladni, dolgozni, kb. 1 napig tartott mire megértettem, hogy mi a "gond", mi áll a jelenség mögött; abban az időben, sok-sok (kb. 17) évvel ezelőtt (mikor még az embereknek "nem volt" otthon "internetük", a cégnél egy talán 56k-s modem volt több tíz emberre) elég kevés anyagot lehetett találni róla az interneten, stb. azt sem tudtam valójában, hogy mit is kellene keresni, hogyan kéne utánajárni a jelenségnek, tudtommal semelyik akkoriban hozzáférhető (addig megjelent) magyar (sz)ámítógépi animációval, grafikával foglalkozó könyvben, leírásban nem volt róla szó, szóval "néztem, mint borjú az új kapura" és nem értettem, aztán véletlenül valahol ráleltem)
Mutasd a teljes hozzászólást!

  • gondolatébresztőnek: szerinted az egységmátrixszal miért kellene szorozni?
    Mutasd a teljes hozzászólást!
  • Engels is azt írta az Anti Dühring-ben, hogy az 1-el végzett műveletek kiemelten fontosak. Biztos ami biztos szorozzuk meg.
    Mutasd a teljes hozzászólást!
  • Ha kicsit zavaros, akkor végezz el pár próbát papír-ceruza segítségével, és utána tisztul.
    Arra azonban figyelj, hogy a mátrixszorzás nem kommutatív (kivéve speciális eseteket, mint pl. 1-es rangú mátrixok - ilyen az eltolás)! Ez az első időkben meglepetéseket szokott okozni. Pl.: egyáltalán nem mindegy, hogy elforgatásnál a tengelyek sorrendje mi.
    Mutasd a teljes hozzászólást!
  • Itt egy jobb leiras: 3D Matrix Math Demystified - Math and Physics - Articles - Articles

    A matrix szorzasnal szamit a sorrend, nem mindegy, hogy elobb nyujtasz es aztan eltolsz, vagy forditva.
    Ha osszeszorzod a kulonbozo transzformacios matrixokat es a szorzatkent keletkezett matrix-al transzformalod a vektort az sokkal gazdasagosabb, mintha A vektrort vegigszoroznad kulon kulon az osszes transzformacios matrix-al (mikozben az eredmeny ugyanaz).

    De a felsoroltakon kivul sokkal tobbre jok a matrixok:
    (amiket felsoroltal, azokat kulon kulon egyszerubb megoldani manualisan, mint matrix-al, de a matrix az az altalanos/halmozott esetre a jo megoldas)
    - forgatas tetszoleges tengely korul
    - tukrozes tetszoleges sikra
    - perspektivikus vetites (projection, ide azert kell egy plusz osztas is)
    Mutasd a teljes hozzászólást!
  • szerintem az általad megadott linken levő írás nagyjából a következőről szól (a megfogalmazásom pongyola lesz azért mert, nem vagyok elég alapos, meg talán így jobban érthető):

    tfh. van egy pontod a térben, amit egy vektorral írsz le [x, y, z, 1] (természetesen az x, y, z helyett valamilyen konkrét értékek szerepelnek),
    vannak úgy-e a mátrixok, vegyük a 4x4-es egységmátrixot, szorozzuk meg a vektort ezzel, mit kapunk?
    [1, 0, 0, 0] [0, 1, 0, 0] [0, 0, 1, 0] [x, y, z, 1] * [0, 0, 0, 1] = [x*1+y*0+z*0+1*0, x*0+y*1+z*0+1*0, x*0+y*0+z*1+1*0, x*0+y*0+z*0+1*1] = [x, y, z, 1]
    azaz "nem történt semmi",

    most "variáljunk" kicsit a mátrixon, azaz ne csak a főátlóban legyenek 1-esek, azaz ne egységmátrix legyen, hanem például nézzük a következőt (a tx, ty, tz értékek persze adottak):
    [ 1, 0, 0, 0] [ 0, 1, 0, 0] [ 0, 0, 1, 0] [tx, ty, tz, 1]
    most ezzel a mátrixszal szorozzuk be a vektorunkat:
    [1, 0, 0, 0] [0, 1, 0, 0] [0, 0, 1, 0] [x, y, z, 1] * [tx, ty, tz, 1] = [x*1+y*0+z*0+1*tx, x*0+y*1+z*0+1*ty, x*0+y*0+z*1+1*tz, x*0+y*0+z*0+1*1] = [x+tx, y+ty, z+tz, 1]
    azaz mi történt? eltoltuk a pontunkat a [tx, ty, tz, 0] vektorral az [x+tx, y+ty, z+tz, 1] pontba,
    ezek szerint a fenti mátrixszal le lehet írni az eltolást,

    a többire hasonlóan végigjátszhatod,

    ok ez rendben,

    tfh. két műveletet akarsz elvégezni: egy eltolást és egy skálázást (ebben a sorrendben),
    mit csinálunk: a vektorunkat beszorozzuk először az eltolási mátrixszal, majd a másikkal,

    gondolhatod azt, hogy hoppá: van sok-sok pontom, miért nem szorzom előre össze a két mátrixot és utána szorzom meg a pontok vektorait a szorzattal, hiszen így megtakaríthatok egy sor műveletet?

    miért ne? nyilván működik,

    erre kérded: akkor minek a két mátrix, miért nem elég egy? miért nem írjuk fel általánosan
    [a, b, c, d] [e, f, g, h] [i, j, k, l] [m, n, o, p]
    alakban, minek bonyolítjuk(?) az életünket?

    egyrészt azért, hogy lásd mi is történik, ne kelljen speciális esetekként ismertetni ezeket a transzformációs mátrixokat (bár nyilván ebből az irányból is lehetne magyarázni, de szerintem nehezebben lehetne megérteni),

    másrészt tfh. hogy nem egy eltolást, skálázást akarsz végezni, hanem egy eltolást, skálázást, eltolást; nyilván ekkor jobban átlátható megint a helyzet, ha alap transzformációs mátrixaid vannak,

    harmadrészt mondjuk azért, mert, ha egy mátrixban akarnád kezelni ezeket az alaptranszformációkat, akkor mondjuk a fenti mátrixban az 'a'-val jelölt értékről nem tudnád eldönteni, hogy az most az sx miatt annyi, vagy beleszólt az y/z tengelyek körüli forgatás, vagy ...?
    kérdezheted erre: miért akarom ezt tudni?
    azért, mert mondjuk írsz egy GUI-s felületet transzformációk megadására, olyat amelyikkel vissza is tudod álltani az alapértékeket, azaz csak megjelenítésben, stb. végzed el a kívánt, megadott transzformációkat; célszerűen ezt úgy írod meg, hogy magát a GUI-t függetlenül kezeled; ha sok pontod van, akkor nem szeretnél mindegyikhez külön vezérlőpanelt (mert tfh. az egyes pontokhoz önálló, más-más transzformációt szeretnél), hanem mondjuk azt csinálod, hogy amikor kiválasztod valamelyik pontot, akkor a GUI vezérlők értékeit a mátrixoknak megfelelően frissíted/állítod be, ehhez nyilván ismerni kell akkor az egyes értékeket, azaz úgy célszerű megcsinálni, hogy mindegyik transzformációs mátrixot önállóan létrehozod/kezeled és csak (esetleg) a konkrét művelet elvégzésekor szorzod össze őket, szerintem... (ez egy kicsit bonyolult példa lett, remélem azért talán van valami értelme, meg érthető is...)

    stb.


    ha megértetted a transzformációs mátrixokat, akkor mivel a témádnak a "
    Forgatás a 3D térben mátrixokkal
    " címet adtad, felhívnám a figyelmedet az ún. Gimbal lock-ra, mert jó tudni róla, az esetleges meglepetések elkerülése végett (én amikor gyakorlatban először találkoztam vele egy 3D-s animációs programban, hirtelen nem tudtam mit kezdeni vele, először valamiféle programhibára gyanakodtam és nem is tudtam tovább haladni, dolgozni, kb. 1 napig tartott mire megértettem, hogy mi a "gond", mi áll a jelenség mögött; abban az időben, sok-sok (kb. 17) évvel ezelőtt (mikor még az embereknek "nem volt" otthon "internetük", a cégnél egy talán 56k-s modem volt több tíz emberre) elég kevés anyagot lehetett találni róla az interneten, stb. azt sem tudtam valójában, hogy mit is kellene keresni, hogyan kéne utánajárni a jelenségnek, tudtommal semelyik akkoriban hozzáférhető (addig megjelent) magyar (sz)ámítógépi animációval, grafikával foglalkozó könyvben, leírásban nem volt róla szó, szóval "néztem, mint borjú az új kapura" és nem értettem, aztán véletlenül valahol ráleltem)
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget!

    Lapon próbálgattam a forgatásokat, és működik. Csak az a baj, hogy pont ellentétes irányba forog. Ha +60°-al forgatnám, akkor negatív irányba fordul 60°-al.

    pl ha a (4,0,0) pontot forgatom 90°-al a Z tengely körül, akkor (0,-4,0) lesz. Pedig ha az xy síkon pozitív írányba forgatok akkor (0,+4,0) kellene legyen


    Ezen kívül mivel a mátrix 4*4-es, ahhoz hogy beszorozzuk egy vektorral, annak R4-belinek kell lennie. Szóval azt nem értem még, hogy ha csak 3dimenziós vektort használunk, akkor a negyedik komponens miért 1 lesz? miért nem inkább 0?
    Mutasd a teljes hozzászólást!
  • közbe rájöttem hogy azért 1 az utolsó komponens értéke hogy pl az eltolás kijöjjön

    viszont továbbra sem értem miért az ellenkező irányba forgat
    Mutasd a teljes hozzászólást!
  • A számítástechnikában hagyományosan balkezes Cartesian koordináta rendszer dívik (a bal felső sarok a 0,0), ezért Z tengely körül is az óramutató járásával egyező irány a pozitív forgatás.
    Mutasd a teljes hozzászólást!
  • ja hogy a mátrixozás balsodrású koordinátarendszerre van
    értem
    Mutasd a teljes hozzászólást!
  • Itt elég jó demó van:
    itarato: Damn simple 3D tutorial
    Mutasd a teljes hozzászólást!
  • "
    közbe rájöttem hogy azért 1 az utolsó komponens értéke hogy pl az eltolás kijöjjön
    "

    esetleg a homogén koordinátáknak is utánanézhetsz,

    hoppá, itt a prog.hu-n is volt erről cikk: Homogén koordináták és transzformációk, szerző:Nemo
    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