查看: 2180|回复: 6

想做个骨骼,求指点

[复制链接]

该用户从未签到

发表于 2011-5-15 11:15:14 | 显示全部楼层 |阅读模式
想用osg做出一个人体骨骼来,现在暂时想用box来当作骨骼,遇到几个问题。
1.bone1->setInvBindMatrixInSkeletonSpace(osg::Matrix::inverse(osg::Matrix::translate(osg::Vec3(1.0,1.0,0.0)))),这句话的意思是不是将bone1相对于骨骼原点平移vec3(1.0,1.0,0.0)的位置作为空间变换的原点位置?;
2.对box的makeRotate设置具体是怎么用的,参数向量代表着什么?
3.如果我现在再添加一块bone2,想要显示出来的是bone0->bone1->bone2,可是现在bone2是从骨骼的原点也就是bone0连过去的一个box,而不是从bone1连接过去的,这个连接点怎么设置? skelroot->addChild(bone0);  bone0->addChild(bone1);bone1->addChild(bone2);我以为这句写上去就是起到这个作用的,但好像不是。


  1. osg::ref_ptr<osgAnimation::Bone> bone0 = new osgAnimation::Bone;
  2. bone0->setInvBindMatrixInSkeletonSpace(osg::Matrix::inverse(osg::Matrix::translate(osg::Vec3(0.0,0.0,0.0))));
  3. bone0->setName("bone0");
  4. osgAnimation::UpdateBone* pRight1Update = new osgAnimation::UpdateBone("bone0");
  5. bone0->setUpdateCallback(pRight1Update);

  6. osg::ref_ptr<osg::Box> box0 =
  7. new osg::Box(osg::Vec3(0.0,0.0,0.0)*0.5,1,0.2,0.2);
  8. osg::Quat quat;
  9. quat.makeRotate(osg::Vec3(1.0,0.0,0.0),osg::Vec3(0.0,0.0,0.0));
  10. box0->setRotation(quat);

  11. osg::ref_ptr<osgAnimation::Bone> bone1 = new osgAnimation::Bone;
  12. bone1->setInvBindMatrixInSkeletonSpace(osg::Matrix::inverse(osg::Matrix::translate(osg::Vec3(1.0,0.0,0.0))));
  13. bone1->setName("bone1");
  14. osgAnimation::UpdateBone* pRight1Update0 = new osgAnimation::UpdateBone("bone1");
  15. bone1->setUpdateCallback(pRight1Update0);

  16. osg::ref_ptr<osg::Box> box1 =
  17. new osg::Box(osg::Vec3(1.0,0.0,0.0)*0.5,1,0.2,0.2);
  18. quat.makeRotate(osg::Vec3(1.0,0.0,0.0),osg::Vec3(1.0,0.0,0.0));
  19. box1->setRotation(quat);

  20. osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  21. geode->addDrawable(new osg::ShapeDrawable(box0.get()));
  22. geode->addDrawable(new osg::ShapeDrawable(box1.get()));
  23. bone0->addChild(geode.get());
  24. bone1->addChild(geode.get());
  25. //bone2->addChild(geode.get());

  26. osg::ref_ptr<osgAnimation::Skeleton> skelroot =
  27.   new osgAnimation::Skeleton;
  28. skelroot->setDefaultUpdateCallback();
  29. skelroot->addChild(bone0);
  30. bone0->addChild(bone1);

复制代码

该用户从未签到

发表于 2011-5-16 10:48:21 | 显示全部楼层
skelroot->addChild(bone0);  bone0->addChild(bone1);bone1->addChild(bone2);我以为这句写上去就是起到这个作用的,但好像不是。
简单来说是这样连接的,但是您需要设置各个关节在空间中的相对位置

该用户从未签到

 楼主| 发表于 2011-5-16 23:01:01 | 显示全部楼层
回复 2# array


    哦,那各个关节在空间中的相对位置是通过哪个函数设置的呢?是setInvBindMatrixInSkeletonSpace这个函数么?

该用户从未签到

发表于 2011-5-17 11:50:46 | 显示全部楼层
是的

该用户从未签到

 楼主| 发表于 2011-5-17 23:04:24 | 显示全部楼层
回复 4# array


    再请教一下,现在人体骨骼建立好了,通过什么函数能实现 实时 输入变换矩阵来操纵某个节点变化呢?
是setmatrix么?我试过假如一个节点为joint
  1. osg::Matrix input;
  2. joint->setMatrix(input*joint->getMatrix());
复制代码

我用这段代码了可是不知道为什么没有效果,是用错地方了还是别的用法?

该用户从未签到

 楼主| 发表于 2011-5-19 00:29:41 | 显示全部楼层
回复 4# array


    还是没想明白,我想通过输入的节点变换参数实时的显示动画,应该怎样做?。。

该用户从未签到

发表于 2011-5-21 23:38:23 | 显示全部楼层
简单来说是通过UpdateBone来实现的,您需要阅读和学会控制这个回调中的内容,来实现自定义的骨骼控制
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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