查看: 3000|回复: 12

再次有劳各位帮我诊断这段让我郁闷的代码

[复制链接]

该用户从未签到

发表于 2008-10-13 10:32:34 | 显示全部楼层 |阅读模式
void monitor::on_motorOneCcw_clicked()
{       
        findNodeVisitor findNode("Box01");       
        osg::ref_ptr<osg::MatrixTransform> mt=new osg::MatrixTransform;
        mt->setReferenceFrame(osg::Transform::RELATIVE_RF);
        mt->accept(findNode);       
        osg::Matrixd m;
        m.setTrans(10.f,0.f,12.f);
        m.set(1.f,0.f,0.f,0.f,
                0.f,1.f,0.f,0.f,
                0.f,0.f,1.f,0.f,               
                10.f,0.f,0.f,0.f);
       
        mt->setMatrix(m);               
}
这些Box01,Box02,Box03的位置坐的太稳了,我无论想什么办法就是没有办法让它活动活动一下筋骨!
上传的exported.osg文件是在3ds max7下画的,经过OSGExp0.9.4这个插件转换而成
在osgDirector下打开查看如图,请高手们帮忙分析分析这里什么地方出了问题!

是osgDirector的抓图

是osgDirector的抓图

exported.rar

979 Bytes, 下载次数: 124, 下载积分: 威望 1

里面压缩的是exported.osg

该用户从未签到

发表于 2008-10-13 11:44:48 | 显示全部楼层
应该是有问题的代码吧;
你并没有将你的节点加入到mt中,mt是一个空的组;所有你的操作并不起作用了;

该用户从未签到

发表于 2008-10-13 12:27:40 | 显示全部楼层
osg::ref_ptr<osg::MatrixTransform> mt=new osg::MatrixTransform中的mt对象是一个空的啊~~~~~~~~并没有加入任何节点,,怎么查找,,怎么操作~~~~~~~

该用户从未签到

 楼主| 发表于 2008-10-13 13:22:58 | 显示全部楼层
再不好意思的问一句?
用什么函数可以查看mt中的对象列表?
上面的程式改成
findNodeVisitor findNode("Box01");        
        osg::ref_ptr<osg::MatrixTransform> mt=new osg::MatrixTransform;
        mt->setReferenceFrame(osg::Transform::RELATIVE_RF);
osg::Node* foundNode = NULL;
foundNode =osgWidget->findNamedNode("Box01",root);
执行后foundNode不为空了,说明有找到"Box01"这个对象
foundNode->accept(findNode);
在执行后面的代码
mt->accept(findNode);        
        osg::Matrixd m;
        m.setTrans(10.f,0.f,12.f);
        m.set(1.f,0.f,0.f,0.f,
                0.f,1.f,0.f,0.f,
                0.f,0.f,1.f,0.f,               
                10.f,0.f,0.f,0.f);        
        mt->setMatrix(m);               
还是没有动

该用户从未签到

发表于 2008-10-13 13:32:32 | 显示全部楼层
用getChild遍历,然后查各个子节点的getName,libraryName和className方法,十分方便
  1. osg::Matrixd m;
  2. m.setTrans(10.f,0.f,12.f);
  3. m.set( 。。。 );
复制代码
为什么在设置了setTrans之后又重新用set设置了矩阵呢?这样setTrans是没用的。

还有就是:
m.set的最后一个参数,也就是矩阵的[4][4]元素为什么是0.0???如果是真实世界的话,齐次坐标(我忘了是不是这个名字了)通常是1.0吧

该用户从未签到

 楼主| 发表于 2008-10-13 13:55:58 | 显示全部楼层
m.set的最后一个参数,也就是矩阵的[4][4]元素为什么是0.0???如果是真实世界的话,齐次坐标(我忘了是不是这个名字了)通常是1.0吧

我是在osgDirector中Matrix属性看到的,于是就把这个值搬到上面了,实话实说具体是什么意思我是不知道的?
好了,这个问题先放一放,耽误了您们很多时间不好意思,我自己再琢磨琢磨!

