|
本帖最后由 wujita01 于 2012-10-1 20:45 编辑
先祝大家中秋国庆双喜临门~~不知道还有没有人来回答,呵呵。
接下来说说我在用osgart播放FBX骨骼动画中遇到的问题,希望能和大家一起探讨下。
OSG里面可以用osgAnimation::BasicAnimationManager来控制骨骼动画播放,停止。这在osganimationviewer里面有很好的实例。
1.首先是我使用这个例子的过程中,如果1个动画有多个Take动画,例如我播放一个动画Take 001的时候,再播放Take 002,我们得到的事实是Take 002 播放是不正常的;但是如果我在播放Take 001的时候,按了Stop,再播放Take 002,那么我们会得到正常的动画效果。播放动画的时候只能先stop正在播放的动画吗,还是需要我们设置BasicAnimationManager来打到我所预期的效果吗。请指点下。
2.第二个问题是我在解读osganimationviewer的时候遇到的。我想也是我没有钻研FBX模型结构导致的。不过还是希望知道的朋友能帮我解答下。
- osg::Group* node = new osg::Group();
- node = dynamic_cast<osg::Group*>(osgDB::readNodeFile("zero.fbx"));
复制代码 osganimationviewer里面是这样加载FBX模型的.我把他换成ProxyNode后,一点播放就报错。我搞不懂FBX动画模型为什么用Group装载,是因为他把这个骨骼模型的每个节点都加载在这个Group节点下面形成一个模型树(姑且这么称呼他,呵呵)了吗。
3.而我在使用osgart想来加载FBX模型时,因此产生了一系列问题。因为osgart的示范例子是用这样的模型节点来加载的。
- _root(Group)->_camera(Camera)->_mat(MatrixTransform)
- ->_pat((PositionAttitudeTransform)->_model(ProxyNode)
复制代码 ->指向的是该节点的孩子,括号里面的是该节点的类型。我们可以发现这里的模型节点是ProxyNode的。因为ProxyNode是继承Group的。我首先想到的就是直接添加访问器NodeVisitor来进行模型动画的控制。这是自定义的NodeVisitor,依样画葫芦写的。- class INodeVisitor: public osg::NodeVisitor
- {
- public:
- osg::ref_ptr<osgAnimation::BasicAnimationManager> _bam;
- INodeVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN){}
- void apply(osg::Node& node){
- if (_bam.valid())
- return;
- if (node.getUpdateCallback()){
- osgAnimation::AnimationManagerBase* b = dynamic_cast<osgAnimation::AnimationManagerBase*>(node.getUpdateCallback());
- if (b) {
- _bam = new osgAnimation::BasicAnimationManager(*b);
- return;
- }
- }
- traverse(node);
- }
- };
复制代码
并通过以下代码来进行对节点的访问。
- proxynode->accept(finder);
- if (finder._bam.valid()) {
- proxynode->setUpdateCallback(finder._bam.get());
- _model->setUpdateCallback(finder._bam.get());
- IModelControl::setModel(finder._bam.get());
- } else {
- osg::notify(osg::WARN) << "no osgAnimation::AnimationManagerBase found in the subgraph, no animations available" << std::endl;
- }
复制代码
但是事与愿违,把模型加载到ProxyNode下以后,
返回的是false,也就是里面没有找到osgAnimation::BasicAnimationManager的相关东西。
所以我想虽然ProxyNode是继承于Group的,但是可能不适合于FBX加载骨骼动画模型。
于是我决定是把他换成Group节点来加载FBX模型,进而达到控制动画的目的。
可是天不如人意,当我改成把osgart里面的ProxyNode节点改成Group节点以后模型无法显示。
我有以下几个猜想
1.模型显示了。但是没有在摄像头前面
2.Callback里面没有写Group节点类的显示和隐藏。
这是显示隐藏的UpdateCallback
- void MarkerVisibilityCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
- {
- if (osg::Switch* _switch = dynamic_cast<osg::Switch*>(node))
- {
- // Handle visibilty for switch nodes
- // ::printf("%s",v_marker->valid() ? "Show" : "Hide");
- _switch->setSingleChildOn(v_marker->valid() ? 0 : 1);
- }
- else
- {
- // This method will work for any node.
- // Make sure the visitor will return to invisible nodes
- // If we make this node invisible (because the marker is hidden) then
- // we need to be able to return and update it later, or it will remain
- // hidden forever.
- nv->setNodeMaskOverride(0xFFFFFFFF);
- // ::printf("Marker Available: %s\n",v_marker->valid() ? "Show" : "Hide");
- node->setNodeMask(v_marker->valid() ? 0xFFFFFFFF : 0x0);
- }
- // must traverse the Node's subgraph
- traverse(node,nv);
- }
复制代码 其实这里我很乱的。因为OSG也是最近入手,只是看了锐哥,肖鹏等大神的PDF书,还没完全实战。这里的问题希望大家能帮忙解决下。在osgart用Group节点怎么加载FBX模型并显示呢。(其实这个才是这堆问题要解决的根本)
我在解决这个问题的过程中发现一个很奇怪的问题。上面提到过这个程序的节点形式是这样的
- _root(Group)->_camera(Camera)->_mat(MatrixTransform)
- ->_pat((PositionAttitudeTransform)->_model(ProxyNode)
复制代码 该程序还在_mat添加了MarkerTransformCallback。他的作用是这样的
- void MarkerTransformCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
- {
- if (osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(node)) {
- mt->setMatrix(_marker->getTransform());
- }
- // Handler for osg::PositionAttitudeTransforms
- // TODO: check correct translation/rotation order
- else if (osg::PositionAttitudeTransform* pat = dynamic_cast<osg::PositionAttitudeTransform*>(node)) {
- pat->setPosition(_marker->getTransform().getTrans());
- osg::Vec3d vd = _marker->getTransform().getTrans();
- pat->setAttitude(_marker->getTransform().getRotate());
- }
- // Traverse the Node's subgraph
- traverse(node,nv);
- }
复制代码 我在测试中发现else if后面的PositionAttitudeTransform是永远执行不到的。在节点树下面有PositionAttitudeTransform 的节点traverse(node,nv);后应该是能访问到的。为什么执行不了呢。我想这会是很大可能无法显示模型的原因吧、猜想他显示到其他我们不可见的地方去了。
希望大家能帮我想想什么可能性,OSG入门刚不久,懂的还不多。希望能受到大家的指点。有颜色标记的地方希望大家能尽可能回答下。其实,写这么多,更是希望也在做同样事情的同学们能够说说遇到的问题已经怎么解决的。在此先感谢大家帮忙了。{:3_64:}
|
|