Direct3D vertex koordináta lekérdezése
2013-02-17T10:40:52+01:00
2013-02-22T13:54:03+01:00
2022-08-17T06:05:35+02:00
TheLittleElf
Sziasztok!

Az lenne a kérdésem, hogyan lehet egy vertex koordinátát megkapni úgy, hogy előtte elvégeztünk már különböző transzformációkat. Pl.: van egy háromszög amelynek egyik vertexének x koordinátája 0.2f. Ezután a háromszöget x irányba elmozdítjuk 1.0f egységnyire. A háromszög alakja nem változik (a háromszögön belül ugyanúgy annak a vertexnek az x értéke 1.0f). De a world mátrixban viszont a koordináta helyzete 1.2f. És én az 1.2f-et szeretném megkapni. Valaki segítene? Köszi!
Mutasd a teljes hozzászólást!
Középiskolában ?
Még egyetemen sem nagyon tanítanak Direct3D-t csak egy "jó kis" 1.2-es fix pipeline-os openGL-t.
Majd egyetemen megtanulod a hozzá való matematikát, aztán már "piskóta".
Mutasd a teljes hozzászólást!

  • hajjajjjj. tudod a transzformációs mátrixoknak létezik inverze. Legyen A egy affin transzformáció. Ekkor A definíció szerint megadható egy Lineáris Transzformáció és egy eltolás összegeként. Mind a lineáris transzformáció mind pedig az eltolás 1-1 mátrix aminek tuti van inverze.

    Tehát ha adott egy komplex transzformáció: A = S * R * T
    amit végrehajtassz egy vertexre, és te szeretnéd később a vertex eredeti koordinátáit meghatározni, akkor kell neked A^-1 azaz az eredeti transzformációd inverze. Meghatorozod az inverzet, és elvégzed a transzformációt. Eredményképpen megkapod a vertexed eredeti koordinátáit.
    Mutasd a teljes hozzászólást!
  • Meg lehetne fogalmazni ezt egy kicsit tömörebben? És megköszönném, ha mellékelnél bárminemű forráskódot is hozzá
    Mutasd a teljes hozzászólást!
  • Itt vagy egy fügvénye annak az osztálynak amit régen készitettem. A teljes osztályt em linkelem be ha csak nem kéreb majd később, de remélem amit most leirok az is segiteni fog. A fügvény bármilyen négyzetes mátrixnak kiszámolja az inverzét ha létezik determinánsa.
    CMatrix CMatrix::operator-() { if( m_iCol == m_iCol ) { CMatrix t = *this; CMatrix r( m_iRow, m_iCol ); register double d; int i, j, k; r.LoadIdentity(); for( i = 0; i < m_iRow - 1; i++ ) for( j = i + 1; j < m_iRow; j++ ) if( t[j][i] != 0.0 ) { d = t[j][i] / t[i][i]; for( k = 0; k < m_iCol; k++ ) { t[j][k] = t[j][k] - t[i][k] * d; r[j][k] = r[j][k] - r[i][k] * d; } } for( i = m_iRow - 1; i > 0; i-- ) for( j = i - 1; j > -1; j-- ) if( t[j][i] != 0.0 ) { d = t[j][i] / t[i][i]; for( k = 0; k < m_iCol; k++ ) { t[j][k] = t[j][k] - t[i][k] * d; r[j][k] = r[j][k] - r[i][k] * d; } } for( i = 0; i < m_iRow; i++ ) if( t[i][i] != 1.0 ) { d = 1.0 / t[i][i]; for( j = 0; j < m_iCol; j++ ) r[i][j] *= d; } return r; } else return CMatrix(); }

    Remélem meg fogod érteni hogy mely változók az osztály tagjai és a nevéből megérted hogy mire való. A kódot megpróbáltam átformázni hogy a prog.hu jól jelenitse meg. remélem ki mensz belőle. Illetve maga a project ne DirectX alá készült de az algoritmust fel tudod használni.
    Mutasd a teljes hozzászólást!
  • Nem, és nem kapsz forráskódot, akkor sose tanulod meg. Van egy transzformációs mátrixod, ami Scaling, RotationX * RotationY * RotationZ, Translation transzformációs mátrixokból áll elő. Jelöld el ezt A-val.
    Ekkor A := S * (Rx * Ry * Rz) * T
    Na most ha szemfüles vagy, akkor Rx * Ry * Rz helyett használod a RotationAroundArbitraryAxis -t és van egy darab R-ed; vagyis A = S * R * T. Tényezőnként minden transzformációs mátrixnak létezik az invert transzformációs mátrixa. Vagyis Scaling transzformációs mátrixa S^-1. Rotation inverze R^-1. Translation inverze T^-1.
    Na most vegyünk egy tök egyszerű példát. Ha adott két mátrix A és B amik között definiált a szorzás művelet, akkor legyen X ezen két mátrix szorzata.
    X = A * B
    Ekkor az is ismeretes, hogy ha gyorsan ki tudod számolni A és B inverzét, ami transzformációs mátrixoknál naná, hogy gyorsan megy, akkor X inverzét is elég gyorsan megkapod.
    X^-1 = B^-1 * A^-1

    Vagyis, mire jó ez neked. Normál esetben HLSL vertex shader-ben transzformálod a vertexeket, modelSpace-ből worldSpace-be, majd onnan viewSpace-be és végül viewSpace-ből projectionSpace-be és abból már megy a rajzolás a backBufferre némi zbuffering után.
    Ezt csinálod ugye HLSL-ben:
    VS_OUT mVS(VS_IN vertexInput) { VS_OUT outp; outp.pos.w = 1.0f; outp.pos = mul(projectionMatrix, mul(viewMatrix, mul(vertexInput.pos, worldMatrix))); }
    Hogy megkapd ezek után a vertex eredeti azaz nem transzformált koordinátáit a saját modelSpace -ében, akkor semmi mást nem csinálsz csak végrehajtod az inverz transzformációt. Mi lesz az inverz transzformáció?
    cbuffer cbPerFrame { float4x4 worldMatrix; float4x4 worldInverse; float4x4 viewMatrix; float4x4 viewInverse; float4x4 projectionMatrix; float4x4 projectionInverse; }
    VAGY:
    cbuffer cbPerFrame { float4x4 wvpMatrix; float4x4 wvpInverse; }
    Ezesetben mielőtt meghívod meghívnád a render-t mondjuk az update-ben frissíted a constantbuffert. Dx11-ben ez:
    D3D11_BUFFER_DESC cBuffer; ZeroMemory(&cBuffer, sizeof(D3D11_BUFFER_DESC)); cBuffer.BindFlags = D3D11_BIND_CONSTANT_BUFFER; cBuffer.ByteWidth = sizeof(cBufferPerFrame); cBuffer.Usage = D3D11_USAGE_DEFAULT; HRESULT hr = m_Device->CreateBuffer(&cBuffer, 0, reinterpret_cast<void**>(&perFrame_buffer)); if (FAILED(hr)) { ... } .... perFrame_buffer->wvpMatrix = XMMatrixTranspose(m_Scene->getWorldMatrix() * m_Camera.getViewMatrix() * m_projectionMatrix); perFrame_buffer->wvpInverse = XMMatrixTranspose(getInverseProjection() * m_Camera->getInverseView() * m_Scene->getInverseWorld()); ... getInverseXYZ(FXMVECTOR determinant, CXMMATRIX matrix) { XMMATRIX inverse = XMMatrixInverse(determinant, matrix); return inverse; }
    Nah remélem elég kielégítő választ adtam. Ha még mindig nem megy, akkor olvass el egy-két könyvet. Sok szerencsét!
    Mutasd a teljes hozzászólást!
  • Pfff...

    K***a édesanyjuk rézporos p***áját...

    Úgy látom könyvhöz kell folyamodnom. Remélem középiskolában már tanulni fogjuk az efféléket...
    Mutasd a teljes hozzászólást!
  • Középiskolában ?
    Még egyetemen sem nagyon tanítanak Direct3D-t csak egy "jó kis" 1.2-es fix pipeline-os openGL-t.
    Majd egyetemen megtanulod a hozzá való matematikát, aztán már "piskóta".
    Mutasd a teljes hozzászólást!
  • Végül is D3DXVec3TransformCoord()-dal sikerült megoldanom a problémát.
    Mutasd a teljes hozzászólást!
abcd