Weltmatrizen, einfache Dreiecke und ich hab keinen Durchblick :(



  • Guten Abend zusammen.

    Also, ich muss leider mir grad selber eingestehen, dass ich von nichts ne Ahnung habe 😞
    Ich glaube, ich habe das grundprinzip doch noch nicht ganz verstanden.
    Also, nun zu meinem Problem ^^

    Ich habe folgenden Code:

    // Definition des Vertexformats
    #define D3D_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
    
    struct CustomVertex{
        FLOAT x, y, z, rhw; // die transformierte Position des Vertex
        DWORD color;        // die Farbe des Vertex
    };
    
    // die Vertices des Dreiecks
    CustomVertex TriangleVertices[] =
    {
        { 320.0f, 150.0f, 0.0f, 1.0f, 0xFF0000FF },
        { 400.0f, 330.0f, 0.0f, 1.0f, 0xFFFF0000 },
        { 240.0f, 330.0f, 0.0f, 1.0f, 0xFF00FF00 }
    };
    
    // die Weltmatrix
    D3DXMATRIX worldMatrix( 1,  0,  0, 0,
    					    0,  1,  0, 0,
    					    0,  0,  1, 0,
    					    0,  0, 90, 1);
    
    .
    .
    .
    
        // Wenn eine Nachricht vorliegt, wird sie behandelt
        while(msg.message != WM_QUIT)
        {
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {                      
                lpD3DDevice = Direct3D.GetDevice();
    
                // Beginn der Szene
                Direct3D.BeginScene();
    
    			// Das Vertex-Format festlegen
    			lpD3DDevice->SetFVF(D3D_CUSTOMVERTEX);
    
    			// Weltmatrix setzen
    			lpD3DDevice->SetTransform(D3DTS_WORLD, &worldMatrix);
    
                // die Quelle für das Dreieck setzen
                lpD3DDevice->SetStreamSource(0,VB_Triangle,0,sizeof(CustomVertex));
    
                // Das Dreieck ist das erste Element im Puffer
                // und es wird genau ein Objekt gezeichnet
                lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
    
                // Die Szene ist beendet
                Direct3D.EndScene();
            }
    
        }
    

    Das Dreieck, das oben fest kodiert ist, wird ordnungsgemäß angezeigt. Das Problem ist nur, dass ich eigentl. mit der Matrix wolrdMatrix das ganze Dreieck entlang der z-Achse verschieben wollte. und genau das passiert nicht.
    ich vermute mal, dass ich den sinn der weltmatrix und der projektionsmatrix noch nicht ganz durchschaut habe 😞
    bitte helft mir!

    Liebe Grüße,
    Schuri



  • Wenn du die dreicke an der Z-Achse verschieben willst, dann würde ich das in etwa so machen.

    D3DXMATRIX m;
    for(long i = 0; i < 15; ++i) // 15 = Anzahl der Dreiecke
    {
        D3DXMatrixTranslation(&m, 100.0f, //XPosition des Dreiecks
        150.0f, // YPosition des Dreiecks
        i*20.0f); //ZPosition des Dreickes 20 = Abstand zwichen den Dreiecken.
    
        D3DDevice->SetTransform(D3DTS_WORLD, &m);
        D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    }
    

    Damit werden jetzt 15 Dreiecke an denselben X und Y Koordinaten, aber an verschiedenen Z Koordinaten gezeichnet. Das ist doch das was du wolltest oder?
    Mit der Wolrd Matritze kannst du Objekte im Raum Transformieren, d.h. skalieren, rotieren und verschieben.

    Hoffe ich konnte helfen.



  • Also ich wollte eigentlich nur das eine(!) Dreieck

    // die Vertices des Dreiecks
    CustomVertex TriangleVertices[] =
    {
        { 320.0f, 150.0f, 0.0f, 1.0f, 0xFF0000FF },
        { 400.0f, 330.0f, 0.0f, 1.0f, 0xFFFF0000 },
        { 240.0f, 330.0f, 0.0f, 1.0f, 0xFF00FF00 }
    };
    

    verschieben. Und dafür hatte ich mir dann die Matrix

    // die Weltmatrix
    D3DXMATRIX worldMatrix( 1,  0,  0, 0,
                            0,  1,  0, 0,
                            0,  0,  1, 0,
                            0,  0, 90, 1);
    

    gemacht. Ich dachte, dass ich dadurch dann mein Dreieck einfach um 90 Einheiten nach hinten verschieben kann?! Weil bei den festen Koordinaten des Dreiecks ist die Z-Koordinate ja 0.0f.



  • #define D3D_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
    

    ...auf vortransformierte vertices hat die worldmatrix keinen einfluss...



  • siehe dot 😉
    benutze ein anderes Vertexformat wie D3DFVF_XYZ|D3DFVF_DIFFUSE



  • dot schrieb:

    #define D3D_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
    

    ...auf vortransformierte vertices hat die worldmatrix keinen einfluss...

    Dem muss ich widersprechen:

    Bei mir funktioniert:

    D3DXMATRIXA16 matWorld, matWorld2;
    	FLOAT fAngle = dieses->m_rotz * (2.0f * D3DX_PI) / 360.0f;
    	D3DXMatrixRotationZ( &matWorld, fAngle );
    	FLOAT fAnglex = dieses->m_rotx * (2.0f * D3DX_PI) / 360.0f;
    	D3DXMatrixRotationX( &matWorld2, fAnglex );
    	matWorld2 = matWorld * matWorld2;
    	m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld2 );
    

    mit

    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    

    und

    #define D3DFVF_CUSTOMVERTEXLIGHT (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE)
    


  • Danke!

    Das hat mir geholfen! Da hab ich doch eigentl. alles richtig verstanden 🙂 Ich habe nur nich an das Vertex-format gedacht 😉

    Dem muss ich widersprechen:

    Bei mir funktioniert:
    C/C++ Code:
    D3DXMATRIXA16 matWorld, matWorld2;
    FLOAT fAngle = dieses->m_rotz * (2.0f * D3DX_PI) / 360.0f;
    D3DXMatrixRotationZ( &matWorld, fAngle );
    FLOAT fAnglex = dieses->m_rotx * (2.0f * D3DX_PI) / 360.0f;
    D3DXMatrixRotationX( &matWorld2, fAnglex );
    matWorld2 = matWorld * matWorld2;
    m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld2 );
    C/C++ Code:
    D3DXMATRIXA16 matWorld, matWorld2;
    FLOAT fAngle = dieses->m_rotz * (2.0f * D3DX_PI) / 360.0f;
    D3DXMatrixRotationZ( &matWorld, fAngle );
    FLOAT fAnglex = dieses->m_rotx * (2.0f * D3DX_PI) / 360.0f;
    D3DXMatrixRotationX( &matWorld2, fAnglex );
    matWorld2 = matWorld * matWorld2;
    m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld2 );
    C/C++ Code:
    D3DXMATRIXA16 matWorld, matWorld2;
    FLOAT fAngle = dieses->m_rotz * (2.0f * D3DX_PI) / 360.0f;
    D3DXMatrixRotationZ( &matWorld, fAngle );
    FLOAT fAnglex = dieses->m_rotx * (2.0f * D3DX_PI) / 360.0f;
    D3DXMatrixRotationX( &matWorld2, fAnglex );
    matWorld2 = matWorld * matWorld2;
    m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld2 );

    mit C/C++ Code:
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    C/C++ Code:
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    C/C++ Code:
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
    und C/C++ Code:
    #define D3DFVF_CUSTOMVERTEXLIGHT (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE)
    C/C++ Code:
    #define D3DFVF_CUSTOMVERTEXLIGHT (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE)
    C/C++ Code:
    #define D3DFVF_CUSTOMVERTEXLIGHT (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE)

    Genau darum ging es ja. Ich hatte das Vertexformat:

    #define D3D_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
    

    und das besagt, dass die X-,Y- und Z-Koordinate absolut ist. Also nicht mehr transformiert wird. bei dir fehlt das RHW. deshalb werden deine Koordinaten auch transformiert.

    Liebe Grüße, Hannes



  • schuri schrieb:

    Genau darum ging es ja. Ich hatte das Vertexformat:

    #define D3D_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
    

    und das besagt, dass die X-,Y- und Z-Koordinate absolut ist.

    oop, nicht genau geguckt... 😉


Log in to reply