查看: 2140|回复: 8

动画抖动

[复制链接]

该用户从未签到

发表于 2010-4-25 18:34:42 | 显示全部楼层 |阅读模式
我从3DsMax里面导出一个简单的长方体模型,其中心点不在原点,加入osg程序中,用AnimationPath建立动画,为了达到绕其自身中心点z轴转动的目的,有代码如下:
osg::AnimationPath* createAnimationPath(osg::Vec3& center,float radius,double looptime)
{

        osg::AnimationPath* animationPath = new osg::AnimationPath;
        animationPath->setLoopMode(osg::AnimationPath:OOP);

        int numSamples = 60;
        float yaw = 0.0f;
        float yaw_delta = 2.0f*osg:I/((float)numSamples-1.0f);
        double time=0.0f;
        double time_delta = looptime/(double)numSamples;
        osg::Vec3 oriPt(0,0,0);
        for(int i=0;i<numSamples;++i)
        {
                osg::Matrix m1,m2,m3;
                m1.makeTranslate(center*-1.0);
                m2.makeRotate(yaw,osg::Vec3(0,0,1));
                m3.makeTranslate(center);
                osg::Vec3 position =oriPt*(m1*m2*m3);
                osg:uat rotation(osg::Quat(yaw,osg::Vec3(0,0,1)));  
                animationPath->insert(time,osg::AnimationPath::ControlPoint(position,rotation));

                yaw += yaw_delta;
                time += time_delta;
        }
        return animationPath;   
}
问题:上述代码能达到中心坐标不在原点的长方体绕其自身中心点z轴转动的目的,但却伴随着明显的前后抖动。如果把numSamples增大,抖动就不很明显了。这是怎么回事呢,请教大家。

该用户从未签到

 楼主| 发表于 2010-4-25 18:38:18 | 显示全部楼层
附上源码

test.rar

7.75 KB, 下载次数: 116, 下载积分: 威望 1

该用户从未签到

发表于 2010-4-25 19:00:16 | 显示全部楼层
:L:L
你手动设置一下以物体的中心为原点~~~~~~这个就没有必要使用Path,只需要简单的使用Callback就可以轻松完成~~~~~~~

该用户从未签到

 楼主| 发表于 2010-4-25 20:46:21 | 显示全部楼层
FlySky :

该用户从未签到

 楼主| 发表于 2010-4-25 20:56:06 | 显示全部楼层
FlySky:
由于是通过AnimationPath,封装了一个对模型设置简单动画的函数,上面代码的只是测试用的,而且场景中大量从3dsmax导出来的模型中心点都不在原点,如果每个都手动设置原点,有点不适合。还有办法吗

该用户从未签到

发表于 2010-4-25 21:57:47 | 显示全部楼层
//从osg::NodeCallback继承一个新类,实现spaceship的回调
class SpaceShipCallback :public osg::NodeCallback
{
public:
        SpaceShipCallback():angle(0)
        {
                //
        }

        virtual void operator()(osg::Node* node ,osg::NodeVisitor* nv)
        {
                //创建矩阵变换节点
                osg::ref_ptr<osg::MatrixTransform> mtCow = dynamic_cast<osg::MatrixTransform*>(node);
                //创建矩阵
                osg::Matrix mr ;
                //旋转,绕Z轴,每次旋转angle角度
                mr.makeRotate(angle,osg::Vec3(0.0f,0.0f,1.0f));
                //设置矩阵
                mtCow->setMatrix(mr);

                angle+= 0.01 ;

                //继续传递参数,执行其他设置回调的节点
                traverse( node, nv );
        }

public:

        //旋转角度
        double angle ;
};

更新回调处理下就好了,,没有必要设置路径动画~~~~~~~

该用户从未签到

 楼主| 发表于 2010-4-25 22:59:20 | 显示全部楼层
谢谢FlySky,那我按照您提供的思路做些修改。非常感谢。

该用户从未签到

发表于 2011-8-19 17:15:40 | 显示全部楼层
你手动设置一下以物体的中心为原点~~~~~~这个就没有必要使用Path,只需要简单的使用Callback ...
FlySky 发表于 2010-4-25 19:00

请问,既然可以手动设置物体的中心为原点,那应该可以将物体的中心设置在任意地方把。
说一下我现在的需求:我想旋转一个物体,因为物体的中心点就是原点,所以旋转的时候都是以物体正中间为中心进行旋转。
实际上我想让物体按其他点旋转,比如手臂的转动就是以手肘为旋转点的。应该如何设置物体的中心点呢?
谢谢!

该用户从未签到

发表于 2011-8-22 08:34:46 | 显示全部楼层
设置变换矩阵的时候先根据轴心点偏移就可以了:
Matrix::translate(-pivot) * Matrix::rotate(rot) * Matrix::translate(pos+pivot)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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