PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Direct3D & C++] lokal transformieren/rotieren?


Noebbie
2010-01-11, 21:49:24
Hallo! Ich versuche mich gerade etwas in direct3d fit zu machen. Nur habe ich gerade seit ein paar Stunden einen Hänger und ich komme wirklich nicht mehr weiter. Also:

Ich habe eine Fläche und eine Kugel.

Die Kugel soll sich innerhalb der Fläche drehen, während die Fläche (ein TRIANGLESTRIP aus 4 Koordianten) still steht.

Das Programm startet und funktioniert. D.h. die Fläche und die Kugel werden korrekt erzeugt. Ich benötige somit nur eine kleine Hilfe bei der Model View Matrix.

Bisher ist es mir nur gelungen alles rotieren zu lassen. :rolleyes:

In OpenGL bin ich es gewohnt, mittels Push() und Pop() durch die lokalen Koordinatensystem zu hüpfen. Nur hier stößt meine Denkweise irgendwie gegen eine Wand.

Hier mal ein Ausschnitt aus meinem aktuellem Codesalat:


void DXNine::render_frame(void)
{
d3ddev->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_COLORVALUE(0.0f,0.0f,0.0f,1.0f), 1.0f, 0 );
d3ddev->BeginScene();

//Look At Setup
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 20.0f, -100.0f ), // Camera position
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), // Look-at point
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); // Up vector

d3ddev->SetTransform( D3DTS_VIEW, &matView );

matrixStack->LoadIdentity();
matrixStack->LoadMatrix(&matView);



//Sonne
D3DXMATRIX mSunScale;
D3DXMATRIX mSunSpinRotation;
D3DXMATRIX mSunMatrix;

D3DXMatrixRotationY( &mSunSpinRotation, D3DXToRadian( fRotation ) );
D3DXMatrixScaling( &mSunScale, 5.0f, 5.0f, 5.0f );


mSunMatrix = mSunScale * // 1. Matrix fuer Scale
mSunSpinRotation; // 2. Matrix fuer Rotation



//Flaeche
matrixStack->MultMatrixLocal( &mPlaneMatrix );
d3ddev->SetStreamSource( 0, vertexBufferFlaeche, 0, sizeof(Vertex) );
d3ddev->SetFVF( D3DFVF_MY_VERTEX );
d3ddev->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

//Kugel (Sonne)
matrixStack->Push();
d3ddev->SetTransform(D3DTS_WORLD, &mSunMatrix);
pSunMesh->DrawSubset(0);
matrixStack->Pop();



d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
}

Coda
2010-01-11, 22:29:34
Was ist matrixStack für ein Datentyp? Und wieso verwendest du ihn?

Noebbie
2010-01-11, 22:40:45
matrixStack initialisiere ich in meiner init(), nachdem ich die Koordinaten, Farbe, etc.. für die Fläche und den Mesh (Kugel) gesetzt habe.

Er ist vom Typ LPD3DXMATRIXSTACK.

Ich erzeuge dies mit D3DXCreateMatrixStack( 0, &matrixStack );

Ich dachte bisher, dass ich mir damit quasi meine Model View Matrix erzeuge.

Da ich aber erst seit ein paar Tage D3D mache, kann diese Aussage natürlich auch totaler Blödsinn sein. Entschuldigung im Voraus! :redface:

Coda
2010-01-11, 23:12:37
D3DXMATRIXSTACK ist einfach nur ein Hilfsdatentyp der einen Matrix-Stack hält. Nichts was direkt irgendwas der API mitteilt.

Du setzt als World-Matrix einfach nur mSunMatrix. Das was du drumherum mit dem matrixStack machst wird so völlig ignoriert.