2010-06-15 209 views
2

我從不同網格變量的.x文件中加載多個網格。 現在我想計算我加載的所有網格(以及正在顯示的網格)的邊界球體。請指導我如何實現這一點。 是否可以將VertexBuffers附加到一個變量中並使用該變量計算boundingSphere? (如果是的話,他們如何vertexBuffers加入收集) 否則你會建議什麼替代!? Thankx如何跨多個網格計算邊界框/球面(C#)

回答

0

我有一個想法,我會做的是,我將確定每一個網格對象的中心,然後通過使用上述信息,確定網格對象的集合的中心......

2

它令人驚訝地容易做到這一點:

你需要,首先,平均所有的頂點。這給你的中心位置。

這是在C如下完成++(對不起我的C#是很生疏,但它應該給你的一個想法):

D3DXVECTOR3 avgPos; 

const rcpNum = 1.0f/(float)numVerts; // Do this here as divides are far more epxensive than multiplies. 
int count = 0; 
while(count < numVerts) 
{ 
    // Instead of adding everything up and then dividing by the number (which could lead 
    // to overflows) I'll divide by the number as I go along. The result is the same. 
    avgPos.x += vert[count].pos.x * rcpNum; 
    avgPos.y += vert[count].pos.y * rcpNum; 
    avgPos.z += vert[count].pos.z * rcpNum; 
    count++; 
} 

現在,你需要去通過每一個VERT制定出這VERT是最遠遠離中心點。

像這樣的工作(在C++):

float maxSqDist  = 0.0f; 

int count = 0; 
while(count < numVerts) 
{ 
    D3DXVECTOR3 diff = avgPos - vert[count].pos; 

    // Note we may as well use the square length as the sqrt is very expensive and the 
    // maximum square length will ALSO be the maximum length and yet we only need to 
    // do one sqrt this way :) 
    const float sqDist = D3DXVec3LengthSq(diff); 
    if (sqDist > maxSqDist) 
    { 
     maxSqDist = sqDist; 
    } 
    count++; 
} 

const float radius = sqrtf(maxSqDist); 

而且你現在有你的中心位置(avgPos)和您的半徑(半徑),因此,你需要定義邊界的所有信息領域。