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);
}
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);
}