查看: 1767|回复: 11

骨骼运动问题

[复制链接]

该用户从未签到

发表于 2011-4-21 14:25:26 | 显示全部楼层 |阅读模式
#include <osg/ShapeDrawable>
#include <osgAnimation/Bone>
#include <osgAnimation/Skeleton>
#include <osgAnimation/BasicAnimationManager>
#include <osgViewer/Viewer>
#include<osg/Node>
#include<osgDB/ReadFile>
osgAnimation::Bone* createBone( const char* name, const osg::Vec3& trans )
{
    osg::ref_ptr<osgAnimation::Bone> bone = new osgAnimation::Bone;
    bone->setBindMatrixInBoneSpace( osg::Matrix::translate(trans) );
    bone->setName( name );
    bone->setDefaultUpdateCallback();
   
osg::ref_ptr<osg::Node> node0=osgDB::readNodeFile("che1.ive");
    bone->addChild( node0.get() );
    return bone.release();
}
osgAnimation::Bone* createBone1( const char* name, const osg::Vec3& trans )
{
    osg::ref_ptr<osgAnimation::Bone> bone = new osgAnimation::Bone;
    bone->setBindMatrixInBoneSpace( osg::Matrix::translate(trans) );
    bone->setName( name );
    bone->setDefaultUpdateCallback();
   
osg::ref_ptr<osg::Node> node0=osgDB::readNodeFile("danjia1.ive");
    bone->addChild( node0.get() );
    return bone.release();
}
osgAnimation::Channel* createChannel( const char* name, float rad )
{
    osg::ref_ptr<osgAnimation:uatSphericalLinearChannel> channel = new osgAnimation::QuatSphericalLinearChannel;
    channel->setName( "quaternion" );
    channel->setTargetName( name );
   
    osgAnimation::QuatKeyframeContainer* keyframes = channel->getOrCreateSampler()->getOrCreateKeyframeContainer();
keyframes->push_back( osgAnimation::QuatKeyframe(0.0, osg::Quat(0.0,osg::X_AXIS)) );
    keyframes->push_back( osgAnimation::QuatKeyframe(8.0, osg::Quat(rad, osg::X_AXIS)) );
    return channel.release();
}
int main( int argc, char** argv )
{
    osgAnimation::Bone* bone0 = createBone( "bone0", osg::Vec3(0.0,0.0,0.0) ); //吊车车体
    osgAnimation::Bone* bone1 = createBone1( "bone1", osg::Vec3(0.0,12.0,4.0) );//吊车的吊臂

    //osgAnimation::Bone* bone2 = createBone( "bone2", osg::Vec3(1.0,0.0,0.0) ); //吊车的支撑杆

    osg::ref_ptr<osgAnimation::Skeleton> skelroot = new osgAnimation::Skeleton;
    skelroot->setDefaultUpdateCallback();
    skelroot->addChild( bone0 );
    bone0->addChild( bone1 );
   // bone1->addChild( bone2 );
   
    osg::ref_ptr<osgAnimation::Animation> anim = new osgAnimation::Animation;
    anim->setPlaymode( osgAnimation::Animation:PONG );
    anim->addChannel( createChannel("bone1", osg::PI_2) );
  //  anim->addChannel( createChannel("bone2", osg::PI_2) );
   
    osg::ref_ptr<osgAnimation::BasicAnimationManager> manager = new osgAnimation::BasicAnimationManager;
    manager->registerAnimation( anim.get() );
    manager->playAnimation( anim.get() );
   
    osg::ref_ptr<osg::Group> root = new osg::Group;
    root->addChild( skelroot.get() );
    root->setUpdateCallback( manager.get() );
   
    osgViewer::Viewer viewer;
    viewer.setSceneData( root.get() );
    return viewer.run();
}

现在我想做一个启动吊车的骨骼动画,启动时支撑杆慢慢的伸长,撑起吊车的吊臂(程序中是读入一个吊车臂模型),吊臂慢慢的竖起(程序中想使吊臂围绕车的尾部旋转),但是现在
把吊臂放到osg::Vec3(0.0,12.0,4.0)处,发现无法围绕制定点旋转,请问怎样设置围绕制定的一个点旋转啊?谢谢

该用户从未签到

