2010-06-15 7 views
2

Я загружаю несколько ячеек из .x-файлов в разные переменные сетки. Теперь я хотел бы рассчитать ограничительную сферу во всех сетках, которые я загрузил (и которые отображаются) Прошу, пожалуйста, как это может быть достигнуто. Может ли VertexBuffers быть добавлен togather в одну переменную, а boundingSphere будет вычисляться с использованием этого? (если да, то как они добавляются к вершинамBuffers togather) В противном случае, какую альтернативу вы предложили бы !? 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++; 
} 

Теперь вам нужно пройти через каждый верт и работать, какие верт находится дальше от центра.

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