2017-07-13 4 views
0

Ce code provient de l'introduction à DX11 par Frank D Luna. Je comprends un peu la théorie de ceci. D'abord obtenir des coordonnées tronconiques dans l'espace de vue. Obtenez la matrice du monde et la matrice de vue du modèle. Obtenez la matrice inverse pour trouver les coordonnées de Frustum dans le local du modèle. Ma question est la suivante: pourquoi ai-je seulement besoin d'une matrice de composantes d'échelle X? Et si l'objet était étiré par les axes Y, Z?A propos de la mise en œuvre de l'abattage frustum

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

J'ai étudié ce livre il y a 3 ans au collège, à partir de mon cours de graphisme informatique mon tuteur nous a appris que vous ne prenez que la position X car il suppose implicitement que l'échelle d'un objet est (1, 1, 1) garder le maillage proportionné correctement, évidemment ce n'est pas toujours vrai et je recommande de ne pas ignorer totalement les autres avions. – Alex

Répondre

0

Ensuite, ce code pourrait mal fonctionner. Il ne devrait pas ignorer la mise à l'échelle sur les axes Y et Z.

Ce code suppose que l'objet sera mis à l'échelle uniformément, la même quantité à chaque axe. Si cette hypothèse est vraie, tout va bien. Si c'est faux, alors ce test est invalide.

Une solution habituelle consiste à obtenir le maximum de chaque mise à l'échelle et à utiliser cette valeur. Remarque: en outre, ce code suppose que la transformation est un maintien de l'angle (c'est-à-dire, pas de cisaillement). Habituellement, cela est le cas. Si ce n'est pas le cas, des mathématiques plus avancées sont requises (la mise à l'échelle maximale est la plus grande valeur singulière de la matrice - ceci peut être lié au théorème du cercle de Gershgorin).

+0

Si ce que vous avez dit est vrai. ce livre n'est vraiment pas un bon livre. L'auteur devrait dire à ce sujet. Il a écrit ce code car c'est le code de bonne pratique. –

+0

Peut-être qu'il existe une référence dans le texte que ce code ne fonctionne correctement qu'avec une mise à l'échelle uniforme. S'il n'y en a pas, alors cette partie du livre est certainement imparfaite. – geza