2017-07-13 2 views
0

Dieser Code ist von Einführung in DX11 von Frank D Luna. Ich verstehe die Theorie davon. Zuerst die Frustum-Koordinaten im Ansichtsbereich abrufen. Holen Sie sich die Weltmatrix und die Ansichtsmatrix des Modells. Holen Sie sich die inverse Matrix, um die Koordinaten des Kegelstumpfs im lokalen Modell zu ermitteln.Informationen über die Implementierung von Frustum Culling

Meine Frage ist, warum brauche ich nur X-Komponente der Maßstabsmatrix? Was ist, wenn das Objekt durch Y, Z-Achsen gestreckt wurde?

for(UINT i = 0; i < mInstancedData.size(); ++i) 
{ 
    XMMATRIX W = XMLoadFloat4x4(&mInstancedData[i].World); 
    XMMATRIX invWorld = XMMatrixInverse(&XMMatrixDeterminant(W), W); 
    // View space to the object's local space. 
    XMMATRIX toLocal = XMMatrixMultiply(invView, invWorld); 

    // Decompose the matrix into its individual parts. 
    XMVECTOR scale; 
    XMVECTOR rotQuat; 
    XMVECTOR translation; 
    XMMatrixDecompose(&scale, &rotQuat, &translation, toLocal); 

    // Transform the camera frustum from view space to the object's local space. 
    XNA::Frustum localspaceFrustum; 
    //TransformFrustum(&localspaceFrustum, &mCamFrustum, XMVectorGetX(scale), rotQuat, translation); 
    XNA::TransformFrustum(&localspaceFrustum, &mCamFrustum, XMVectorGetX(scale), rotQuat, translation); 

    // Perform the box/frustum intersection test in local space. 
    if(XNA::IntersectAxisAlignedBoxFrustum(&mSkullBox, &localspaceFrustum) != 0) 
    { 
     // Write the instance data to dynamic VB of the visible objects. 
     dataView[mVisibleObjectCount++] = mInstancedData[i]; 
    } 
} 

md3dImmediateContext->Unmap(mInstancedBuffer, 0); 
} 
+0

Ich studierte dieses Buch vor 3 Jahren am College, von meinem Computergrafikkurs mein Tutor lehrte uns, dass Sie nur die X-Position nehmen, da implizit angenommen wird, dass der Maßstab eines Objekts (1, 1, 1) ist Halten Sie das Netz richtig proportioniert, das stimmt natürlich nicht immer, und ich würde empfehlen, die anderen Ebenen nicht völlig zu ignorieren. – Alex

Antwort

0

Dann könnte dieser Code falsch funktionieren. Die Skalierung an der Y- und Z-Achse sollte nicht ignoriert werden.

Dieser Code setzt voraus, dass das Objekt gleichmäßig skaliert wird. Dieselbe Menge an jeder Achse. Wenn diese Annahme wahr ist, dann ist alles in Ordnung. Wenn es falsch ist, ist dieser Test ungültig.

Eine übliche Lösung besteht darin, das Maximum jeder Skalierung zu erhalten und diesen Wert zu verwenden.

Anmerkung: Außerdem setzt dieser Code voraus, dass die Transformation winkelerhaltend ist (d. H. Keine Scherung). Normalerweise ist dies der Fall. Wenn dies nicht der Fall ist, ist fortgeschrittenere Mathematik erforderlich (maximale Skalierung ist der größte singuläre Wert der Matrix - dies kann mit dem Gershgorin-Kreistheorem begrenzt werden).

+0

Wenn das, was du gesagt hast, wahr ist. Dieses Buch ist wirklich kein gutes Buch. Der Autor sollte dazu sagen. Er hat diesen Code geschrieben, da er der Best-Practice-Code ist. –

+0

Vielleicht gibt es einen Hinweis im Text, dass dieser Code nur mit einheitlicher Skalierung korrekt funktioniert. Wenn nicht, dann ist dieser Teil des Buches sicherlich unvollkommen. – geza

Verwandte Themen