-
用于flash builder开发项目时制作动画
2018-03-22 10:16:54用于flash builder开发项目时制作动画,主要类为Tween类 -
Flash动画设计与制作项目教学教案.pdf
2020-05-19 16:48:23Flash 动画设计与制作实训教案 实训题目快乐转转转 目的要求颜色相间的发散色条不断旋转 并且有一行文字由左向右运动 相关技术直线运动旋转运动 步骤提示 1该动画有两层组成第 1 层是旋转层第 2 层是文字运动 层 2... -
多媒体技术应用案例教程项目五动画技术应用中秋贺卡Flash动画设计和制作.ppt
2020-07-22 07:51:51多媒体技术应用案例教程项目五动画技术应用中秋贺卡Flash动画设计和制作.ppt -
Unity3D项目七:动画制作过程
2019-10-26 23:11:07人物模型与动画 文章目录人物模型与动画效果展示具体实现准备工作动画器实现第三人称总结参考资料 效果展示 作业博客 -> 传送门???? 视频连接 ->...制作预制体 预制体结构树: 首先创建Pl...人物模型与动画
效果展示
作业博客 -> 传送门
视频连接 -> 传送门
具体实现
准备工作
-
素材资源
我所使用的模型素材:传送门
从左到右从上到下分别为行走,奔跑,跳跃,后跳,翻滚,下落,(还有一个站立忘记截图)这就是本次使用的所有动画。
-
制作预制体
预制体结构树:
首先创建Player空对象,其子对象为:ybot人物模型,cameraHandle空对象用于控制相机,sensor空对象用于探测地面。
动画器
-
准备工作
在Assert中创建新文件夹Animator->创建动画控制器,命名为PlayerController,
将所使用的动画都拖入人物动画器的Base Layer中。
最后动画器长这个样子:
实现的效果是,按下WASD进行行走和转向,站立不动时按下空格后跳一小步,行走时按下空格向前翻滚,按住SHIFT奔跑,奔跑时按下空格向前跳跃,在空中跳跃完成后下落,下落到地面时翻滚。
然后开始一步一步制作。
-
ground动画混合树
ground是一个Blend Tree,动画混合树,一个动画混合树其实也是一个状态,不过可以由多个动画所组成。
在BaseLayer右键->创建状态->从新的混合树,创建新的动画混合树。
ground由站立,走路,奔跑三个动画组成,将这三个动画拖进来。
修改混合树名字和参数名字,在Motion中新增三个状态,并拖入如图所示的三个动画,并调整阈值。拖动红色标尺能看到动画的渐变。
-
创建过渡与参数控制
右键->创建过渡,将所有状态都连接起来。状态之间的过渡通过参数来控制。
使用的所有参数如下:
forward为Float,用于控制ground混合树中行走奔跑的过渡;
OnGround为Bool,表示模型是否在地面上;
jump为Trigger,用于控制跳跃和后跳;
roll为Trigger,用于控制翻滚;
jabVelocity为Float,表示后跳的速度;
rollVelocity为Float,表示翻滚的速度。
下面是一个从ground到jump的过渡例子:
使用参数来过渡需要不勾选退出时间,两个动画的长短以及过渡的区间都可以调整,在预览中看到自己满意的效果即可。
然后是另一个例子:
从jump到fall会有一个问题,如果跳起来还没有播放下落动画就着地了,此时会接着播放fall再播放ground,我们就需要将这条路中断。在状态的Setting中选取中断源为Current State,CurrentState就是过渡箭头的起始状态,在这里就是强行中断fall返回jump再回到ground。
其他过渡不再赘述。
-
通过脚本控制参数
创建ActorController.cs,一些实现的细节在代码与注释中:
public GameObject model; //人物模型 public PlayerInput pi; //用户输入 public float walkSpeed = 1.5f; //行走速度 public float runMultiplier = 2.7f; //奔跑速度 public float jumpVelocity = 4f; //跳跃速度 public float rollVelocity = 1f; //翻滚速度 [SerializeField] private Animator anim; //动画控制器 private Rigidbody rigid; //刚体组件 private Vector3 planarVec; //平面移动向量 private Vector3 thrustVec; //跳跃冲量 private bool lockPlanar = false; //跳跃时锁死平面移动向量 void Awake() { pi = GetComponent<PlayerInput>(); anim = model.GetComponent<Animator>(); rigid = GetComponent<Rigidbody>(); }
Update()
//刷新每秒60次 private void Update() { //修改动画混合树 /*1.从走路到跑步没有过渡*/ /*anim.SetFloat("forward", pi.Dmag * (pi.run ? 2.0f : 1.0f));*/ /*2.使用Lerp加权平均解决*/ float targetRunMulti = pi.run ? 2.0f : 1.0f; anim.SetFloat("forward", pi.Dmag * Mathf.Lerp(anim.GetFloat("forward"), targetRunMulti, 0.3f)); //播放翻滚动画 if (rigid.velocity.magnitude > 1.0f) { anim.SetTrigger("roll"); } //播放跳跃动画 if (pi.jump) { anim.SetTrigger("jump"); } //转向 if(pi.Dmag > 0.01f) { /*1.旋转太快没有补帧*/ /*model.transform.forward = pi.Dvec;*/ /*2.使用Slerp内插值解决*/ Vector3 targetForward = Vector3.Slerp(model.transform.forward, pi.Dvec, 0.2f); model.transform.forward = targetForward; } if(!lockPlanar) { //保存供物理引擎使用 planarVec = pi.Dmag * model.transform.forward * walkSpeed * (pi.run ? runMultiplier : 1.0f); } }
FixedUpdate()
//物理引擎每秒50次 private void FixedUpdate() { //Time.fixedDeltaTime 50/s //1.修改位置 //rigid.position += movingVec * Time.fixedDeltaTime; //2.修改速度 rigid.velocity = new Vector3(planarVec.x, rigid.velocity.y, planarVec.z) + thrustVec; //仅一帧,跳跃冲量 thrustVec = Vector3.zero; }
-
获取玩家输入
创建PlayerInput.cs,平滑地控制角色的行走与转向,在空中不允许用户输入,锁死移动向量,同时还需要解决同时按下W和A时移动速度会与只按下W不同的问题,即将矩形坐标转为圆坐标。在ActorController.cs中使用获取的输入。
public class PlayerInput : MonoBehaviour { [Header("---- KeyCode Settings ----")] /*方向键*/ public string keyUp = "w"; public string keyDown = "s"; public string keyLeft = "a"; public string keyRight = "d"; /*功能键*/ public string keyA = "left shift"; public string keyB = "space"; public string keyC = "k"; public string keyD; /*镜头控制*/ public string keyJUp = "up"; public string keyJDown = "down"; public string keyJLeft = "left"; public string keyJRight = "right"; [Header("---- Output Settings ----")] /*角色方向*/ public float Dup; public float Dright; public float Dmag; /*角色速度*/ public Vector3 Dvec; /*镜头方向*/ public float Jup; public float Jright; /*奔跑跳跃参数*/ public bool run; public bool jump; private bool lastJump; [Header("---- Other Settings ----")] public bool inputEnabled = true; //是否允许输入 private float targetDup; private float targetDright; private float velocityDup; private float velocityDright; void Start() {} void Update() { Jup = (Input.GetKey(keyJUp)) ? 1.0f : 0 - (Input.GetKey(keyJDown) ? 1.0f : 0); Jright = (Input.GetKey(keyJRight)) ? 1.0f : 0 - (Input.GetKey(keyJLeft) ? 1.0f : 0); targetDup = (Input.GetKey(keyUp) ? 1.0f : 0) - (Input.GetKey(keyDown) ? 1.0f : 0); targetDright = (Input.GetKey(keyRight) ? 1.0f : 0) - (Input.GetKey(keyLeft) ? 1.0f : 0); if(!inputEnabled) { targetDup = 0; targetDright = 0; } /*平滑变动*/ Dup = Mathf.SmoothDamp(Dup, targetDup, ref velocityDup, 0.1f); Dright = Mathf.SmoothDamp(Dright, targetDright, ref velocityDright, 0.1f); /*矩形坐标转圆坐标*/ Vector2 tempDAxis = SquareToCircle(new Vector2(Dup, Dright)); float Dup2 = tempDAxis.x; float Dright2 = tempDAxis.y; Dmag = Mathf.Sqrt((Dup2 * Dup2) + (Dright2 * Dright2)); Dvec = Dright * transform.right + Dup * transform.forward; run = Input.GetKey(keyA); /*跳跃*/ bool newJump = Input.GetKey(keyB); lastJump = jump; if(lastJump == false && newJump == true) { jump = true; } else { jump = false; } } /*矩形坐标转圆坐标*/ private Vector2 SquareToCircle(Vector2 input) { Vector2 output = Vector2.zero; output.x = input.x * Mathf.Sqrt(1 - (input.y * input.y) / 2.0f); output.y = input.y * Mathf.Sqrt(1 - (input.x * input.x) / 2.0f); return output; } }
-
FSM
接下来创建一些用于发送消息的脚本。
以FSMOnEnter.cs为例,进入状态时向父级发送消息。
public class FSMOnEnter : StateMachineBehaviour { public string[] onEnterMessages; override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { foreach (var msg in onEnterMessages) { animator.gameObject.SendMessageUpwards(msg); } } }
还是以jump为例,在jump状态中添加行为->FSMOnEnter,然后将size设为1,手动输入OnJumpEnter,当进入jump状态时动画器会向父级发出OnJumpEnter信息。
然后在ActorController中加上如下函数来接受消息。
public void OnJumpEnter() { pi.inputEnabled = false; lockPlanar = true; thrustVec = new Vector3(0, jumpVelocity, 0); }
接受进入跳跃的消息,锁定跳跃时平面移动向量,并且给人物模型一个冲量来跳跃。
FSMOnExit在状态退出时发出消息;
FSMOnUpdate在状态刷新时发出消息,用来实现翻滚和跳跃;
FSMClearSignals比较特殊,在状态进入和退出时清除多余的Trigger,否则按一下空格会给jump参数储存多个Trigger,跳跃多次。
-
实现后跳和翻滚的速度匹配
后跳和翻滚时,人物模型的速度需要进行调整,以匹配动画的播放速度。
public void OnJabUpdate() { thrustVec = model.transform.forward * anim.GetFloat("jabVelocity") * 1.4f; } public void OnRollUpdate() { thrustVec = model.transform.forward * anim.GetFloat("rollVelocity") * 1.0f; }
选中jump2->Edit:
后跳动画需要勾选上根变换位置(Y),这样跳的时候模型才会有Y轴上的位置变化。
然后在曲线中,增加新的曲线,与jabVelocity参数同名,双击进入增加新的Key,设置为-3,最后记得一定要点应用。这样在后跳的时候jabVelocity参数会随该曲线变化,然后在OnJabUpdate中调用即可。
翻滚动作也是同样的操作。
实现第三人称
在cameraHandle中增加一个空对象cameraPos位置调整到人物模型的脖子后方,并挂载CameraController.cs脚本,用于控制摄像机的位置,实现第三人称。详细的就不再赘述了,看代码即可。
/*因为人物是通过物理引擎来移动,摄像机也需要使用FixedUpdate*/ public class CameraConrtoller : MonoBehaviour { public PlayerInput pi; public float horizontalSpeed = 100f; //水平移动速度 public float verticalSpeed = 80f; //垂直移动速度 public float cameraDampValue = 0.5f; private GameObject playerHandle; private GameObject cameraHandle; private float tempEulerX; private GameObject model; private GameObject camera; private Vector3 cameraDampVelocity; void Awake() { cameraHandle = transform.parent.gameObject; playerHandle = cameraHandle.transform.parent.gameObject; model = playerHandle.GetComponent<ActorController>().model; camera = Camera.main.gameObject; tempEulerX = 20f; } void FixedUpdate() { Vector3 tempModelEuler = model.transform.eulerAngles; playerHandle.transform.Rotate(Vector3.up, pi.Jright * horizontalSpeed * Time.fixedDeltaTime); tempEulerX -= pi.Jup * verticalSpeed * Time.fixedDeltaTime; tempEulerX = Mathf.Clamp(tempEulerX, -35, 30); cameraHandle.transform.localEulerAngles = new Vector3(tempEulerX, 0, 0); model.transform.eulerAngles = tempModelEuler; camera.transform.position = Vector3.SmoothDamp( camera.transform.position, transform.position, ref cameraDampVelocity, cameraDampValue); camera.transform.eulerAngles = transform.eulerAngles; } }
-
-
Flash 动画完全攻略项目九综合实例MV制作.ppt
2020-02-05 15:04:319.2 项目基础 在制作MV动画时首先应进行必要的前期策划然后按照正确的制作流程进行实际制作利用Flash CS4制作MTV动画的步骤和方法将通过好青年MV动画案例来讲解 制作构思如下 ?音乐前期处理准备好Flash支持的音乐... -
3ds Max动画设计与制作项目教程
2012-10-28 01:12:14该文档细致的讲解了3ds Max动画设计与制作,专业性性较强 -
iOS项目开发实战——制作视图的缩放动画
2015-08-20 09:55:50视图的大小应该是随时可...该动画的实现与位移动画,透明度动画稍有不同。具体实现如下: import UIKit class ScaleViewController: UIViewController { @IBOutlet weak var greenSquare: UIView! override f视图的大小应该是随时可控的。今天我们就来实现对一个View的缩放动画。该动画的实现与位移动画,透明度动画稍有不同。具体实现如下:
import UIKit class ScaleViewController: UIViewController { @IBOutlet weak var greenSquare: UIView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) func anim(){ self.greenSquare.transform = CGAffineTransformMakeScale(0.5, 0.5)//缩小为原来的0.5倍; } UIView.animateWithDuration(1, animations: anim) } }
(3)运行程序,发现View可以变为原来X,Y轴上的0.5倍。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!
-
Unity动画制作
2019-01-10 15:02:42经过三个月的虚拟仿真项目的参与和制作,对Unity的Animation的动画制作有了一些自己的见解。在Unity中制作动画有一定的好处但是也有一些不好的地方。好的地方比如说:易于制作,方便管理动画对象。不好的地方比如说...经过三个月的虚拟仿真项目的参与和制作,对Unity的Animation的动画制作有了一些自己的见解。在Unity中制作动画有一定的好处但是也有一些不好的地方。好的地方比如说:易于制作,方便管理动画对象。不好的地方比如说:比如说Unity中的Animation动画呢,制作一些直来直去的移动,旋转,缩放,打开关闭对象的动画是比较好的。因为没有特别多的变化,但是,对于一些软体对象的动画是不好制作的,因为软体对象要做动画的话必须改动游戏对象的模型点来做到改变物体来实现想要的动画效果。
所以我建议软体动画最好还是在3DMAX中或者其他的可以制作3D模型动画中的软件中制作。在Unity中的Animation动画制作也需要注意一定的关键点。因为在制作动画中,物体的移动或者旋转,缩放等操作时。如果没有刻上关键的动画帧的话,那么就会出现很多问题,比如说动画的缩放在开始帧时并没有物体动画缩放的关键帧,而是在物体移动到一定的位置时才开始进行缩放的话那么这时候如果说你不在此处刻上缩放的关键帧的话,而是直接进行缩放的动画刻帧的话那么这个动画就会从开始帧时就会为你自动刻上一个缩放的关键帧。
那么你这时播放帧动画的话,你会发现从一开始移动的时候就会开始进行缩放。那么此时的效果并非你想要的,解决的方法呢,就是在你想进行操作的时候首先刻上这个物体要进行操作的关键开始帧,再进行后面实际动画的刻帧和操作。
在Unity中用 Animation制作帧动画的时候,还有一些需要注意的事情。比如说:如果这个物体在世界坐标中直接进行动画的刻帧的话,那么如果这个物体的初始坐标变化的话,那么这个物体的动画将不可复用。为什么不可复用呢?因为你这个游戏物体是基于世界坐标中直接进行坐标移动的,是基于世界坐标!那么可以理解为动画的制作是要进行制作动画的物体需要有一个对照的物体进行相对运动和其他一系列操作,此处这个问题一般对于移动影响较大。
那么这个问题的解决方式是什么呢?其实这个问题非常的好解决,我们只需要在制作动画的物体上加一个空对象父节点,再将这个父节点的坐标和要进行动画的对象的坐标统一。然后再进行动画制作,当然这里进行动画制作的是父节点,而非是要实际进行移动或者缩放等操作的游戏对象。
虽然旧版本的动画系统现在已经被TimeLine给顶替掉了,但是还是有一些人会用到旧版的动画系统,所以写下这篇博客,以供后面想要学习Unity的人参考,这只是一点点的小技巧,也绝非动画系统的知识,希望能对各位想要学习动画系统的人有所帮助。后期我还会写一篇关于TimeLine的博客。
-
计算机 - Flash动画设计与制作项目教学教案.pdf
2020-08-22 08:07:49 -
动画制作3DMax(拓展) 1.4 三维动画的制作流程 chap7_室内灯具的制作.pptx
2020-10-03 08:05:10动画制作3DMax 数字媒体专业群教学资源库项目组 第13章 室内灯具的制作 本章简介 室内灯具是日常家装中必不可少的一部分不同的灯具对室内装修的影响效果不同本章介绍室内各种常见灯具的制作包括客厅吊灯工装吊灯落地... -
CG动画制作项目第十篇:插件Form的使用
2018-06-15 10:26:46可以通过不同的图层贴图以及不同的场来控制粒子的大小形状等参数形成动画。因为粒子的这些特点,所以Form比较适合于制作例如流水、烟雾、火焰等复杂的3D几何图形。另外其内置有音频分析器能够帮助用户轻松提取音乐...Trapcode Form是基于网格的三维粒子插件,与其它的粒子软件不同的是,它的粒子没有产生,生命值,死亡等基本属性,它的粒子从开始就存在。可以通过不同的图层贴图以及不同的场来控制粒子的大小形状等参数形成动画。因为粒子的这些特点,所以Form比较适合于制作例如流水、烟雾、火焰等复杂的3D几何图形。另外其内置有音频分析器能够帮助用户轻松提取音乐节奏频率等参数,并且用它来驱动粒子的相关参数。这是学习Form需要注意的两个关键特点。
今天介绍一段我们用form插件来实现火焰的效果,之前做的火焰是使用的particular插件,为了表现火焰的效果,我们使用form插件。
跟一般的插件使用方法类似,启动AE,新建一个合成项目,建立一个摄像机和一个固态层,在固态层上应用Trapcode Form特效。接下来就可以应用Form预置的多种效果,也可以根据自己的需要一步步设定具体的参数。值得注意的是,不要通过调节固态层的位移来实现Form位移动画,固态层位移一般情况下应固定不变。要实现Form粒子的位移动画可以通过设置其内部的多个参数,或者设定摄像机动画。
为了得到我们的所要的效果,就需要对我们的参数进行调整。
参数的调整首先就是最基本的base form,我们选择Sphere-layered来作为基本的效果把效果的范围调整的大一点
然后是粒子的颜色以及特征状态
之后我们来实现火焰的形状
这时候我们会发现,火焰的形状和样子都有了大概,但是颜色还是单纯的一种,那么这时候我们需要对color
map进行调整,勾画颜色的曲线,使之更接近火焰的效果
最后我们就可以看到我们想要的效果了
不过这样的火焰不实用,我们还需要进行调整其他方面的效果来处理,使他可以在一些特定的场景中实现他的火焰效果。
-
CG动画制作——实训项目中期工作(四)
2018-06-14 20:45:39接下来就是动画中另一个工作量比较大的部分了,龙的动画k帧。...等等,而龙的骨骼更倾向于鸟类的骨骼,要进行动画制作首先要了解它的身体构造,龙分为以下几个部分:1.翅膀,翅膀因龙而异,龙的前爪常... -
CG动画制作——实训项目中期工作(二)
2018-06-14 16:59:50动捕部分: 在动画的制作中,部分动作的实现如果仅仅靠着人工来k帧的话,会使得工作量变得异常庞大,而针对这个问题,动作捕捉设备的兴起以及动作捕捉技术的发展就变得尤为重要。 在我们的动画里,小孩(男主角)... -
CG动画制作项目第四篇:镜头的运用以及画面的布局
2018-04-29 14:41:28这一段时间主要开始的是我们动画二维部分的制作:1.首先在已经画好的分镜稿上看清楚我们的画面的主要内容,以及要表现的方式2.制作动画的demo来更直观的看出我们的制作的效果3.开始手绘,完成我们最终的二维部分的... -
CG动画制作——实训项目前期工作(一)
2018-04-08 22:36:39项目实训开始的第一周,组内进行的基本是动画的前期准备阶段的工作,包括剧本、人物设计、概念草图等。我们的动画将以Maya为主,辅助后期合成和剪辑软件,以及部分live2D画面组成。本周我们主要完成了以下三点工作:... -
CG动画制作项目第十二篇:后期剪辑以及音效、配音处理(二)
2018-06-15 10:56:40在我们的动画项目里,我们把片头的风格选择了二维的处理效果,用二维过度到三维的方式来实现动画的开场。二维的部分自然需要原画师的加入。由于我不是做原画的,所以我就不给大家讲解我们原画创作的部分,我来讲一下... -
CG动画制作项目第九篇:动作捕捉(二)
2018-05-16 20:32:39在我们的动画中,很大一部分角色的动画是需要使用动作捕捉来实现的。之前已经提到过动作捕捉的基本操作,以及motion builder的使用方法,不过我们在使用的过程中还是出现了很多的问题:1.在穿上设备以后,我们要先... -
iOS项目开发实战——制作视图的旋转动画
2015-08-20 11:25:23这里我们将会实现一个View的旋转。具体实现如下: (1)在Main.storyboard中拖入一张图片,绑定到代码中,等下要对这张图片进行旋转。 (2)代码实现如下: import UIKit class RotationViewController: ... -
iOS项目开发实战——制作View的颜色渐变动画
2015-08-20 10:18:09现在我们来学习一下如何改变一个视图的颜色,并以动画的形式展现出来。 (1)在Main.storyboard中拖入一个Label和一个View,事先设置好这两个控件的颜色,然后绑定到代码中。 (2)实现代码如下: import UIKit ... -
修改fragment的进入动画_「咻动画」深圳动画公司基本的动画制作流程
2020-11-27 11:15:03虽然动画宣传片的制作流程就那几个步骤,但是由于不同的动画制作公司人员结构不同以至于处理项目的节奏还是不一样的。下面咻动画就来给小伙伴们简单介绍一下关于深圳动画公司的基本动画制作流程有哪些。「咻动画」...