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

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

Чтобы ускорить рендеринг, я группирую кубы в куски, которые объединяют кубы 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();
}

person Razor Storm    schedule 04.02.2013    source источник
comment
Ogre3D — это движок рендеринга; он не выполняет обнаружение столкновений.   -  person Nicol Bolas    schedule 05.02.2013
comment
У Ogre есть свои собственные форумы, которыми я лично пользовался, и они очень хорошие. навскидку я бы сказал да на ваш вопрос   -  person Sellorio    schedule 05.02.2013
comment
Ах да, я также опубликую это на форумах Ogre. @NicolBolas, это правда. Я просто основывал это на некоторых учебниках Ogre, которые есть на их вики, в которых было обнаружение столкновений для отдельных объектов. Я подумал, что раз они могут делать это для сущностей, то, возможно, у них будет что-то похожее и на то, что делаю я.   -  person Razor Storm    schedule 05.02.2013


Ответы (2)


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

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

person Jay    schedule 20.02.2013

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

person Mario Tollardo    schedule 16.03.2013