Я загружаю несколько мешей из файлов .x в разные переменные меша. Теперь я хотел бы рассчитать ограничивающую сферу для всех загруженных (и отображаемых) сеток. Пожалуйста, объясните мне, как этого можно достичь. Можно ли объединить VertexBuffers в одну переменную и с ее помощью вычислить ограничивающую сферу? (если да, то как они объединяются в vertexBuffers) В противном случае, какую альтернативу вы бы предложили!? Спасибо
Как вычислить ограничивающую рамку/сферу для нескольких сеток (C#)
Ответы (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++;
}
Теперь вам нужно пройтись по каждой вершине и выяснить, какая вершина находится дальше всего от центральной точки.
Что-то вроде этого будет работать (на С++):
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) и, таким образом, вся информация, необходимая для определения ограничивающей сферы.
person
Goz
schedule
23.06.2010
У меня есть идея, что бы я сделал, так это определить центр каждого отдельного объекта сетки, а затем определить центр набора объектов сетки, используя вышеупомянутую информацию...
person
user326075
schedule
23.06.2010