查看: 2673|回复: 15

osg对dof节点的控制

[复制链接]

该用户从未签到

发表于 2011-4-20 19:33:50 | 显示全部楼层 |阅读模式
现在做虚拟装配课题,用到osg中dof节点的控制,资料很少,哪位有资料,传一下,谢谢

该用户从未签到

 楼主| 发表于 2011-4-20 19:34:23 | 显示全部楼层
qq 43458704

该用户从未签到

发表于 2011-4-21 08:44:43 | 显示全部楼层
DOF节点是专用于Creator数据导出的,其他情况下我们很少用到这个类

该用户从未签到

 楼主| 发表于 2011-4-22 12:33:59 | 显示全部楼层
回复 2# 2011峰幂


    是从creator中导出的 现在想要通过控制dof来实现模型的运动 osg中有一个坦克的例子 通过dof的更新回调来实现运动 但是运行不成功 老是出现访问冲突

该用户从未签到

发表于 2011-4-24 15:46:38 | 显示全部楼层
这个我用过。定位到DOF节点以后,用DofNode =dynamic_cast <osgSim:: DOFTransform*> (dofNode);先将该节点强制转换为DOFTransform类型,然后用DofNode->setCurrentHPR(...)的方法进行移动旋转等操作

该用户从未签到

 楼主| 发表于 2011-4-25 10:27:08 | 显示全部楼层
回复 5# hgyzj


    就是用的这个方法呀 可运行的时候问题总是出现在回调函数的调用时,
0x0040180a 处未处理的异常: 0xC0000005: 写入位置 0xbaadf0e5 时发生访问冲突

该用户从未签到

 楼主| 发表于 2011-4-25 10:28:18 | 显示全部楼层
回复 5# hgyzj


    现在主要是控制好多个dof节点运动,除了坦克的例子,还有别的什么例子吗

该用户从未签到

发表于 2011-4-26 08:45:00 | 显示全部楼层
可运行的时候问题总是出现在回调函数的调用时
那么您应该给出这里实现的代码,以及您的运行堆栈信息,这样大家才可能帮您判断会有什么问题

该用户从未签到

发表于 2011-4-28 23:25:24 | 显示全部楼层
貌似debug库和realease库混淆了

该用户从未签到

 楼主| 发表于 2011-5-4 09:34:51 | 显示全部楼层
class tankNodeCallback:public osg::NodeCallback
{
   public:
           virtual void operator()(osg::Node*node,osg::NodeVisitor*nv)
           {
                   osg::ref_ptr<tankDataType>tankData=
                           dynamic_cast<tankDataType*>(node->getUserData());
                   if(tankData.get())
                   {
                           tankData->updateTurretRotation();
                       
                          
                   }
                   traverse(node,nv);
           }

};
调试时中断在  tankData->updateTurretRotation();

void tankDataType::updateTurretRotation()
{
        rotation += 0.01;

        turretDOF->setCurrentHPR( osg::Vec3(rotation,0,0) );

}
例子就是教材中 坦克的例子 一直没有调试成功

该用户从未签到

 楼主| 发表于 2011-5-4 09:35:16 | 显示全部楼层
回复 8# array


    class tankNodeCallback:public osg::NodeCallback
{
   public:
    virtual void operator()(osg::Node*node,osg::NodeVisitor*nv)
    {
     osg::ref_ptr<tankDataType>tankData=
      dynamic_cast<tankDataType*>(node->getUserData());
     if(tankData.get())
     {
      tankData->updateTurretRotation();
   
     
     }
     traverse(node,nv);
    }
};class tankNodeCallback:public osg::NodeCallback
{
   public:
    virtual void operator()(osg::Node*node,osg::NodeVisitor*nv)
    {
     osg::ref_ptr<tankDataType>tankData=
      dynamic_cast<tankDataType*>(node->getUserData());
     if(tankData.get())
     {
      tankData->updateTurretRotation();
   
     
     }
     traverse(node,nv);
    }
};
调试时中断在  tankData->updateTurretRotation();
void tankDataType::updateTurretRotation()
{
rotation += 0.01;
turretDOF->setCurrentHPR( osg::Vec3(rotation,0,0) );
}
例子就是教材中 坦克的例子 一直没有调试成功
调试时中断在  tankData->updateTurretRotation();
void tankDataType::updateTurretRotation()
{
rotation += 0.01;
turretDOF->setCurrentHPR( osg::Vec3(rotation,0,0) );
}
例子就是教材中 坦克的例子 一直没有调试成功

该用户从未签到

 楼主| 发表于 2011-5-4 09:44:58 | 显示全部楼层
回复 8# array


    无标题-1.jpg

该用户从未签到

发表于 2011-5-4 10:43:47 | 显示全部楼层
看调用堆栈,是osg44-osgUtil.dll出错了,你先不加载回调,试试看出错吗?这种情况下,有可能是你的node节点是空的导致。

该用户从未签到

 楼主| 发表于 2011-5-4 14:38:01 | 显示全部楼层
回复 13# CWorld

不加载回调没问题,node节点是空?
    FindNodeVisitor findTurret("turret");  
n->accept(findTurret);
osgSim:OFTransform *turretDOF =  dynamic_cast <osgSim::DOFTransform*> (findTurret.getFirst());

int main()
{
osg::ref_ptr <osgViewer::Viewer >viewer=new osgViewer::Viewer ;
osg::ref_ptr <osg::Group>group=new osg::Group ;
osg::ref_ptr <osg::Node >node=osgDB::readNodeFile ("t72-tank_des.flt");
group->addChild (node.get());

tankDataType*tankData=new tankDataType(node.get());
node->setUserData(tankData);
node->setUpdateCallback(new tankNodeCallback);
帮忙看看是哪错了吗

该用户从未签到

发表于 2011-5-5 08:26:31 | 显示全部楼层
您如何保证名为"turret"的节点就是DOF节点?您是否检查过turretDOF是否是有效的

该用户从未签到

 楼主| 发表于 2011-5-5 08:52:41 | 显示全部楼层
回复 15# array


    王锐老师 知道哪错了 是出在dof节点那里 ,赋值的时候错了 谢谢老师 非常感谢 哈 又离目标进了一步
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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