发表于 2011-4-21 19:11:24 | 显示全部楼层
不能在max讲动画做好吗?不用程序控制节点的位置和姿态,只是控制其运行。也想做,还没做

该用户从未签到

发表于 2011-4-22 08:37:25 | 显示全部楼层
或者是不是在max里没有把旋转点坐标位置设正确

该用户从未签到

 楼主| 发表于 2011-4-22 09:29:19 | 显示全部楼层
没有,做的这个只有两个关节的动画,想用程序调出来,用3Dmax到处的话,好像还需要插件和osgCal2啊

该用户从未签到

 楼主| 发表于 2011-4-22 09:30:03 | 显示全部楼层
请问锐哥能否帮忙看一下啊

该用户从未签到

发表于 2011-4-22 09:43:14 | 显示全部楼层
我不知道您要我看什么?您遇到了什么问题?您现在的运行结果有什么错误?

该用户从未签到

 楼主| 发表于 2011-4-22 10:15:43 | 显示全部楼层
本帖最后由 zhoujiajun2010 于 2011-4-22 10:25 编辑

不好意思啊,可能我表达的不是很清楚,我现在的问题是,吊车的车身和和吊车的吊臂是两个分离的模型,我想使吊臂围绕着吊车的尾部旋转(与实际的吊车启动动作一样),现在的结果是吊臂围绕着吊车的尾部旋转大约20度后,突然向后移动一段距离,在新的位置旋转,而且
osgAnimation::Bone* bone1 = createBone1( "bone1", osg::Vec3(0.0,12.0,4.0) )//吊臂,其中感觉吊车的吊臂可以移动到osg::Vec3(0.0,12.0,4.0),但是旋转点不好确定,旋转的时候出现的结果是吊臂绕自己的顶端旋转,而不是绕吊车的车身尾部旋转,请问锐哥,怎样设置旋转点,使的吊臂围绕这个点转动啊!
吊车.JPG

该用户从未签到

发表于 2011-4-25 08:32:18 | 显示全部楼层
setBindMatrixInBoneSpace的意义是设置新的骨骼关节在父关节坐标系中的局部偏移矩阵,我不知道您是否是这样做的,我无法将您画的图和您构建的骨骼结构联系起来。

此外这个函数在新的OSG版本中已经消失了,取而代之的是setMatrixInSkeletonSpace,即设置骨骼关节在整个骨骼中的偏移矩阵

该用户从未签到

 楼主| 发表于 2011-4-25 15:34:00 | 显示全部楼层
osgAnimation::Bone* createBone1( const char* name, const osg::Vec3& trans )
{
    osg::ref_ptr<osgAnimation::Bone> bone = new osgAnimation::Bone;
    bone->setBindMatrixInBoneSpace( osg::Matrix::translate(trans) );
    bone->setName( name );
    bone->setDefaultUpdateCallback();
   
osg::ref_ptr<osg::Node> node0=osgDB::readNodeFile("danjia1.ive");
    bone->addChild( node0.get() );
    return bone.release();
}
在程序里面这个用到了,而且模型作为骨骼也移动到了相应的位置(正如上图车身与吊臂的位置关系),但是旋转时吊臂没有围绕着左边的旋转点(也就是骨骼关节)转动,而是围绕着吊臂自身的上端旋转,在这我的问题是怎样使吊臂绕着指定的骨骼节点转动啊?
再者这个程序中bone->setBindMatrixInBoneSpace( osg::Matrix::translate(trans) );发现骨骼(在程序中用吊臂模型代替)移动了,请问锐哥这样把骨骼节点移动到骨骼上的某个位置啊?谢谢!

该用户从未签到

发表于 2011-4-26 08:53:33 | 显示全部楼层
osgAnimation自己就有一个很类似的例子,它也模仿了一个手臂的运动,您可以在examples目录下阅读学习。您的解释已经让我愈发糊涂了,我根本无法把您的图和您给出的坐标对应起来

该用户从未签到

 楼主| 发表于 2011-4-26 11:24:53 | 显示全部楼层
哦,好的,可能表达的不是很清楚,我再研究研究,谢谢锐哥啊

该用户从未签到

发表于 2011-5-24 17:26:53 | 显示全部楼层
问题解决了吗,我也遇到了此类问题,想请教
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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