该用户从未签到

发表于 2008-10-13 14:06:44 | 显示全部楼层
这样修改之后还是不能移动吗

该用户从未签到

 楼主| 发表于 2008-10-13 14:11:33 | 显示全部楼层
改过还是不能!还是在那个地方一动不动!
我感觉这三个Box在嘲笑我……
"小样的,就你那一点点的道行看你怎么动我!"

该用户从未签到

发表于 2008-10-13 14:27:33 | 显示全部楼层
抱歉之前没看您的函数内容……这个函数根本就没有对您的模型进行操作,怎么可能移动它呢?

给您一个建议,先不要管那个findNodeVisitor(恕我直言,您可能没有完全理解Visitor访问器的工作原理)
自己想办法找到MT节点并执行矩阵操作,一步一步完成学习。

使用findNodeVisitor的函数这样写就可以了,仅供参考。
  1. void on_motorOneCcw_clicked( osg::Node* root )
  2. {        
  3.         findNodeVisitor findNode("Box01");
  4.         root->accept( findNode );

  5.         osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>( findNode.getFirst() );
  6.         osg::Matrixd m;
  7.         m.setTrans(10.f,0.f,12.f);
  8.         if ( mt )
  9.                 mt->setMatrix(m);
  10. }
复制代码

[ 本帖最后由 array 于 2008-10-13 14:32 编辑 ]

该用户从未签到

 楼主| 发表于 2008-10-13 14:31:49 | 显示全部楼层
好的
谢谢array指点迷津!

该用户从未签到

发表于 2008-10-13 14:36:21 | 显示全部楼层
可以运行的代码已经在9楼给出来了。不过还是希望您自己多多钻研。因为网络上大家不太可能立即回答您的问题,人人都有工作的。

一直等待只会浪费自己的时间;在编程语言的学习上,勤问是个不好的习惯~~
这只是我个人的经验和看法,大概也是因为自己初学各种语言时的提问总是得不到回答吧。仅供参考。

该用户从未签到

 楼主| 发表于 2008-10-13 15:48:30 | 显示全部楼层
谢谢array的指点
“一直等待只会浪费自己的时间;在编程语言的学习上,勤问是个不好的习惯~~”
这句话我非常的认同
9楼的代码可以用的,我试过它可以让我哪些高傲的Box 动,让它怎么动它就怎么动,但得有个条件
9楼的代码必须放在
osgUtil::Optimizer optimizer;
optimizer.optimize(childNode);
optimizer.reset();之前
放在之后mt 就获取不到地址,Box就一动不动了

因为载入*.osg文件我用了这样一个函数
osg::Node* QtViewer::addNode(const QString nodeName)
{       
        osg::Node* childNode = osgDB::readNodeFile(nodeName.toStdString().c_str());
        childNode->setName("sceneRootNode");
                      //////////////////////////////////////////////////////////
        osgUtil::Optimizer optimizer;       
        optimizer.optimize(childNode);
        optimizer.reset();
                     ///////////////////////////////////////////////////////////       
        root->addChild(childNode);
        getCameraManipulator()->home(0);
        return childNode;
}
于是我就把addNode(const QString nodeName)中的
osgUtil::Optimizer optimizer;       
optimizer.optimize(childNode);
optimizer.reset();
三行拿掉了;这样就一切正常!
再次谢谢array,因为你说你测试过你的代码没有问题我就认为它没有问题,于是我就来找我的问题
上面的就是我发现的,接下来我再来看看上面的三行代码到底有什么用?这个我自己解决,不能再问了,问多了对自己学习不利,问多了会使自己变的懒惰!

该用户从未签到

发表于 2008-10-13 16:54:04 | 显示全部楼层
osgUtil::Optimizer的意义其实有的时候不太大,它会优化场景节点树,并把一些空节点清除掉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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