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...