查看: 3274|回复: 17

怎么动态加载.osg文件

[复制链接]

该用户从未签到

发表于 2009-8-12 14:43:23 | 显示全部楼层 |阅读模式
在当前的渲染窗口里怎么动态添加.osg节点

该用户从未签到

 楼主| 发表于 2009-8-12 14:46:04 | 显示全部楼层
在回调里直接addChild或者removeChild,为了保证多线程的安全,可以把它们的根节点变度方式设置为DYNAMIC
根节点变度方式设置为dynamic 怎么理解  有没有例子!

该用户从未签到

 楼主| 发表于 2009-8-12 18:14:46 | 显示全部楼层
怎么动态添加删除节点啊  使用mfc的BTN控制

该用户从未签到

发表于 2009-8-12 19:14:13 | 显示全部楼层
DYNAMIC标识下,,只有Drawable和StateSet都处理完成后才返回,所有可以保证更改的安全~~

该用户从未签到

发表于 2009-8-12 19:15:31 | 显示全部楼层
DYNAMIC标识下,,只有Drawable和StateSet都处理完成后才返回,所有可以保证更改的安全~~

该用户从未签到

 楼主| 发表于 2009-8-12 20:01:23 | 显示全部楼层
#include <osgViewer/Viewer>
#include <osg/Math>
#include <osgDB/ReadFile>
#include <osg/NodeCallback>
#include <osg/MatrixTransform>
class MyTransformCallback:public osg::NodeCallback
{
public:
        MyTransformCallback(float angularVelocity)
        {
           m_angularVelocity = angularVelocity;
        }
        virtual void operator()(osg::Node *node,osg::NodeVisitor *nv)
        {
                osg::Group *root = new osg::Group;
                root->setDataVariance(osg::Object:YNAMIC);
                root->addChild(osgDB::readNodeFile("glider.osg"));
               
                if(nv&&root&&nv->getFrameStamp())
                {
                        double time = nv->getFrameStamp()->getReferenceTime();
                       
                }

                traverse(node,nv);
        }
protected:
        float m_angularVelocity;
};
int main(int agrc,char**argv)
{
        osgViewer::Viewer viewer;
        osg::Group *root= new osg::Group;
        root->setDataVariance(osg::Object::DYNAMIC);
        osg::Node *node=osgDB::readNodeFile("glider.osg");
        osg::Node *node1 =osgDB::readNodeFile("cow.osg");
        osg::MatrixTransform *transform =new osg::MatrixTransform();
        transform->setUpdateCallback(new MyTransformCallback(1.0));
        transform->addChild(node);
        //root->addChild(node1);
        root->addChild(transform);
        viewer.setSceneData(root);
        viewer.realize();
        viewer.run();
        return 1;
}

回调中咋写删除节点

该用户从未签到

发表于 2009-8-12 22:41:10 | 显示全部楼层
root->removeChild()就可以了,通常没有问题

该用户从未签到

 楼主| 发表于 2009-8-13 09:39:23 | 显示全部楼层
谢谢了  我用节点回调做了 。。终于掌握节点回调时咋回事了
但是 HANDLE里边的Frame也要坐回调么 ???

该用户从未签到

发表于 2009-8-13 13:43:04 | 显示全部楼层
“HANDLE里边的Frame”,我不明白您的意思

该用户从未签到

 楼主| 发表于 2009-8-13 13:54:18 | 显示全部楼层
帧事件处理 咋写

该用户从未签到

发表于 2009-8-13 14:32:06 | 显示全部楼层
?

该用户从未签到

 楼主| 发表于 2009-8-13 14:49:12 | 显示全部楼层
case (osgGA::GUIEventAdapter::FRAME):
     //删除节点
    root->removeChild(root->getchild(1));
     return false;
这样写么 ?

该用户从未签到

发表于 2009-8-13 15:05:12 | 显示全部楼层
这样很快就会出错,因为root的子节点是有限的,而FRAME事件每帧都会执行。您可以自己进行判断和限制

该用户从未签到

 楼主| 发表于 2009-8-13 15:44:25 | 显示全部楼层
自己进行判断和限制??
是这样么
case (osgGA::GUIEventAdapter::FRAME):
      if(g_Temp ==1)
      {
         root->removeChild(root->getchild(1));
      }
      return false;
//////////////////BTN
    g_Temp =1;

该用户从未签到

发表于 2009-8-13 16:39:33 | 显示全部楼层
还是可能有问题,因为g_Temp ==1可能会一直满足条件

该用户从未签到

 楼主| 发表于 2009-8-13 17:02:07 | 显示全部楼层
case (osgGA::GUIEventAdapter::FRAME):
      if(g_Temp ==1)
      {
         root->removeChild(root->getchild(1));
         g_Temp = 0;
      }
      return false;
删除没问题了  现在怎么把删除掉的节点addchild呢

该用户从未签到

发表于 2009-8-13 17:45:44 | 显示全部楼层
您可以自行设计逻辑结构,例如再设置一个标志量,或者用命令脚本等等,不必拘于一格

该用户从未签到

 楼主| 发表于 2009-8-13 17:50:37 | 显示全部楼层

怎么把删除掉的节点重新加载进去 ?》
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表