also zu deiner collisionsabfrage kann ich dir helfen.
Ich hab mal im englischem forum geguckt und folgendes gefunden. Bei mir funktioniert sehr gut, ohne jegliche art von problemen:
Like I said, there is no single function. You have to write the code. Well, I guess now I've written the code...
Code:
void ISceneNode_assignTriangleSelector(scene::ISceneNode* node, scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
if (!node || !smgr || !ifs)
return;
if (node->getType() == scene::ESNT_OCT_TREE)
{
io::IAttributes* attribs = ifs->createEmptyAttributes();
if (attribs)
{
node->serializeAttributes(attribs);
// get the mesh name out
core::stringc name = attribs->getAttributeAsString("Mesh");
attribs->drop();
// get the animated mesh for the object
scene::IAnimatedMesh* mesh = smgr->getMesh(name.c_str());
if (mesh)
{
scene::ITriangleSelector* selector =
smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node, 128);
node->setTriangleSelector(selector);
selector->drop();
}
}
}
else if (node->getType() == scene::ESNT_MESH)
{
scene::IMeshSceneNode* msn = (scene::IMeshSceneNode*)node;
if (msn->getMesh())
{
scene::ITriangleSelector* selector =
smgr->createTriangleSelector(msn->getMesh(), msn);
msn->setTriangleSelector(selector);
selector->drop();
}
}
else if (node->getType() == scene::ESNT_ANIMATED_MESH)
{
scene::IAnimatedMeshSceneNode* msn = (scene::IAnimatedMeshSceneNode*)node;
scene::IAnimatedMesh* am = msn->getMesh();
if (am)
{
scene::ITriangleSelector* selector =
smgr->createTriangleSelector(am->getMesh(0), msn);
msn->setTriangleSelector(selector);
selector->drop();
}
}
else if (node->getType() == scene::ESNT_TERRAIN)
{
scene::ITerrainSceneNode* tsn = (scene::ITerrainSceneNode*)node;
scene::ITriangleSelector* selector =
smgr->createTerrainTriangleSelector(tsn, 0); // probably don't want lod 0 all the time...
tsn->setTriangleSelector(selector);
selector->drop();
}
else if (node->getType() == scene::ESNT_CUBE)
{
scene::ITriangleSelector* selector =
smgr->createTriangleSelectorFromBoundingBox(node);
node->setTriangleSelector(selector);
selector->drop();
}
else
{
// not something we want to collide with
}
}
void ISceneNode_assignTriangleSelectors(scene::ISceneNode* node, scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
// assign a selector for this node
ISceneNode_assignTriangleSelector(node, smgr, ifs);
// now recurse on children...
core::list<scene::ISceneNode*>::ConstIterator begin = node->getChildren().begin();
core::list<scene::ISceneNode*>::ConstIterator end = node->getChildren().end();
for (/**/; begin != end; ++begin)
ISceneNode_assignTriangleSelectors(*begin, smgr, ifs);
}
void ISceneManager_assignTriangleSelectors(scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
ISceneNode_assignTriangleSelectors(smgr->getRootSceneNode(), smgr, ifs);
}
Now you can create a triangle selector for most scene node types. I would probably split that function up a bit and maybe write some code to see if the nodes were supposed to get collision information generated at all, but you should be able to figure it out on your own. Now all you need to do now is create a meta selector for those selectors.
Code:
void ISceneNode_gatherTriangleSelectors(scene::ISceneNode* node, scene::IMetaTriangleSelector* meta)
{
scene::ITriangleSelector* selector = node->getTriangleSelector();
if (selector)
meta->addTriangleSelector(selector);
// now recurse on children...
core::list<scene::ISceneNode*>::ConstIterator begin = node->getChildren().begin();
core::list<scene::ISceneNode*>::ConstIterator end = node->getChildren().end();
for (/**/; begin != end; ++begin)
ISceneNode_gatherTriangleSelectors(*begin, meta);
}
void ISceneManager_gatherTriangleSelectors(scene::ISceneManager* smgr, scene::IMetaTriangleSelector* meta)
{
ISceneNode_gatherTriangleSelectors(smgr->getRootSceneNode(), meta);
}
And you'd use the code like this...
Code:
// recursively assign selectors to nodes
ISceneManager_assignTriangleSelectors(smgr, device->getFileSystem());
// recursively gather triangle selectors into a meta selector
scene::IMetaTriangleSelector* meta = smgr->createMetaTriangleSelector();
ISceneManager_gatherTriangleSelectors(smgr, meta);
// add a user controlled camera
scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
// create collision response using all objects for collision detection
scene::ISceneNodeAnimator* anim =
smgr->createCollisionResponseAnimator(meta, camera, core::vector3df(30,30,30), core::vector3df(0,-1,0), core::vector3df(0,6,0));
camera->addAnimator(anim);
anim->drop();
// drop the meta selector. it is owned by the animator
meta->drop();
Travis
ich habe davon alles ausgelagert, bis halt auf das letzte, was ich ja selber zum aufruf brauch..vergess vorher nicht die scene zu laden.
Falls du aber ein größeres projekt machen willst, so wie ich für die gamesbranche, dann benutz den code aber nicht blos, sonder verinnerliche in dir auch, den dann kannst du ihn auch für andere zwecke verwenden. einfach alles zusammkopieren geht nicht.