2

異なるメッシュ変数の .x ファイルから複数のメッシュをロードします。ここで、ロードした (および表示されている) すべてのメッシュの境界球を計算したいと思います。これを達成する方法を教えてください。VertexBuffers を 1 つの変数にまとめて追加し、それを使用して boundingSphere を計算できますか? (はいの場合、どのように頂点バッファが追加されますか)それ以外の場合、どのような代替案を提案しますか!? ありがとう

4

2 に答える 2

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++;
}

次に、すべての頂点を調べて、中心点から最も離れている頂点を特定する必要があります。

次のようなものが機能します (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) と半径 (radius) が得られ、境界球を定義するために必要なすべての情報が得られました。

于 2010-06-23T09:34:06.227 に答える
0

私がすることは、すべてのメッシュオブジェクトの中心を決定し、次に前述の情報を使用してメッシュオブジェクトのコレクションの中心を決定することです...

于 2010-06-23T09:10:14.543 に答える