精华内容
下载资源
问答
  • 关键帧动画是由许多较短的段构成的动画段表示动画的初始值、最终值或中间值。当运行动画时,她平滑地从一个值移动到另一个值。关键帧对象基本上有Value属性和KeyTime属性。和其他普通动画不同的Value属性的...

    在WPF中,如果需要创建具有多个分段的动画和不规则移动的动画,这个时候可以使用关键帧动画。关键帧动画是由许多较短的段构成的动画,每段表示动画的初始值、最终值或中间值。当运行动画时,她平滑地从一个值移动到另一个值。关键帧对象基本上都有Value属性和KeyTime属性。和其他普通动画不同的是Value属性的数据类型,在LinearPointKeyFrame类中是Point类型,在DoubleKeyFrame类中是double类型
    在这里插入图片描述
    效果图:
    在这里插入图片描述

    如上图,使用的是线性关键帧动画,所以,它在关键帧动画之间平滑地过度。另一种选择是使用离散关键帧,离散关键帧不是进行插值,当到达关键时间时,属性突然改变为新值。线性关键帧类通常使用"Linear"+数据类型+KeyFrame"的形式进行命名,离散关键帧类使用"Discrete数据类型+KeyFrame"的形式命名。当运 行这个动画时中心点会在适当的时间从一个位置跳转到下一个位置。所有关键帧动画类都支持离散关键帧,但只有一部分关键动画类支持线性关键帧
    在这里插入图片描述
    效果图:
    在这里插入图片描述

    展开全文
  • WPF关键帧动画

    2019-06-17 21:00:18
    关键帧动画是由许多较短的段构成的动画段表示动画的初始值、最 终值或中间值。当运行动画时,她平滑地从一个值移动到另一个值。关键帧对象基本上有Value属性和KeyTime属性。和其他普通动画不同的Value属性的...

    关键帧动画

    如果需要创建具有多个分段的动画和不规则移动的动画,这个时候可以使用关键帧动画。关键帧动画是由许多较短的段构成的动画,每段表示动画的初始值、最 终值或中间值。当运行动画时,她平滑地从一个值移动到另一个值。关键帧对象基本上都有Value属性和KeyTime属性。和其他普通动画不同的是Value属性的数 据类型,在LinearPointKeyFrame类中是Point类型,在DoubleKeyFrame类中是double类型。

    Xaml代码 :

    <Window x:Class="动画.关键帧动画"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:动画"
            mc:Ignorable="d"
            Title="关键帧动画" Height="300" Width="300">
        <Window.Resources>
            <PathGeometry x:Key="path">
                <PathFigure IsClosed="True">
                    <ArcSegment Point="100,200" Size="15,10" SweepDirection="Clockwise"></ArcSegment>
                    <ArcSegment Point="50,50" Size="5,5"></ArcSegment>
                    <ArcSegment Point="0,70" Size="7,5"></ArcSegment>
                    
                </PathFigure>
            </PathGeometry>
        </Window.Resources>
        <Window.Triggers>
            <EventTrigger RoutedEvent="Window.Loaded">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimationUsingPath Storyboard.TargetName="image" Storyboard.TargetProperty="(Canvas.Left)" PathGeometry="{StaticResource path}" Duration="0:0:5" RepeatBehavior="Forever" Source="X"></DoubleAnimationUsingPath>
                            <DoubleAnimationUsingPath Storyboard.TargetName="image" Storyboard.TargetProperty="(Canvas.Top)" PathGeometry="{StaticResource path}" Duration="0:0:5" RepeatBehavior="Forever" Source="Y"></DoubleAnimationUsingPath>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Window.Triggers>
        <Canvas>
            <Path Stroke="Red" StrokeThickness="1" Data = "{ StaticResource path }" Canvas.Top="10" Canvas.Left="10"></Path>
            <Image Name="image">
                <Image.Source>
                    <DrawingImage>
                        <DrawingImage.Drawing>
                            <GeometryDrawing Brush="LightSkyBlue">
                                <GeometryDrawing.Geometry>
                                    <GeometryGroup>
                                        <EllipseGeometry Center="10,10" RadiusX="9" RadiusY="4" ></EllipseGeometry>
                                        <EllipseGeometry Center="10,10" RadiusX="4" RadiusY="9"></EllipseGeometry>
                                    </GeometryGroup>
                                </GeometryDrawing.Geometry>
                                <GeometryDrawing.Pen>
                                    <Pen Thickness="1" Brush="Black"></Pen>
                                </GeometryDrawing.Pen>
                            </GeometryDrawing>
                        </DrawingImage.Drawing>
                    </DrawingImage>
                </Image.Source>
            </Image>
        </Canvas>
    </Window>
    

    执行效果:
    应该是个动态的,因为是截图出来的图片,所以没有显示运动状态。在这里插入图片描述
    沿着轨道运动,不断循环。

    展开全文
  • 关键帧逐帧蒙皮动画原理

    千次阅读 2017-08-09 23:27:36
    一、关键帧动画怎么插件的,还有...二、逐帧动画是每帧都有图片,用一个图片序列,按照时间间隔来播放动画,用动画设计软件进行动画设计时候使用关键帧动画设计,但是输出为逐帧动画,2d动画很多采用这个模式。 三

    一、关键帧动画怎么插件的,还有GPU蒙皮

    关键帧动画也称为属性插值动画,一般用于2d非图像质变的动画,主要是对图像的大小,旋转,移动进行插值的关键帧动画,只需要一幅图片就可以,插值方式有线性插值,样条插值。

    二、逐帧动画

    是每个帧都有图片,用一个图片序列,按照时间间隔来播放动画,用动画设计软件进行动画设计时候使用关键帧动画设计,但是输出为逐帧动画,2d动画很多采用这个模式。

    三、3D 蒙皮动画

    1)初始数据和骨骼基于模型坐标系的逆矩阵:
    蒙皮顶点位置从编辑器导出是相对于模型坐标系的,导出时候就可以将骨骼相对于模型坐标系的矩阵的逆导出。

    2)通过动作插值每帧更新只是插值不转换:
    coco2dx每帧更新时候,会先选取一个之前加载的静态动画曲线数据,然后每帧插值骨骼节点bone的本地Ms, Mr(四元数基于球面插值),Mt。这里的更新也支持反向动画的插值(其实是0-1变化转换为1-0变化)。这个任务由coco2dx的CCAnimate3D动作实现,在drawScene Update时候调用。

    3)递归计算每个骨骼的世界坐标系(连续变换,权重,父子节点变换):
    Sprite3D的draw函数会更新整个骨骼根节点的世界坐标系,和计算bone骨骼的骨骼本地坐标(基于opengl的右手坐标系单个节点的连续变化是Mt*Mr(四元数转换为矩阵)*Ms),计算根骨骼的多骨骼融合的世界坐标系(weight权重也在基于骨骼做了),再从根节点到末尾节点递归的计算每个骨骼的世界坐标系。后面会调用mesh进行draw。

    4)更新VBO中蒙皮的位置,提交渲染子类给渲染管理器队列:
    mesh进行draw,主要是纹理对象,是否透明,深度测试开启否,合并批次否,材质信息,VBO,VAO信息,将这些信息封装为一个MeshCommand的Render管理的渲染子类,更重要的是在mesh这里利用了MeshSkin将bone基于模型坐标系的逆矩阵和每个当前bone节点的世界坐标系矩阵相乘得到了顶点基于模型坐标系的顶点位置,得到蒙皮的顶点坐标系该操作通过uniform更新VBO顶点。提交给renderer->addCommand(&_meshCommand); renderer会根据渲染类型排序进行后面的排序渲染。

    其实是V模型*BoneT-pose模型逆*Bone插值新模型位置*M模型根节点在世界坐标系位置,化简为:V模型*BoneT-pose模型逆*Bone新插值在世界坐标系位置。之所以要每次乘以BoneT-pose模型逆应该是有其它原因,因为顶点相对于很多个动画,每个动画一个骨骼序列,为了减少内存,简单和统一处理,而不求出顶点基于每个BindPose的骨骼坐标位置。骨骼用骨骼融合权重,顶点有蒙皮权重。

    代码引用自cocos2d-x-3.15:


    //compute matrix palette used by gpu skin
    Vec4* MeshSkin::getMatrixPalette()
    {
    if (_matrixPalette == nullptr)
    {
    _matrixPalette = new (std::nothrow) Vec4[_skinBones.size() * PALETTE_ROWS];
    }
    int i = 0, paletteIndex = 0;
    static Mat4 t;
    for (auto it : _skinBones )
    {
    // 顶点还是存储模型坐标系位置,顶点乘以_invBindPoses得到基于骨骼坐标系的位置,然后骨骼变换了得到顶点基于新骨骼位置。因为顶点相对于很多个动画,每个动画一个骨骼序列。
    // 为了减少内存,简单和统一处理,不求出顶点基于每个BindPose的骨骼坐标位置。
    Mat4::multiply(it->getWorldMat(), _invBindPoses[i++], &t);
    _matrixPalette[paletteIndex++].set(t.m[0], t.m[4], t.m[8], t.m[12]);
    _matrixPalette[paletteIndex++].set(t.m[1], t.m[5], t.m[9], t.m[13]);
    _matrixPalette[paletteIndex++].set(t.m[2], t.m[6], t.m[10], t.m[14]);
    }
    return _matrixPalette;
    }

    void Mesh::draw(Renderer* renderer, float globalZOrder, const Mat4& transform, uint32_t flags, unsigned int lightMask, const Vec4& color, bool forceDepthWrite)
    {
    if (_skin)
    programState->setUniformVec4v("u_matrixPalette", (GLsizei)_skin->getMatrixPaletteSize(), _skin->getMatrixPalette());
    }

    GPU Skin计算蒙皮骨骼:
    ccShader_3D_PositionTex.vert
    vec4 getPosition()
    {
    float blendWeight = a_blendWeight[0];

    int matrixIndex = int (a_blendIndex[0]) * 3;
    vec4 matrixPalette1 = u_matrixPalette[matrixIndex] * blendWeight;
    vec4 matrixPalette2 = u_matrixPalette[matrixIndex + 1] * blendWeight;
    vec4 matrixPalette3 = u_matrixPalette[matrixIndex + 2] * blendWeight;
    blendWeight = a_blendWeight[1];
    if (blendWeight > 0.0)
    {
    matrixIndex = int(a_blendIndex[1]) * 3;
    matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
    matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
    matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
    blendWeight = a_blendWeight[2];
    if (blendWeight > 0.0)
    {
    matrixIndex = int(a_blendIndex[2]) * 3;
    matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
    matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
    matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
    blendWeight = a_blendWeight[3];
    if (blendWeight > 0.0)
    {
    matrixIndex = int(a_blendIndex[3]) * 3;
    matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
    matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
    matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
    }
    }
    }

    vec4 _skinnedPosition;
    vec4 position = vec4(a_position, 1.0);
    _skinnedPosition.x = dot(position, matrixPalette1);
    _skinnedPosition.y = dot(position, matrixPalette2);
    _skinnedPosition.z = dot(position, matrixPalette3);
    _skinnedPosition.w = position.w;
    return _skinnedPosition;
    }

    void main()
    {
    vec4 position = getPosition();
    gl_Position = CC_MVPMatrix * position;
    TextureCoordOut = a_texCoord;
    TextureCoordOut.y = 1.0 - TextureCoordOut.y;
    }

    // 蒙皮顶点在每个输入顶点输入:
    for (auto k = 0; k < attributeCount; k++)
    {
    auto meshattribute = meshVertexData->getMeshVertexAttrib(k);
    setVertexAttribPointer(
    s_attributeNames[meshattribute.vertexAttrib],
    meshattribute.size,
    meshattribute.type,
    GL_FALSE,
    meshVertexData->getVertexBuffer()->getSizePerVertex(),
    (GLvoid*)offset);
    offset += meshattribute.attribSizeBytes;
    }

    四、变换再总结:

    1.变换其实是从一个坐标系变换到一个坐标系更好理解,逆矩阵就是参考坐标系对调。
    2.连续坐标系之间变换,和Ms Mr Mt一样的,B位置变换到A坐标系下,左手则是B*A,右手则是A*B ,所以骨骼动画中骨骼变换到根节点,左手下是从下往上乘,递归结果不能为上一个节点使用; 右手坐标系下则是从上往下乘,遍历结果可以为下一个节点使用。
    3.如果是unity的tranform而不是骨骼,那么B节点只取position(不要管scale,rotation)在A节点下进行Ms Mr Mt运算,A是根节点在世界坐标系下的,所以运算的结果就是得到基于世界坐标系的B节点位置。


    展开全文
  • 1. 特点 帧——是进行flash动画制作的最基本的单位,一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的帧都可以包含需要显示的所有内容,包括图形、声音、各种素材和其他多种对象。...
     
     
    1. 特点
    帧——是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的每一帧都可以包含需要显示的所有内容,包括图形、声音、各种素材和其他多种对象。

    关键帧——顾名思义,有关键内容的帧。用来定义动画变化、更改状态的帧,即编辑舞台上存在实例对象并可对其进行编辑的帧。

    空白关键帧——空白关键帧是没有包含舞台上的实例内容的关键帧。
    普通帧——在时间轴上能显示实例对象,但不能对实例对象进行编辑操作的帧。
     
    2. 区别
    1) 关键帧在时间轴上显示为实心的圆点,空白关键帧在时间轴上显示为空心的圆点,普通帧在时间轴上显示为灰色填充的小方格
    2) 同一层中,在前一个关键帧的后面任一帧处插入关键帧,是复制前一个关键帧上的对象,并可对其进行编辑操作;如果插入普通帧,是延续前一个关键帧上的内容,不可对其进行编辑操作;插入空白关键帧,可清除该帧后面的延续内容,可以在空白关键帧上添加新的实例对象。
    3)关键帧和空白关键帧上都可以添加帧动作脚本,普通帧上则不能。

    3. 应用中需注意的问题
    1) 应尽可能的节约关键帧的使用,以减小动画文件的体积;
    2) 尽量避免在同一帧处过多的使用关键帧,以减小动画运行的负担,使画面播放流畅
    理解帧、关键帧、空白关键帧:
    时间轴上的小方格叫单元格。可以把单元格转化为帧、关键帧、空白关键帧。
    当播放头移到帧上时,帧的内容就显示在舞台上。
    帧与关键帧都用来记录舞台的内容,但是帧只能显示离它最左边关键帧的内容,我们不能对帧的内容直接进行修改编辑,要想修改帧的内容,必须把它转变成关键帧,后者修改帧最左边关键帧的内容。
    关键帧是可以直接编辑的帧。
    空白关键帧是在舞台上没有任何内容的关键帧,一旦在空白关键帧上绘制了内容,它就变成关键帧。
    可以这样简单记忆理解:
    帧:不可以编辑,用来显示左边关键帧内容。
    关键帧:有内容显示,可以编辑。
    空白关键帧:没有内容显示,可以编辑添加内容。
     
    添加帧只能延续上一个关键帧的内容,添加关键帧才可以编辑,两个关键帧之间的帧可以生成动作或形状动画。添加 关键帧时里面会自动有上一个关键帧的内容,如果你懒得删除,就插入空白关键帧。Action Script只有关键帧或空白关键帧里才可以用。在时间轴上帧是一个有颜色的方块,关键帧是一个有实心圆圈的方块,空白关键帧是一个有空心圆圈的方块。

     

     

    转载于:https://www.cnblogs.com/xinqingHappy/archive/2013/03/25/2981319.html

    展开全文
  • 基础知识 (一)动画:是快速播放一... (2)关键帧动画:在使用关键帧对象指定的一系列值之间播放动画 (三) 动画是时间线:所有动画均继承自 Timeline 对象,因此所有动画都是专用类型的时间线.有以下重要属性:...
  • 帧、关键帧和空白关键帧的作用

    千次阅读 2013-06-30 12:15:40
    帧——是进行flash动画制作的最基本的单位,一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的帧都可以包含需要显示的所有内容,包括图形、声音、各种素材和其他多种对象。  关键帧——...
  • 一个关键帧都支持三种不同的补间类型,分别为 Linear(线性)、Discrete(离散)、Spliend(多键),如下图: DoubleAnimationUsingKeyFrames动画 关键帧有两个重要的属性,分别Value和KeyTime,他们的...
  • 帧和关键帧,空白帧

    千次阅读 2014-07-04 17:56:19
    帧——是进行flash动画制作的最基本的单位,一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的帧都可以包含需要显示的所有内容,包括图形、声音、各种素材和其他多种对象。 关键帧——...
  • 由于公司项目的需要,一个... API来写个cmd,这样可以提高执行效率,最后的结果也不出所料,一个6G的含有上万条动画曲线的文件,而且根曲线都是从-2000多开始到3000多都是动补的数据,实际镜头只需要大约100
  • 前面提到的逐帧动画有一个关键的缺点就是需要为动画中的帧都提供一张单独的图片,由于一帧的图片都需要单独提供,制作起来比较麻烦,图片量也比较大。用关键帧动画可以很好的解决这个问题,下面就给大家进行...
  • 大家知道逐帧动画是一种常见的动画形式,其原理在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。下面我们就来学习下Android中逐帧动画的基础知识,有需要...
  • 动画是一种常见的动画形式,其原理在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。 用简单的话来说,就是一直在替换图片,在人视觉的感受中好像连续在...
  • 小学信息技术 一说你眼中的动画 说 什么是逐帧动画 定义将动画中的帧都设置为关键帧一个关键帧中创建不同的内容就成 为逐帧动画逐帧动画是指动画一帧 的内容都是由一幅绘制的图象组成 原理将对象的运动...
  • 小学信息技术说一说你眼中的动画什么是逐帧动画定义将动画中的帧都设置为关键帧一个关键帧中创建不同的内容就成为逐帧动画逐帧动画是指动画一帧的内容都是由一幅绘制的图象组成 原理将对象的运动过程...
  • 小学信息技术 一说你眼中的动画 说 什么是逐帧动画 定义将动画中的帧都设置为关键帧一个关键帧中创建不同的内容就成 为逐帧动画逐帧动画是指动画一帧 的内容都是由一幅绘制的图象组成 原理将对象的运动...
  • Android动画(二):帧动画

    千次阅读 2016-08-08 08:54:09
    动画,原理在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。因为每一帧的内容不一样,增加了负荷,输出的文件量也大。 优点:灵活,变现细腻。 缺点:...
  • 特点 帧进行flash动画制作的最基本的单位在时间轴上的帧都可以包含需要显示的所有内容包括图形声音各种素材和其他多种对象 关键帧有关键内容的帧用来定义动画变化更改状态的帧即编辑舞台上存在实例对象并可对...
  • @keyframes关键帧

    2021-02-20 20:01:58
    关键帧动画 下面做好的小案例 从图中看到5个正方形里面的小球个位置与颜色不是一致的 animation动画结合关键帧使用 我们可以看到从0%——100%,设置了10个帧数,10%设置的移动轨迹和颜色不一样,设置好...
  • 关键连续的关键帧分解动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。虽然每一帧都不一样,处理的信息量大,但是,帧动画具有非常大的灵活性,几乎可以表现任何想表现的内容,很适合于...
  • , // 运动的关键是帧都改变y radius: '金币大小', img: '前面缓存好的金币图片', speed: '金币的下落速度' }; </code></pre> 一帧,循环这个金币数组,然后绘制出...
  • 逐帧动画是传统flash动画制作一种形式,我们知道一个动画在动起来因为人的视觉暂留导致的,一秒动画可以使用24帧来完成,那么逐帧动画就是要一帧动画都要制作,不是关键帧设计成功就可以了。所以flash逐帧动画...
  • 这样的,比如现在我有一张图像,然后我要把它展示在屏幕上,我可以从左上角遍历个像素点,直到右下角。从而画出这个图像,形成一个动画的过程。这简单的情况。×这关键是实时展示× 但是,我还想进行一些...
  • Css3 动画

    2018-11-01 13:36:00
    逐帧动画:组成动画一个画面就是一个帧(也是关键帧动画帧都是关键帧,没有过度帧生成部分) 关键帧动画:将动画的第一帧和最后一帧设置为关键帧,其他部分由系统完成(过度帧自动生成)。 @keyframes规则...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 121
精华内容 48
关键字:

动画每帧都是关键帧