Bei bestimmten Winkeln "verschwinden" manche Polygone - wie vermeiden?



  • Hallo allerseits!

    Ich habe folgendes Problem:
    Bei bestimmten Winkeln bei Rotation um die z-Achse "verschwinden" manche Polygone, siehe die folgenden Graphiken (Direktlinks zu Bildern - ohne Werbung), in der dieselbe Situation aus verschiedenen Winkeln dargestellt wird:
    313° - alles klar
    237° - auf einer Bildhälfte verschwinden Poygone (mit seltsamer Grenze)
    248° - fast auf gesamter Bildbreite verschwinden Polygone (Grenze links noch sichtbar)

    woran könnte das liegen?

    Die Polygone werden übrigens wie folgt erzeugt:

    HRESULT NewGeometry()
    {
    // schreibt den funktionswert in die z Koordinate, sonst wie init.
    
        // Initialize Vertices Pattern
        CUSTOMVERTEX g_Vertices[6*D3DxBloecke]; 
    	VOID* pVertices;
    
    for (int j = 0; j < D3DyBloecke; j++)
    {
      for (int i = 0; i < D3DxBloecke; i++)
       {
    	  g_Vertices[6* i + 0].x =  xStep * i + xOffset; 
    	  g_Vertices[6* i + 0].y =  yStep * j + yOffset; 
    	  g_Vertices[6* i + 0].z =  zskal(funktionswert[xpos(i)][ypos(j)]); 
    	  g_Vertices[6* i + 0].color = D3DCOLOR_XRGB(rot(funktionswert[xpos(i)][ypos(j)]),gruen(funktionswert[xpos(i)][ypos(j)]),blau(funktionswert[xpos(i)][ypos(j)])); 
    	  g_Vertices[6* i + 1].x =  xStep * i + xOffset + xStep; 
    	  g_Vertices[6* i + 1].y =  yStep * j + yOffset + yStep;
    	  g_Vertices[6* i + 1].z =  zskal(funktionswert[xpos(i+1)][ypos(j+1)]); 
    	  g_Vertices[6* i + 1].color =   D3DCOLOR_XRGB(rot(funktionswert[xpos(i+1)][ypos(j+1)]),gruen(funktionswert[xpos(i+1)][ypos(j+1)]),blau(funktionswert[xpos(i+1)][ypos(j+1)])); 
    	  g_Vertices[6* i + 2].x =  xStep * i + xOffset; 
    	  g_Vertices[6* i + 2].y =  yStep * j + yOffset + yStep;
    	  g_Vertices[6* i + 2].z =  zskal(funktionswert[xpos(i)][ypos(j+1)]); 
    	  g_Vertices[6* i + 2].color =  D3DCOLOR_XRGB(rot(funktionswert[xpos(i)][ypos(j+1)]),gruen(funktionswert[xpos(i)][ypos(j+1)]),blau(funktionswert[xpos(i)][ypos(j+1)]));
    	  g_Vertices[6* i + 3].x =  xStep * i + xOffset; 
    	  g_Vertices[6* i + 3].y =  yStep * j + yOffset; 
    	  g_Vertices[6* i + 3].z =  zskal(funktionswert[xpos(i)][ypos(j)]); 
    	  g_Vertices[6* i + 3].color =  D3DCOLOR_XRGB(rot(funktionswert[xpos(i)][ypos(j)]),gruen(funktionswert[xpos(i)][ypos(j)]),blau(funktionswert[xpos(i)][ypos(j)])); 
    	  g_Vertices[6* i + 4].x =  xStep * i + xOffset + xStep; 
    	  g_Vertices[6* i + 4].y =  yStep * j + yOffset; 
    	  g_Vertices[6* i + 4].z =  zskal(funktionswert[xpos(i+1)][ypos(j)]); 
    	  g_Vertices[6* i + 4].color =  D3DCOLOR_XRGB(rot(funktionswert[xpos(i+1)][ypos(j)]),gruen(funktionswert[xpos(i+1)][ypos(j)]),blau(funktionswert[xpos(i+1)][ypos(j)]));
    	  g_Vertices[6* i + 5].x =  xStep * i + xOffset + xStep; 
    	  g_Vertices[6* i + 5].y =  yStep * j + yOffset + yStep;
    	  g_Vertices[6* i + 5].z =  zskal(funktionswert[xpos(i+1)][ypos(j+1)]); 
    	  g_Vertices[6* i + 5].color =  D3DCOLOR_XRGB(rot(funktionswert[xpos(i+1)][ypos(j+1)]),gruen(funktionswert[xpos(i+1)][ypos(j+1)]),blau(funktionswert[xpos(i+1)][ypos(j+1)])); 
       }
    
    	// Fülle den vertex buffer # j
        if( FAILED( g_pVBar[j]->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
            return E_FAIL;
        memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
        g_pVBar[j]->Unlock();
    
     }
        return S_OK;
    }
    

    Die Drehung wird wie folgt realisiert:

    D3DXMATRIXA16 matWorld;
    	// Rotation 
        FLOAT fAngle = i_zwinkel * (2.0f * D3DX_PI) / 360.0f;
        D3DXMatrixRotationZ( &matWorld, fAngle );
        g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    

    Danke und Gruß!



  • Sieht aus als hättest du Probleme mit dem Depth-Buffer. Hast du diesen da überhaupt eingeschaltet?

    grüße



  • David_pb schrieb:

    Sieht aus als hättest du Probleme mit dem Depth-Buffer. Hast du diesen da überhaupt eingeschaltet?

    Nein, ich weiß auch noch nicht, was das ist. Könnte somit gut sein, danke!

    Ich schau mal, was ich rausfinden kann (hab schon den Artikel in der DirectX SDK Dok. gefunden), wenn ich Probleme habe, melde ich mich wieder.

    (Was natürlich nicht heißt, dass hier keine Anfänger-freundlichen Tipps oder Links gepostet werden dürfen...;))

    beste Grüße


Log in to reply