Bonjour, Bonsoir

J'ai comme projet d'intégrer une scène 3D avec OpenSceneGraph sur dans un logiciel de modélisation physique (ce qui est fait ).

Cependant j'ai un problème je doit faire en sorte qu'un objet (un cube pour ce cas) se déplace dés que je change une valeur sur le logiciel, je récupère bien les valeurs cependant lorsque je veut mettre a jour la position de setPosition de la classe PositionAttitudeTransform d'osg rien n'y fait.

Voici les morceaux de codes mis en place :

MainScene.cpp (la classe qui créer les objet principaux de la scène)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
osg::Node * CMainScene::loadIslands(const std::string & terrain_shader_basename)
{
    // la fonction qui creer le cube
 
    // sa position que je retourne
    osg::PositionAttitudeTransform* islandpat = new osg::PositionAttitudeTransform;
    islandpat->addChild(rootGeode.get());
    islandpat->setPosition(osg::Vec3f(0.0f, 0.0f, depthSea));
 
    return islandpat;
}
le noeud est retourner et passer a mon Group de noeud la scène est ensuite lancer et a son Thread avec lequel je passe les valeurs a mettre a jour et qui appelle la fonction qui met a jour la position

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
void CRenderThread::run() {
 
    // les valeurs et la fonction de mise a jour son dans la fonction PreFrameUpdate
    do
    {
        m_pDeepSceneThread->PreFrameUpdate(m_pDeepSceneThread->m_pRoot);
        viewer->frame();
        m_pDeepSceneThread->PostFrameUpdate();
    } while (!viewer->done() && !_done);
 
}
PreFrameUpdate :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
void CDeepScene::PreFrameUpdate(osg::Group* nodeGroup)
{
               // les valeurs est la fonction
                m_dOceanDepth = pShapeSea->GetDepth();
                m_dOceanCylinderWidth = m_pModel->m_dEnvWidth;
                m_pPriGroup->m_dDepth = m_dOceanDepth;
                m_pPriGroup->updateScene(pShapeSea->GetClassType().m_TypeFlag, nodeGroup);
            }
        }
    }
}

et enfin la classe en charge de la mise a jour qui comporte un visiteur de noeud et un Callback



La fonction en charge de la mise a jour :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
osg::Node* PRIGroup::updateScene(int nTypeClass,osg::Group* pGroup)
{
 
    osg::ref_ptr<osg::Node> islandModel = new osg::Node;
    FindNamedNodeVisitor fnnv("loadIslands");
    osg::ref_ptr<osg::PositionAttitudeTransform> positionMatrix = new osg::PositionAttitudeTransform;
    positionMatrix->setDataVariance(osg::Object::DYNAMIC);
 
    switch (nTypeClass)
    {
    case CGeneric::SHAPE_SEA:
        islandModel = m_pMainScene->loadIslands("terrain_lispsm");
        m_pMainScene->changeScene(CMainScene::CLEAR);
        pGroup->accept(fnnv);
 
        if (!fnnv._foundNodes.empty())
        {
 
            //positionMatrix->setUpdateCallback(new DepthCullBack);
            positionMatrix->addChild(islandModel.get());
            positionMatrix->setPosition(osg::Vec3f(0.f, 0.f, 0.f));
            pGroup->addChild(positionMatrix);
        }
        return pGroup;
        break;
    default:
        break;
    }
}

Le CallBack :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DepthCullBack : public osg::NodeCallback{
 
public:
    virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
        if (nv->getVisitorType() == osg::NodeVisitor::CULL_VISITOR)
        {
            osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(nv);
            // update position
            osg::PositionAttitudeTransform* posM = static_cast<osg::PositionAttitudeTransform*>(node);
            posM->setPosition(osg::Vec3f(0.0f, 0.f,m_pPriGroup->m_dDepth));
        }
    }
private:
    PRIGroup* m_pPriGroup;
 
};
Le visiteur de noeud :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class FindNamedNodeVisitor : public osg::NodeVisitor
{
public:
    FindNamedNodeVisitor(const string& name) : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), _name(name) {}
 
    virtual void apply(osg::Node& node) {
        if (node.getName() == _name) {
            _foundNodes.push_back(&node);
        }
    }
 
    typedef vector<osg::ref_ptr<osg::Node>> NodeList;
    string _name;
    NodeList _foundNodes;
};

Voila, toute aide sera la bienvenue j'ai essayé de donner un maximum d'informations XD