[gelöst] DirectX links drehendes Koordinatensystem?



  • Ist das Koordinatensystem von DirectX standartgemäß linksdrehend?
    kann man das umstellen auf rechtsdrehend?

    Bei mir bewirkt eine verschiebung um +10 in x richtung eine verschiebung in die entgegen gesetzte Richtung. code:

    D3DXMatrixTranslation(&matTransPos, 10.0f, 0, 0);
    		d3ddev->SetTransform(D3DTS_WORLD, &(PData.matSize[0] * matTransPos));
    

    dem folgend sieht mein koordinatensystem in directx so aus:

    y
           |
           |
           |
    x------0
          /
         /
        z
    

    ich hätte es gerne so wie man es normaler weise kennt.

    y
           |
           |
           |
           0------x
          /
         /
        z
    

    jemand eine idee? wie habt ihr das gelöst?



  • cl90 schrieb:

    Ist das Koordinatensystem von DirectX standartgemäß linksdrehend?

    Nope, es ist genau so, wie du's definiert hast. 😉
    Traditionell verwendet man in Direct3D oft ein linkshändiges Weltkoordinatensysten, aber natürlich kann man genausogut ein rechtshändiges verwenden, hängt ja nur davon ab, wie man seine Matritzen baut...
    Wie erzeugst du denn deine Projektionsmatrix? Bedenke bei der Interpretation des von dir beobachteten Verhaltens auch die Platzierung deiner Kamera.



  • Einfach die z-Achse mit -1 skalieren, dann ist das Koordinatensystem normal.

    Kannst ja auf OpenGL umsteigen, die verwenden das rechtsdrehende 😉



  • Senfti schrieb:

    Kannst ja auf OpenGL umsteigen, die verwenden das rechtsdrehende 😉

    Weder OpenGL noch Direct3D geben in irgendeiner Form eine Händigkeit des Weltkoordinatensystems vor. Die wird einzig und allein durch die verwendeten Matritzen und damit den Benutzer bestimmt...



  • OpenGL und D3D kennen keine Linkshändiges oder Rechtshändiges Koordinatensystem - sie multiplizieren einfach mit den Matrizen, die man ihnen vorgibt- wie es dot schon gesagt hat

    Lustig bei right-handed:

    y
    | /z+
    | /
    |/
    0------x
    /
    /
    z-

    aber nach der Transformation in normalisierten Devicekoordinaten ist -1 näher am Betrachte als +1



  • view matrix und Projektionsmatrix:

    D3DXMATRIX matView;  
    	D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3   (PData.matCamPos._41,
    												PData.matCamPos._42, 
    												PData.matCamPos._43), 
    												&PData.lookat,  
    								&D3DXVECTOR3   (0.0f, 1.0f, 0.0f));
    
        d3ddev->SetTransform(D3DTS_VIEW, &(matView));   
    
    	D3DXMATRIX matProjection;
    	D3DXMatrixPerspectiveFovLH  (&matProjection, D3DXToRadian(45),
    								(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT,
    								1.0f, 500.0f);
    	d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection);
    

    eigentlich ist es auch kein problem wie es so ist, es ging nur um schönheit 🙂
    wir haben einige formeln und zeichnungen für InverseKinematic gemacht und auf denen haben wir ein rechtshändiges Koordinatensystem genommen. daher müssten wir jetzt in der berechnung erstmal vom einen ins directx system umdenken. bzw jede x-koordinaten umdrehen.



  • Rat mal, wofür das LH in D3DXMatrixLookAtLH und D3DXMatrixPerspectiveFovLH steht.
    Hiweis: Es gibt die gleichen Funktionen auch als *RH Varianten... 😉



  • BTW: D3DX ist deprecated

    First of all math stuff like D3DXMatrixPerspectiveFovRH can be found in the replacement library DirectXMath (formerly called XNAMATH) which offers for instance XMMatrixPerspectiveFovRH.



  • Das stimmt, aber ich vermute mal, dass er D3D9 verwendet und dann isses wurscht, weil das is selbst genauso deprecated... :p

    Aber in jedem Fall ein guter Hinweis. 😉



  • oh ja, danke.

    aber wenn ich das jetzt beide in RH umänder dreht sich zwar das koordinatensystem, (bzw das bild ist gespiegelt) und die objekte sind seltsam transparent, irgendwie zerstört...

    habe das ganze porgramm durchgeschaut ob ich noch andere stellen finde wo irgendwie ein L oder etc vorkommt, aber nichts.



  • cl90 schrieb:

    aber wenn ich das jetzt beide in RH umänder dreht sich zwar das koordinatensystem, (bzw das bild ist gespiegelt) und die objekte sind seltsam transparent, irgendwie zerstört...

    Weil jetzt natürlich die Winding Order deiner Faces verkehrt rum ist. Das, was früher deine Back Faces waren, sind jetzt die Front Faces und umgekehrt...



  • ah danke für den tipp!
    musste einfach noch den renderstate auf umgedrehte Reihenfolge umstellen.

    m_d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
    

    Danke an alle Helfer 🙂


Anmelden zum Antworten