[Direct3D][C++] Objekte mehrmals anzeigen

M

MFZ007

Hallo

Ist es möglich ein einziges Objekt (Würfel) in Direct3D mehrmals, anders Transformiert,
anzuzeigen?

Hoffe ihr könnt mir helfen.

Gruss MFZ
 
Ja, natürlich geht das. Du musst es einfach mehrmals rendern, mit unterschiedlichen Matrizen. Wenn du Code postest (nicht zuviel), kann ich vielleicht genaueren Rat geben.
 
Code:
void CScene::RenderHelper(float Anstell, float Schwenk)
{
	m_lpD3DDevice->SetMaterial(&m_MaterialHelper);

	m_lpD3DDevice->SetStreamSource(0,VB_Helper,0,sizeof(CustomVertex));

	D3DXMATRIX TransMatrix;

	D3DXMatrixTranslation(&TransMatrix, 0.0f, 0.0f, 0.0f);

	D3DXMATRIX RotMatrixX;
	D3DXMATRIX RotMatrixY;
	D3DXMATRIX RotMatrixXY;

	D3DXMatrixRotationY(&RotMatrixY, (Schwenk * D3DX_PI / 180));
	D3DXMatrixRotationX(&RotMatrixX, -(Anstell * D3DX_PI / 180));

	D3DXMatrixMultiply(&RotMatrixXY, &RotMatrixX, &RotMatrixY);

	D3DXMATRIX ScaleMatrix;

	D3DXMatrixScaling(&ScaleMatrix, 0.250f, 1.0f, 30.0f);

	D3DXMATRIX WorldMatrix;
	D3DXMATRIX TempMatrix;

	D3DXMatrixMultiply(&TempMatrix, &ScaleMatrix, &TransMatrix);
	D3DXMatrixMultiply(&WorldMatrix, &TempMatrix, &RotMatrixXY);

	m_lpD3DDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);

	m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,4);
}

Das ist die Transformation und das Rendering für mein
Kanonenrohr. ich möchte aber dieses gleich doppelt anzeigen lassen.
Wie soll ich das nun anstellen?

Gruss MFZ
 
Wahrscheinlich ist es komplizierter, und ich komme im Moment nicht dazu, mich in die Routine einzudenken, aber hast du mal ausprobiert, die Routine zweimal mit unterschiedlichen Werten aufzurufen?
Vermutlich gibt es allerdings Probleme, wenn du die individuelle Rotation jedes Objektes in die Weltmatrix einrechnest.
 
Genau das passiert auch

Habs jetzt noch einmal mit anderen Werten versucht jedoch ohne Erfolg.
Muss wohl doch nen neuen Vertex Buffer anlegen. :(
Es wird doch einen Weg geben das mehrmals aus dem Gleichen
VB darzustellen...

Hat das denn noch nie jemand versucht
Mal sehen vielleicht weiss noch jemand was.
Erstmal danke für deine Idee Kachelator.

Gruss MFZ
 
Code:
  D3DXMATRIX      matView,
                  matProj,
                  matWorld;

  CDynObject*     pDynObjectPlayer = suche spielerobjekt;

  D3DXVECTOR3     vectPlayerPos = D3DXVECTOR3( 0, 0, 0 );
  if ( pDynObjectPlayer )
  {
    vectPlayerPos = pDynObjectPlayer->m_Orientation.GetPosition();
  }
  
  D3DXMatrixLookAtLH( &matView, 
                      &D3DXVECTOR3( player-look-at herausfinden),
                      &vectPlayerPos,
                      &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );

  D3DXMatrixPerspectiveFovLH( &matProj,
                              D3DX_PI / 4,
                              (float)m_dwRenderWidth / (FLOAT)m_dwRenderHeight,
                              1.0f,
                              1000.0f );
  D3DXMatrixIdentity( &matWorld );
  SetTransform( D3DTS_WORLD,      &matWorld );
  SetTransform( D3DTS_VIEW,       &matView );
  SetTransform( D3DTS_PROJECTION, &matProj );

  // dynam. Objekte darstellen
  for ( ... alle dynamischen Objekte ... )
  {
    CDynObject*   pDynObject = *itDynObjects;
    SetTransform( D3DTS_WORLD, &( pDynObject->m_Orientation.GetMatrix() ) );
    pDynObject->Display( *this );
    // Das läuft auf 3DDevice->DrawPrimitve() hinaus
  }

Vielleicht hilft dir dieser Schnipsel (Pseudo-)Code schon weiter. Es sind einige Befehle/Routinen dabie, die du nicht zur Verfügung hast, aber der Code soll auch nur das Prinzip illustrieren.
 
Das wars!:p

Hat sehr geholfen.
Hab mir ne Klasse für meine Objekte geschrieben und
es funktioniert prächtig.

Danke für deine Hilfe.

Gruss MFZ
 
Zurück