Обнаружение столкновений огров на сгруппированной сетке?

Я экспериментирую с созданием игры на основе вокселей и отрисовываю миллионы кубов.

Чтобы ускорить рендеринг, я группирую кубы в куски, которые группируют кубы 32x32x32 в один меш. Это должно уменьшить количество обращений к графическому процессору и увеличить частоту кадров.

Я использую ManualObject для создания блоков, и он работает отлично. Однако проблема сейчас состоит в том, что, поскольку отдельные блоки не являются объектами, которые связаны с отдельными сценами, я не могу найти способ обнаружения столкновения.

Есть ли у ogre способ отдельно работать с подсетями ManualObject?

// Build a face with triangles if the face is visible. Don't bother building faces for hidden faces.
void Chunk::createMesh()
{
begin("BoxColor");

int iVertex = 0;
Block *block;
Block *testingBlock;

for (int x = 0; x < CHUNK_SIZE.x; ++x)
{
for (int y = 0; y < CHUNK_SIZE.y; ++y)
{
for (int z = 0; z < CHUNK_SIZE.z; ++z)
{
block = m_pBlocks[x][y][z];
if (block == NULL)
{
continue;
}

//x-1
testingBlock = 0;
if (x > 0) testingBlock = m_pBlocks[x-1][y][z];

if (testingBlock == 0)
{
position(x, y,   z+1);  normal(-1,0,0); textureCoord(0, 1);
position(x, y+1, z+1);  normal(-1,0,0); textureCoord(1, 1);
position(x, y+1, z);    normal(-1,0,0); textureCoord(1, 0);
position(x, y,   z);    normal(-1,0,0); textureCoord(0, 0);

triangle(iVertex, iVertex+1, iVertex+2);
triangle(iVertex+2, iVertex+3, iVertex);

iVertex += 4;
}

//x+1
testingBlock = 0;
if (x < 0 + CHUNK_SIZE.x - 1) testingBlock = m_pBlocks[x+1][y][z];

if (testingBlock == 0)
{
position(x+1, y,   z);      normal(1,0,0); textureCoord(0, 1);
position(x+1, y+1, z);      normal(1,0,0); textureCoord(1, 1);
position(x+1, y+1, z+1);    normal(1,0,0); textureCoord(1, 0);
position(x+1, y,   z+1);    normal(1,0,0); textureCoord(0, 0);

triangle(iVertex, iVertex+1, iVertex+2);
triangle(iVertex+2, iVertex+3, iVertex);

iVertex += 4;
}

//y-1
testingBlock = 0;
if (y > 0) testingBlock = m_pBlocks[x][y-1][z];

if (testingBlock == 0)
{
position(x,   y, z);        normal(0,-1,0);     textureCoord(0, 1);
position(x+1, y, z);        normal(0,-1,0);     textureCoord(1, 1);
position(x+1, y, z+1);      normal(0,-1,0);     textureCoord(1, 0);
position(x,   y, z+1);      normal(0,-1,0);     textureCoord(0, 0);

triangle(iVertex, iVertex+1, iVertex+2);
triangle(iVertex+2, iVertex+3, iVertex);

iVertex += 4;
}//y+1
testingBlock = 0;
if (y < 0 + CHUNK_SIZE.y - 1) testingBlock = m_pBlocks[x][y+1][z];

if (testingBlock == 0)
{
position(x,   y+1, z+1);        normal(0,1,0);  textureCoord(0, 1);
position(x+1, y+1, z+1);        normal(0,1,0);  textureCoord(1, 1);
position(x+1, y+1, z);          normal(0,1,0);  textureCoord(1, 0);
position(x,   y+1, z);          normal(0,1,0);  textureCoord(0, 0);

triangle(iVertex, iVertex+1, iVertex+2);
triangle(iVertex+2, iVertex+3, iVertex);

iVertex += 4;
}

//z-1
testingBlock = 0;
if (z > 0) testingBlock = m_pBlocks[x][y][z-1];

if (testingBlock == 0)
{
position(x,   y+1, z);      normal(0,0,-1);     textureCoord(0, 1);
position(x+1, y+1, z);      normal(0,0,-1);     textureCoord(1, 1);
position(x+1, y,   z);      normal(0,0,-1);     textureCoord(1, 0);
position(x,   y,   z);      normal(0,0,-1);     textureCoord(0, 0);

triangle(iVertex, iVertex+1, iVertex+2);
triangle(iVertex+2, iVertex+3, iVertex);

iVertex += 4;
}//z+1
testingBlock = 0;
if (z < 0 + CHUNK_SIZE.z - 1) testingBlock = m_pBlocks[x][y][z+1];

if (testingBlock == 0)
{
position(x,   y,   z+1);    normal(0,0,1);      textureCoord(0, 1);
position(x+1, y,   z+1);    normal(0,0,1);      textureCoord(1, 1);
position(x+1, y+1, z+1);    normal(0,0,1);      textureCoord(1, 0);
position(x,   y+1, z+1);    normal(0,0,1);      textureCoord(0, 0);

triangle(iVertex, iVertex+1, iVertex+2);
triangle(iVertex+2, iVertex+3, iVertex);

iVertex += 4;
}
}
}
}

end();
}

2

Решение

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

Есть обертка, и, поскольку она изначально была написана для использования с Ogre, она прекрасно интегрируется с Ogre.

0

Другие решения

В случае использования блоков (я думаю, что это похоже на то, как это делается в Minecraft), у вас, скорее всего, есть 3d-массив, в котором хранятся данные вашего блока. блок или нет? Это было бы довольно легко и быстро.

0

По вопросам рекламы [email protected]