精华内容
下载资源
问答
  • 动画绑定辅助插件 AnimSchoolPickerPC,非常方便的一个插件,玩几次就会了
  • ae 木偶图钉动画绑定脚本
  • 基于Animation C# Job构建的程序化动画绑定系统。特点:高质量、高性能、可扩展 该资源包位于Unity Packages,记得勾选预览。 如果加载不出资源包看这篇文章。 二、基本组件介绍 在人物(带有状态机)物体上...

     本文源自官方直播,以文字形式记录绑定过程。

    使用的Unity版本:2019.2.0f1

     

     

    一、技术简介

    基于Animation C# Job构建的程序化动画绑定系统。特点:高质量、高性能、可扩展

    该资源包位于Unity Packages,记得勾选预览。

    如果加载不出资源包看这篇文章

     

    二、基本组件介绍

    在人物(带有状态机)物体上添加Rigbuilder、BoneRenderer。

    Rigbuilder:与Animator位于同一物体上,利用Animator中的动画生成PlayableGraph并添加到现有的动画状态机上,支持同时添加多个Rigs。能够对所有的Playable动画进行混合,混合树也是利用PlayableGraph实现动画混合。

    BoneRenderer:是一个工具,骨骼信息可视化,方便你绑定、编辑

    Rigs:自己建立的物体rig,添加Rig组件,与骨骼的根节点位于同一层级。收集子节点的约束组件,并按照顺序(深度优先)生成AnimationJob的列表,交给Rigbuilder来进行执行。

     

    三、预定义约束介绍

    RigConstraints。

    这里面包含了很多预定义约束。

     

    四、Demo阶段

    1、导入Unity商城里免费的Post apocalyptic survival character模型,调整shader

    2、找到模型fbx文件,调整Humanoid,拖到场景。

    3、骨骼初始设置:

          a、人物模型Animator位置添加RigbuilderBoneRenderer

          b、在与骨骼同级别的位置新建rig物体,添加Rig组件,Rig控制下方物体运动。

          c、将骨骼下方所有父节点(除了最末尾的物体),全选添加进BoneRenderer的Transform里面,渲染出骨骼。

     4、添加脚步IK动画

    1)程序配置:

    a、在rig下新建ik物体,ik下新建两个空物体lfik、rgik,位置分别在模型脚踝的位置,给lfik、rgik分别添加两个骨头之间的约束:TwoBoneIKConstraint

    接着来解决一个坑:无法添加TwoBoneIKConstraint脚本

    Q1:这时,我们AddComponent,是搜不到TwoBoneIKConstraint的。

    A1:我们要先导入约束案例,这里面有该脚本(视频怎么不讲-_-||)

     

    20191121更新:

    注意,下面展示的bug,是由于Unity版本不是2019.2.0f1导致的,Unity版本必须在2019.2.0f1及以上!

    因此暂停更新,Unity原视频链接:https://www.bilibili.com/video/av61671904

    想继续学习的同学可以根据视频继续往下学习。

    且还有一个bug,在最下方说明。

     

    Q2:我们导入约束案例了,仍无法添加该脚本。即使看他们的案例,物体上的该脚本仍是报错状态。

    A2:打开该脚本时,我们发现提示该脚本是只读状态。将脚本属性只读取消不管用。正确办法:

    将TwoBoneIKConstraint脚本从packages里另存到你的项目Assets里去,现在即可进行添加。

    b、将骨骼及控制器配置到TwoBoneIKConstraint里面

    视频上说点击骨骼,将骨骼对应的物体这样配置,Tip是Mid的子物体。但没有说为什么这样选。猜测是IK控制脚步移动,脚步涉及到大腿、小腿、

    Target就是控制器了,自身。

    2)、K动画

    即制作动画。

    a、先给Animator的物体创建Animation

    b、把IK的属性添加进Animation

          就是在创建的Animtion里,AddProperty,找到你创建的rig,把你创建的lfik、rgik两个控制器的Position和Rotation添加进去。

    该地方Preview有预览动画功能,点击后可在不运行状态下,调整lfik、rgik属性即可实时预览动作变化。

    Preview不运行预览仅在2019.2.0f1及以上支持,我测试了一下2019.1,发现不运行开启Perview,调整lfik、rgik属性并没有什么动作变化。运行后这两个属性还锁定不能改了。。

     

    暂停更新,因为该版本Unity切换到安卓平台时,不能设置API Levels,不知道如何解决。

     

    五、自定义渲染管线

    六、LWRP中的Shader

    展开全文
  • Aescripts Puppet Tools(AE木偶图钉动画绑定脚本)是由aescripts.com官方最新推出的AE木偶图钉动画绑定脚本,你可以利用它来通过Null空物体来控制角色骨骼,相当于3D软件的IK,十分方便,对于做角色Motion动画对话,...
  • cocostudio::ColliderDetector 简单介绍 利用cocostdio为骨骼动画绑定碰撞区域进行碰撞检测
    //碰撞框
    class ColliderBody : public cocos2d::Ref
    {
    public:
        ColliderBody(ContourData *contourData);
        ~ColliderBody();
    
        inline ContourData *getContourData() { return _contourData; }
    
    #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT 
        void setColliderFilter(ColliderFilter *filter);
        ColliderFilter *getColliderFilter();
    #endif
    
    #if ENABLE_PHYSICS_BOX2D_DETECT
        virtual void setB2Fixture(b2Fixture *fixture) { _fixture = fixture; }
        virtual b2Fixture *getB2Fixture() const { return _fixture; }
    #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
        virtual void setShape(cpShape *shape) { _shape = shape; }
        virtual cpShape *getShape() const { return _shape; }
    #elif ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX
        virtual const std::vector<cocos2d::Point> &getCalculatedVertexList() const { return _calculatedVertexList; }
    #endif
    
    private:
    
    #if ENABLE_PHYSICS_BOX2D_DETECT
        b2Fixture *_fixture;
        ColliderFilter *_filter;
    #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
        cpShape *_shape;
        ColliderFilter *_filter;
    #elif ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX
        std::vector<cocos2d::Point> _calculatedVertexList;//所有顶点
    #endif
    
        ContourData *_contourData;//轮廓数据
    
        friend class ColliderDetector;
    };
    
    /*
     *  @brief  ContourSprite used to draw the contour of the display
     *  @js NA
     *  @lua NA
     */
    class ColliderDetector : public cocos2d::Ref
    {
    public:
        static ColliderDetector *create();
        static ColliderDetector *create(Bone *bone);
    public:
    	/**
         * @js ctor
         */
        ColliderDetector();
        /**
         * @js NA
         * @lua NA
         */
        ~ColliderDetector(void);
    
        virtual bool init();
        virtual bool init(Bone *bone);
    
        void addContourData(ContourData *contourData);//手动添加 一个 轮廓顶点信息数据
        void addContourDataList(cocos2d::Vector<ContourData*> &contourDataList);//手动添加 一组 轮廓顶点信息数据
    
        void removeContourData(ContourData *contourData);//手动移除 一个 轮廓顶点信息数据
        void removeAll();//手动添加 所有 轮廓顶点信息数据
    
        void updateTransform(kmMat4 &t);//旋转更新
    
        void setActive(bool active);//设置激活状态
        bool getActive();
    
        const cocos2d::Vector<ColliderBody*>& getColliderBodyList();//得到所有轮廓框信息
    
    #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT 
        virtual void setColliderFilter(ColliderFilter *filter);
        virtual ColliderFilter *getColliderFilter();
    #endif
    
        virtual void setBone(Bone *bone) { _bone = bone; }
        virtual Bone *getBone() const { return _bone; }
    
    #if ENABLE_PHYSICS_BOX2D_DETECT
        virtual void setBody(b2Body *body);
        virtual b2Body *getBody() const;
    #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
        virtual void setBody(cpBody *body);
        virtual cpBody *getBody() const;
    #endif
     protected:
        cocos2d::Vector<ColliderBody*> _colliderBodyList;//碰撞body
    
        Bone *_bone;//骨骼
    
    #if ENABLE_PHYSICS_BOX2D_DETECT
        b2Body *_body;
        ColliderFilter *_filter;
    #elif ENABLE_PHYSICS_CHIPMUNK_DETECT
        cpBody *_body;
        ColliderFilter *_filter;
    #endif
    
    protected:
        bool _active;//是否激活
    };
    
    }
    
    #endif /*__CCCOLLIDERDETECTOR_H__*/


    
    
    class TestColliderDetector : public ArmatureTestLayer
    {
    public:
        ~TestColliderDetector();
        
        virtual void onEnter() override;
        virtual std::string title() const override;
        virtual void update(float delta);
        virtual void draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated) override;
        void onDraw(const kmMat4 &transform, bool transformUpdated);
        
        void onFrameEvent(cocostudio::Bone *bone, const std::string& evt, int originFrameIndex, int currentFrameIndex);
        
        void initWorld() {};
        cocostudio::Armature *armature;
        cocostudio::Armature *armature2;
        
        CustomCommand _customCommand; //new render needed this for drawing primitives
        cocos2d::Sprite *bullet;
    };
    void TestColliderDetector::update(float delta)
    {
        armature2->setVisible(true);
    //
    //    CCNode中两个个方法方法:
    //    getContentSize用来获得节点原始大小。返回CGSize类型
    //    getBoundingBox获得节点当前大小,即如果经过缩放那么就是缩放后的大小。返回CGRect类型。
    //    有个问题最近才遇到,父精灵进行缩放处理,会对子精灵进行标记(boolean值),在实际绘制过程中会影响子精灵显示大小,但并不改变子精灵的getBoundingBox所获得的值,也就是只有直接setscale才会影响getBoundingBox数值。
    //    CCSprite中有个方法:
    //    getTextureRect返回精灵纹理大小,返回CGRect类型,并且是原始纹理大小,无关缩放。在一般情况下和getContentSize作用一样,但如果用TP处理过,还回值是实际纹理大小,留白部分会去除。这个在碰撞检测过程中经常用到。
        Rect rect = bullet->getBoundingBox();
    
        // This code is just telling how to get the vertex.
        // For a more accurate collider detection, you need to implemente yourself.
        const Map<std::string, Bone*>& map = armature2->getBoneDic();//得到骨骼字典
        for(const auto& element : map)//遍历字典
        {
            Bone *bone = element.second;
            ColliderDetector *detector = bone->getColliderDetector();
    
            if (!detector)//如否没有碰撞 跳过 继续遍历
                continue;
            //得到碰撞框列表
            const cocos2d::Vector<ColliderBody*>& bodyList = detector->getColliderBodyList();
    
            for (const auto& object : bodyList)
            {
                //得到一个碰撞框
                ColliderBody *body = static_cast<ColliderBody*>(object);
                //一个碰撞框包含的所有顶点
                const std::vector<Point> &vertexList = body->getCalculatedVertexList();
    
                float minx = 0, miny = 0, maxx = 0, maxy = 0;
                 int length = (int)vertexList.size();//顶点个数
                for (int i = 0; i<length; i++)
                {
                    Point vertex = vertexList.at(i);
                    if (i == 0)
                    {
                        minx = maxx = vertex.x;//起点和终点 是 第一个点
                        miny = maxy = vertex.y;
                    }
                    else//遍历所有点 得到4个最值
                    {
                        minx = vertex.x < minx ? vertex.x : minx;
                        miny = vertex.y < miny ? vertex.y : miny;
                        maxx = vertex.x > maxx ? vertex.x : maxx;
                        maxy = vertex.y > maxy ? vertex.y : maxy;
                    }
                }
                Rect temp = Rect(minx, miny, maxx - minx, maxy - miny);//组成一个包含所有顶点的矩形
    
                if (temp.intersectsRect(rect))
                {
                    //子弹矩形在碰撞区域内 碰撞框不可见
                    armature2->setVisible(false);
                }
            }
        }
    }
    void TestColliderDetector::draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
    {
        _customCommand.init(_globalZOrder);
        _customCommand.func = CC_CALLBACK_0(TestColliderDetector::onDraw, this, transform, transformUpdated);
        renderer->addCommand(&_customCommand);
    }
    
    void TestColliderDetector::onDraw(const kmMat4 &transform, bool transformUpdated)
    {
        kmGLPushMatrix();
        kmGLLoadMatrix(&transform);
        
        armature2->drawContour();
        
        kmGLPopMatrix();
    }

    TestColliderDetector::~TestColliderDetector()
    {
    }
    void TestColliderDetector::onEnter()
    {
        ArmatureTestLayer::onEnter();
    
        scheduleUpdate();
    
        armature = Armature::create("Cowboy");
        armature->getAnimation()->play("FireWithoutBullet");
        armature->getAnimation()->setSpeedScale(0.2f);
        armature->setScaleX(-0.2f);
        armature->setScaleY(0.2f);
        armature->setPosition(Point(VisibleRect::left().x + 70, VisibleRect::left().y));
    
        /*
        * Set armature's frame event callback function
        * To disconnect this event, just setFrameEventCallFunc(nullptr);
        */
        armature->getAnimation()->setFrameEventCallFunc(CC_CALLBACK_0(TestColliderDetector::onFrameEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4));
        addChild(armature);
    
        armature2 = Armature::create("Cowboy");
        armature2->getAnimation()->play("Walk");
        armature2->setScaleX(-0.2f);
        armature2->setScaleY(0.2f);
        armature2->setPosition(Point(VisibleRect::right().x - 60, VisibleRect::left().y));
        addChild(armature2);
    
    #if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT
        bullet = cocos2d::extension::PhysicsSprite::createWithSpriteFrameName("25.png");
    #elif ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX
        bullet = Sprite::createWithSpriteFrameName("25.png");
    #endif
        addChild(bullet);
    
        initWorld();
    }
    std::string TestColliderDetector::title() const
    {
        return "Test Collider Detector";
    }
    void TestColliderDetector::onFrameEvent(Bone *bone, const std::string& evt, int originFrameIndex, int currentFrameIndex)
    {
        CCLOG("(%s) emit a frame event (%s) at frame index (%d).", bone->getName().c_str(), evt.c_str(), currentFrameIndex);
    
        /*
        * originFrameIndex is the frame index editted in Action Editor
        * currentFrameIndex is the current index animation played to
        * frame event may be delay emit, so originFrameIndex may be different from currentFrameIndex.
        */
    
        Point p = armature->getBone("Layer126")->getDisplayRenderNode()->convertToWorldSpaceAR(Point(0, 0));
        bullet->setPosition(Point(p.x + 60, p.y));
    
        bullet->stopAllActions();
        bullet->runAction(CCMoveBy::create(1.5f, Point(350, 0)));
    }


    
    
    展开全文
  • 前言:Unity的Animation Rigging系统不但可以使用程序修改动画,还可以利用各种IK控制器在Unity里面录制动画,可谓是动画开发的一个巨大福音! 2019.1才发布的一个新功能,可以让开发这在动画骨架上设置由程序控制...

    Unity Animation Rigging是Unity2019后的新功能,支持在运行时用代码控制骨骼节点坐标修改动画,也支持动画师利用控制器在Unity里面录制动画(以往动画师都是在3D软件中绑定骨骼和各种IK后,在3D软件中制作好动画,然后导出来),这是动画开发的一个巨大进步。

    Animation Rigging通过一组预定义的动画约束(IK Constraint)来控制角色动画,从而让我们在游戏中实现一些传统动画很难完成的功能,比如与世界的互动,骨骼变形,以及物理的次级运动。

    一、目录

    1.Animation Rigging技术简介

    2.基本组件介绍

    3.预定义约束介绍

    4.自定义管线

    5.LWRP中的Shader

    1.Animation Rigging技术简介:

    基于Animation C# Jobs多线程系统构建的程序化动画绑定系统,为动画制作提供高质量,高性能,可拓展的解决方案。

    2.基本组件介绍:

    1. 主Root节点下有:Rig Builder 和 BoneRender(负责骨骼信息可视化,支持多种骨骼形状,以及分组显示)

    2. Rigs上有:Rig约束(具体的功能在这个上面完成)

    3..LF_IK:Two Bone IK Constraint(各种约束)

    RigBuilder:与Animator位于同一个物体上,在内部会生成PlayableGraph并添加到现有的动画状态机上。支持同时添加多个Rigs。

    Rigs:负责收集子节点的约束组件,并按照顺序(深度优先)生成IAnimationJob的列表。需要注意的是,Rigs节点需要和骨骼的根节点位于同一层级。

    Rig Constraints:负责程序化的方式来控制骨骼,目前组件中预置了多种约束,当然也可以自行定制开发。(预定义约束)

    示例:使用Two Bone IK Constraint实现预定义的行走动画。

    3.预定义Constraint(约束)的介绍

    约束需要挂到一个IK上。

    4.自定义管线

     

     

    5.LWRP中的Shader

     

     

     

    后记:

    1.[官方直播] Unity最新程序化动画绑定(Animation Rigging)技术介绍

         https://www.bilibili.com/video/av61671904

    2.B站视频 [Animation Rigging]真的太强大了,可以干这事!

        https://www.bilibili.com/video/BV1yE411V7k9?p=2

    展开全文
  • 我们可以看到模型尾部的不光滑状态,这是因为skinned Mesh Renderer中Quality中选择的是自动,我们可以尝试选择1,2,4这几个选项来观察效果。 选择4后效果如下:

    我们可以看到模型尾部的不光滑状态,这是因为skinned Mesh Renderer中Quality中选择的是自动,我们可以尝试选择1,2,4这几个选项来观察效果。


    选择4后效果如下:



    展开全文
  • 内部模型绑定动画 内部模型指的是mixamo网站自己提供的模型,如果要使用网站自己提供的模型并进行动画绑定,这个非常简单, 1.在“Characters” 下选择你看中的模型,选中后会显示在右边的预览窗口中 2.在...
  • maya 绑定动画 蜘蛛侠

    2014-12-14 16:07:52
    maya 动画 模型 绑定 贴图 精细度很高 适合很多人使用
  • 数据绑定动画

    2007-12-09 23:01:26
    介绍vs2000与sql的数据绑定方法
  • 3dmax角色动画设计骨骼绑定,不错的资料
  • input绑定渐变动画 原生js实现 .form-control { box-shadow: none; transition: box-shadow .3s linear; }
  • 可以下载源码:https://download.csdn.net/download/cherry459/12270112 xml中使用该自定义控件: <com.besttop.bindcar.CircleTickView android:id="@+id/ct_success" android:layout_width="...
  • 模型绑定动画

    2017-12-05 13:53:52
    1.骨骼必须为IK、CAT、BIP三类,unity不认虚拟体动画,单个物体骨骼数量不超过60个。   2.动画帧率、帧数的控制,一般情况下为每秒10帧,一个动画尽量控制在1秒内完成。   3.角色蒙皮、动作调节规范...
  • 使用别人的动画,使用自己的骨骼体和模型。 使用别人的动画,使用初学者包的。。。。 然后点击修改,修改路径 然后在人物蓝图中使用自己重定向的蓝图动作就行 走路姿势很怪咋办 ...
  • unity的动画事件可以直接在片段上绑定,进行事件注册,但是,相对灵活性不高,这里采用代码绑定。 public class AniMatorMgr : MonoBehaviour { private Animator animator;//动画控制器 private Dictionary&...
  • Vue的动画与Vue双向绑定 这两个问题的讲解,我通过一个小小的列表动画案例来进行,这样效果会比较好点。 顾名思义,列表动画,我们首先要创建一个列表。 使用指令:v-for="" &lt;!DOCTYPE html&...
  • 【jQuery】动画,遍历,事件绑定

    千次阅读 2020-01-17 21:52:55
    【jQuery】动画,遍历,事件绑定1. 动画2. 遍历3. 事件绑定3.1 jquery标准的绑定方式3.2 on绑定事件/off解除绑定3.3 事件切换:toggle4. 插件:增强JQuery的功能5. 案例5.1 广告显示和隐藏5.2 抽奖 1. 动画 三种...
  • cocos2d creator绑定龙骨动画

    千次阅读 2019-03-30 14:14:59
    这里写自定义目录标题cocos2d creator绑定龙骨动画 cocos2d creator绑定龙骨动画 首先我们使用下面这个软件打开动作文件 不要用这种导出直接导出: 这样导出之后,多个动作会使用同一张纹理,导致在cocos2d ...
  • 今天在学习一个翻越的动画,学到了MatchTarget绑定,非常Cool的解决了翻墙时候的手的位置问题,所以来分享一下MatchTarget的简单用法至于前面的走路跑步控制的暂时就不贴上来了,直接到MatchTarget函数上。...
  • 随手做的 希望对有用的人有帮助 动画骨骼绑定
  • 1.角色绑定原则角色绑定没有一定之规,一百种角色就会有一百种绑定方式,哪怕是同一类型的角色也会有多种绑定方法,这也是绑定的难点所在。在学习绑定技术中,需要掌握绑定的基本原理与技巧,了解规律性的东西,才能...
  • 游戏模型绑定动画神器:Akeytsu

    千次阅读 2019-09-04 19:35:33
    Akeytsu是由日本Nukeygara公司出品的一款专注于游戏动画绑定(Rigging)和动画(Animating)的专业软件,观看了油管上的视频,感觉这个软件就像专注于建模的Silo一样,自身定位非常准确,并且由于设计者本身就是资深的...
  • Flash骨骼绑定动画

    千次阅读 2015-07-18 16:59:43
    绑定骨骼要先确定骨骼的主骨骼,即所有骨骼的出发点。 左边工具的第二个可以调整骨骼。 左边第一个就可以来掰动作了 然后动画就跟做动画补间一样,插入关键帧就右键,插入姿势。就可以做自己想要的动作。
  • 作者damirstuhec,源码DSDynamicScrollView,DSDynamicScrollView 是绑定动态和动画 UIScrollView 的 iOS 组件。
  • 原文:通过数据绑定控制WPF动画启动,WPF动画开始 1.主要代码: <ControlTemplate.Triggers> <DataTrigger Binding="{Binding Open,RelativeSource={RelativeSource Self}}" Value=...
  • 使用Mixamo绑定骨骼导入动画

    千次阅读 2019-12-03 13:00:00
    原文转自:https://www.engineworld.cn/thread-640-1-1.html 1.准备FBX人物模型 2.上传Mixamo网站(没有... 3.根据提示将相关放置点 4.绑定后下载模型 5.该模型可以使用Mixamo中所有动画,根据项目所需进行下载 ...
  • 我们需要将@keyframes绑定到选择器中,否则不会有效果出现。同时,我们还需定义动画时长和动画名称 语法 CSS Code复制内容到剪贴板 @keyframes animationname {keyframes-selector {css-styles;}}  值 描述 ...
  • jquery绑定事件与动画

    千次阅读 2016-03-16 14:57:33
    绑定多个事件类型,示例代码如下: $

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,164
精华内容 38,065
关键字:

动画绑定