查看: 1703|回复: 8

关于骨骼绑定

[复制链接]

该用户从未签到

发表于 2009-9-30 14:34:09 | 显示全部楼层 |阅读模式
我想求教一下osg中骨骼绑定的问题
现条件可以描述为:
导入了一个3DS文件模型作为RigGeometry
导入了一个bvh文件模型作为骨骼,骨骼本身通过了一定的手段绘制出几何体(线条的形式)
骨骼与皮肤有一定的位移,再通过osg的example中osganimationskinning的方式,将两种通过setInfluenceMap的方式绑定,近似一段为
//bone16
(*vim)["bone16"].push_back(osgAnimation::VertexIndexWeight(17,0.81));
(*vim)["bone16"].push_back(osgAnimation::VertexIndexWeight(18,0.25));
...
在测试中使bone16发生一个旋转,骨骼连带线条几何体旋转发生,皮肤没有任何改变。请问问题大概会出在什么地方?

另外一个问题是为何通过bvh导入的骨骼从几何形状上来看与3dmax中查看到的骨骼有一定的出入(导入bvh参考了plugin bvh的处理)

该用户从未签到

发表于 2009-9-30 18:11:46 | 显示全部楼层
您是如何把模型绑定到骨骼的?因为这里面有很多您自己的工作,如果不阐述清楚的话,别人无法判断您的问题所在

该用户从未签到

 楼主| 发表于 2009-10-1 00:33:58 | 显示全部楼层
抱歉,讲述不够详细。
基本过程类似于osganimationskinning做的蒙皮


osg::Group *_group = new osg::Group;//场景节点
osg::ref_ptr<osgAnimation::Skeleton> _skelroot;/通过bvh plugin读入模型得到的骨骼根节点
osg::Geode *_skin;//通过3ds plugin读入模型得到的几何模型
osg::Geometry *geom = _skin->getDrawable(0)->asGeometry();
osgAnimation::RigGeometry *rigeom = new osgAnimation::RigGeometry(*geom);
osgAnimation::VertexInfluenceMap *vim = new osgAnimation::VertexInfluenceMap;
...
//bone16
(*vim)["bone16"].push_back(osgAnimation::VertexIndexWeight(17,0.81));
(*vim)["bone16"].push_back(osgAnimation::VertexIndexWeight(18,0.25));
...
rigeom->setInfluenceMap(vim);//设定映射关系,例如对应上面是bone16骨头,id为17,18号点受到的作用
osg::Geode* _geode = new osg::Geode;//挂载rigeom的节点
_geode->addDrawable(rigeom);
_skelroot->addChild(geode);//挂载节点_geode到骨骼根节点
_group->addChild(_skelroot);//挂载骨骼根节点到场景节点

之后对骨骼进行调整,作为皮肤的模型没有相应运动

该用户从未签到

发表于 2009-10-1 09:03:03 | 显示全部楼层
_skelroot->addChild(geode);//挂载节点_geode到骨骼根节点

骨骼节点和模型之间不是这样绑定的,需要把每块模型(例如手臂的模型,胸口的模型,头的模型)分别addChild到各个Bone子节点下,

该用户从未签到

 楼主| 发表于 2009-10-6 13:18:58 | 显示全部楼层
谢谢array大大的回复
国庆回家了没有办法上网
如果分别挂载是没有问题的。我现在面临的状况是导入了一整个模型作为一个Geode,需要把它上面的点利用骨骼驱动起来,所以无法每块分别与bone子节点绑定
我参考了例程里的animaitonskinnkng来做的,那如果这个方法行不通,有其它可以讨论的解决方案吗

该用户从未签到

发表于 2009-10-6 17:02:27 | 显示全部楼层
没有。对于实时系统来说,必须各个绑定,否则无法使用骨骼结构的矩阵变换来操作子模型。
skinning演示的是另外一种可能性,即实现一个几何体的变形,这种情况下必须设置这个模型的所有顶点的权重,如果模型本身比较复杂的话,实现起来很不划算——实时系统,比如游戏之类,通常都不会这样去处理骨骼的(除非是使用GPU来做)。

该用户从未签到

 楼主| 发表于 2009-10-6 20:09:08 | 显示全部楼层
嗯,我现在所做的的确是参考了skinning的方法绑定了所有的顶点的权重;如果不考虑效率的问题选择使用skinning的方法,那么模型无法驱动的原因,只可能存在于我绑定过程有纰漏吗?
再次感谢回答^_^

该用户从未签到

发表于 2009-10-6 20:39:33 | 显示全部楼层
哦,那么当然可能是您自己代码的疏漏了

该用户从未签到

 楼主| 发表于 2009-10-6 21:42:00 | 显示全部楼层
谢谢。。。我再仔细检查看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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