Как вычислить ограничивающую рамку / сферу для нескольких сеток (C #) - PullRequest
2 голосов
/ 15 июня 2010

Я загружаю несколько мешей из .x файлов в разные переменные меша.Теперь я хотел бы рассчитать ограничивающую сферу по всем сеткам, которые я загрузил (и которые отображаются). Пожалуйста, объясните мне, как этого можно достичь.Могут ли VertexBuffers быть добавлены в одну переменную, и с помощью этого можно вычислить boundingSphere?(если да, то как они добавляются в vertexBuffers) Иначе какую альтернативу вы бы предложили !?Thankx

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Удивительно легко это сделать:

Вам нужно, во-первых, усреднить все свои вершины.Это дает вам центральное положение.

Это делается следующим образом в 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) и ваш радиус (радиус) и, таким образом, всю информацию, необходимую для определения ограничивающей сферы.

0 голосов
/ 23 июня 2010

У меня есть идея, что я хотел бы сделать, это то, что я определяю центр каждого отдельного объекта сетки, а затем определяю центр набора объектов сетки, используя вышеупомянутую информацию ...

...