Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Irrlicht]Budowa labiryntu ze sześcianów, a kolizja

Ostatnio zmodyfikowano 2017-01-06 16:12
Autor Wiadomość
BigBang
Temat założony przez niniejszego użytkownika
[Irrlicht]Budowa labiryntu ze sześcianów, a kolizja
» 2017-01-05 15:36:04
Witam.

Ostatnio piszę sobie projekt w C++ w silniku Irrlicht (na tym projekcie się go uczę). Jest to prosta gra, której celem będzie pokonanie losowo wygenerowanego labiryntu w 3D. Labirynty ma postać tablicy 2D typu bool, która wygląda tak:
C/C++
bool labirynt[ 5 ][ 5 ] = {
    { 1, 1, 1, 1, 1 },
    { 1, 0, 0, 0, 1 },
    { 1, 0, 1, 0, 1 },
    { 1, 0, 0, 0, 1 },
    { 1, 1, 1, 1, 1 }
};

Gdzie 1 oznacza ścianę, a 0 puste miejsce. Uznałem, że najprościej i najszybciej będzie w miejscu 1 rysować sześcian (addCubeSceneNode) o krawędzi 30. Na szybko zrobiłem to tak:
C/C++
for( int i = 0; i < 5; i++ )
for( int j = 0; j < 5; j++ )
if( maze[ i ][ j ] )
{
    ISceneNode * sciana = smgr->addCubeSceneNode( 30 );
    sciana->setPosition( vector3df( j * 30, 0, i * 30 ) );
    sciana->setMaterialTexture( 0, driver->getTexture( "media/wall.tga" ) );
    sciana->setMaterialFlag( EMF_LIGHTING, false );
}

No cóż, działa to całkiem dobrze, nawet przy sporej ilości bez problemu utrzymuje 60FPS na mojej integrze. Ale to nie w tym leży problem. Do poruszania się potrzebna jest kolizja (nie mogę przecież umożliwić graczowi przechodzenie przez ściany). Postanowiłem wykorzystać tą wbudowaną w irrlichta, gdyż jest w pełni wystarczająca do tak prostego projektu. Niestety wystąpił pewien problem. Kolizja w Irrlicht polega na utworzeniu ITrianagleSelector, załadowaniu do niego trójkątów mapy, podpięciu go do ISceneNodeAnimator, utworzenie CollisionResponseAnimator i podpięciu go do kamery. Problem polega na tym, że nie jestem w stanie utworzyć ITriangleSelector z mapy, bo mapa to nie jest jeden obiekt, a wiele sześcianów + plane (jako podłoga) i każdy jest jako osobny ISceneNode. Tak więc nie jestem w stanie utworzyć ITriangleSelector, bo poprostu nie mam jednego ISceneNode, który by symbolizował całą mapę. Co więc mogę zrobić:
1. W jakiś sposób połączyć wszystkie elementy mapy w jeden ISceneNode
2. Jakoś inaczej rysować mapę

Dodam, że utworzenie mapy z góry nie wchodzi w rachubę, bo ma być dynamicznie generowana. Ma ktoś jakikolwiek pomysł jak to załatwić? Z góry dziękuję za pomoc.
P-156029
pekfos
» 2017-01-05 21:42:54
Tak więc nie jestem w stanie utworzyć ITriangleSelector, bo poprostu nie mam jednego ISceneNode, który by symbolizował całą mapę.
Więc dodaj jeden ISceneNode, który by symbolizował całą mapę. W końcu to węzły drzewa, nie listy.
P-156055
BigBang
Temat założony przez niniejszego użytkownika
» 2017-01-06 16:12:17
A w jaki sposób mam połączyć wiele ISceneNode w jeden, który symbolizuje je wszystkie?

Edit: Ok, znalazłem sposób na to. Ktoś napisał MeshCombiner dla Irrlichta, który pozwala połączyć dowolną ilość Mesh w jeden ISceneNode. Dokładnie o to mi chodziło. Jak ktoś jest zainteresowany, to tutaj jest wszystko opisane:
http://irrlicht.sourceforge.net/forum/viewtopic.php?t=39598

Zamykam, dziękuję za odpowiedzi.
P-156104
« 1 »
  Strona 1 z 1