Model&Animation
【Model&Animation】
1、FBX文件是一个完整的模型,通常内含Mesh,Material,Texture,Animation,即内含构成一个完成GameObject所需要的一切组件。可以通过以下代码来引用。
//动画名称
public const string ANIM_NAME0="idle";
public const string ANIM_NAME1="run";
public const string ANIM_NAME2="walk";
public const string ANIM_NAME3="jump_pose";
//模型对象
private GameObject obj = null; void Start ()
{
//获取模型动画
obj = GameObject.Find("Constructor");
//设置动画播放类型为循环
obj.animation.wrapMode = WrapMode.Loop;
} void Update ()
{
//按键后播放不同动画
if (Input.GetKeyDown (KeyCode.A))
{
obj.animation.Play(ANIM_NAME0);
}
if (Input.GetKeyDown (KeyCode.B))
{
obj.animation.Play(ANIM_NAME1);
}
if (Input.GetKeyDown (KeyCode.C))
{
obj.animation.Play(ANIM_NAME2);
}
if (Input.GetKeyDown (KeyCode.D))
{
obj.animation.Play(ANIM_NAME3);
}
}
2、通过Animation组件的AddClip()、PlayQueued()可以实现动画剪辑与合并。
//模型对象
private GameObject obj = null; void Start ()
{
//得到模型动画
obj = GameObject.Find("man"); } void OnGUI()
{
if(GUILayout.Button("播放完整动画"))
{
//这里播放默认动画,默认动画及完整150帧动画
obj.animation.Play();
} if(GUILayout.Button("切割动画0-50帧"))
{
//切割动画,播放第0帧到第50帧
PlayCuttingAnimation(obj,,);
} if(GUILayout.Button("合并动画0-50帧与100-150帧"))
{
//合并动画,将第0帧到第50帧与第100帧到第150帧两组动画合并在一起播放
PlayCombinedAnimation(obj,,,,);
}
} public void PlayCuttingAnimation(GameObject manObject,int startFrame,int endFrame)
{ AnimationClip clip = manObject.animation.clip;
//添加一个剪辑,设置起始帧与结束帧
manObject.animation.AddClip(clip, "cutClip", startFrame, endFrame);
manObject.animation.Play("cutClip");
} public void PlayCombinedAnimation(GameObject manObject,int startFrame0,int EndFrame0,int startFrame1,int EndFrame1)
{
AnimationClip clip = manObject.animation.clip;
//添加两个剪辑,设置起始帧与结束帧
manObject.animation.AddClip(clip,"startClip",startFrame0,EndFrame0,false);
manObject.animation.AddClip(clip,"endClip",startFrame1,EndFrame1,false);
//以队列的形式播放这两个剪辑,保证第一个动画播放完毕在播放第二个动画
manObject.animation.PlayQueued("startClip", QueueMode.PlayNow);
manObject.animation.PlayQueued("endClip", QueueMode.CompleteOthers);
}
3、可以使用方法animation.animation["clip名称"].length来获取播放的时间。
void Start ()
{
//得到模型动画
obj = GameObject.Find("man");
//得到动画播放长度
animLegth = obj.animation.animation[ANIM_NAME].length;
} void OnGUI()
{
//显示信息
string show = "当前动画长度:"+hSliderValue.ToString() +"(s)"+ " / " + animLegth.ToString()+"(s)";
GUILayout.Label(show);
//计算拖动条拖动数值
hSliderValue = GUILayout.HorizontalSlider(hSliderValue, 0.0F, 5.0F,GUILayout.Width());
//绘制动画帧
PlaySilderAnimation(obj,hSliderValue); } public void PlaySilderAnimation(GameObject manObject,float times)
{ //播放动画
if(!manObject.animation.IsPlaying(ANIM_NAME))
{
manObject.animation.Play(ANIM_NAME);
}
//设置动画时间
manObject.animation.animation[ANIM_NAME].time = times;
}
4、使用OpenGL。必须在OnPostRender()中才能使用。
//绘制线段在职
public Material material; //此绘制方法由系统调用
void OnPostRender()
{
if (!material)
{
Debug.LogError("请给材质资源赋值");
return;
}
//设置该材质通道,0为默认。
material.SetPass();
//设置绘制2D图像
GL.LoadOrtho();
//标志GL开始绘制,绘制类型为线段
GL.Begin(GL.LINES);
//绘制线段0
DrawLine(,,,);
//绘制线段1
DrawLine(,,,);
//绘制线段2
DrawLine(,,,);
//结束绘制
GL.End();
} void DrawLine(float x1,float y1,float x2,float y2)
{
//绘制线段,需要坐标点除以屏幕宽或高
GL.Vertex(new Vector3(x1/Screen.width, y1/Screen.height, ));
GL.Vertex(new Vector3(x2/Screen.width, y2/Screen.height, ));
}
5、使用GL绘制鼠标轨迹实例。
private List<Vector3> lineInfo;
void Start()
{
//初始化鼠标线段链表
lineInfo = new List<Vector3>();
}
void Update()
{
//将每次鼠标改变的位置储存进链表
lineInfo.Add(Input.mousePosition);
}
void OnGUI()
{
GUILayout.Label("当前鼠标x轴位置:"+Input.mousePosition.x);
GUILayout.Label("当前鼠标y轴位置:"+Input.mousePosition.y);
}
//此绘制方法由系统调用
void OnPostRender() {
if (!material)
{
Debug.LogError("请给材质资源赋值");
return;
}
//设置该材质通道,0为默认。
material.SetPass();
//设置绘制2D图像
GL.LoadOrtho();
//标志GL开始绘制,绘制类型为线段
GL.Begin(GL.LINES);
//得到鼠标点信息总数量
int size = lineInfo.Count;
//遍历鼠标点的链表
for(int i =; i< size-; i++)
{
Vector3 start = lineInfo[i];
Vector3 end = lineInfo[i+];
//绘制线
DrawLine(start.x,start.y,end.x,end.y);
}
//结束绘制
GL.End();
}
void DrawLine(float x1,float y1,float x2,float y2)
{
//绘制线段,需要坐标点除以屏幕宽或高
GL.Vertex(new Vector3(x1/Screen.width, y1/Screen.height, ));
GL.Vertex(new Vector3(x2/Screen.width, y2/Screen.height, ));
}
6、使用GL绘制方形。
//可用材质
public Material mat0;
public Material mat1;
public Material mat3; void OnPostRender() { //绘制正四边方形
DrawRect(,,,,mat0);
DrawRect(,,,,mat1);
//绘制无规则四边形
DrawQuads(,,,,,,,,mat3);
} /**
绘制正四边形
float x :X轴起始坐标
float y :Y轴起始坐标
float width :正四边形的宽
float height :正四边形的高
*/
void DrawRect(float x,float y,float width,float height,Material mat)
{
GL.PushMatrix();
mat.SetPass();
GL.LoadOrtho();
//绘制类型为四边形
GL.Begin(GL.QUADS); GL.Vertex3(x/Screen.width, y/Screen.height, );
GL.Vertex3(x/Screen.width, (y + height)/Screen.height, );
GL.Vertex3((x+ width)/Screen.width, (y + height)/Screen.height, );
GL.Vertex3((x+ width)/Screen.width,y/Screen.height, ); GL.End();
GL.PopMatrix();
} /**
绘制无规则四边形
float x1 :起始点1,X1坐标
float y1 :起始点1,Y1坐标
float x2 :起始点2,X2坐标
float y2 :起始点2,X2坐标
float x3 :起始点3,X3坐标
float y3 :起始点3,X3坐标
float x4 :起始点4,X4坐标
float y4 :起始点4,X4坐标
*/ void DrawQuads(float x1,float y1,float x2,float y2,float x3,float y3,float x4, float y4,Material mat)
{
GL.PushMatrix();
mat.SetPass();
GL.LoadOrtho();
//绘制类型为四边形
GL.Begin(GL.QUADS); GL.Vertex3(x1/Screen.width, y1/Screen.height, );
GL.Vertex3(x2/Screen.width, y2/Screen.height, );
GL.Vertex3(x3/Screen.width, y3/Screen.height, );
GL.Vertex3(x4/Screen.width, y4/Screen.height, ); GL.End();
GL.PopMatrix();
}
7、使用LineRender。
//线段对象
private GameObject LineRenderGameObject; //线段渲染器
private LineRenderer lineRenderer; //设置线段的顶点数,4个点确定3条线段
private int lineLength = ; //记录4个点,连接一条线段
private Vector3 v0 = new Vector3(1.0f,0.0f,0.0f);
private Vector3 v1 = new Vector3(2.0f,0.0f,0.0f);
private Vector3 v2 = new Vector3(3.0f,0.0f,0.0f);
private Vector3 v3 = new Vector3(4.0f,0.0f,0.0f); void Start()
{
//获得线段游戏对象
LineRenderGameObject = GameObject.Find ("ObjLine");
//获得线渲染器组件
lineRenderer = (LineRenderer)LineRenderGameObject.GetComponent ("LineRenderer");
//设置线的顶点数
lineRenderer.SetVertexCount(lineLength);
//设置线的宽度
lineRenderer.SetWidth(0.1f,0.1f);
} void Update() { //使用这4个顶点渲染3条线段
lineRenderer.SetPosition (, v0);
lineRenderer.SetPosition (, v1);
lineRenderer.SetPosition (, v2);
lineRenderer.SetPosition (, v3); }
8、MeshFilter指定使用哪个Mesh,MeshRender指定使用哪个Material以及渲染属性。Mesh包含VertexMesh和NormalMesh。
Model&Animation的更多相关文章
- u3d 地形 U3d terrain
u3d 地形 U3d terrain 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com fbx ...
- WebGL和ThreeJs学习5--ThreeJS基本功能控件
Threejs 2017年6月6日 15:06 Stats: new Stats();性能监视器,性能测试的方法,引入 Stats.js http://www.hewebgl.com ...
- Unity AssetBundle笔记
1.入门: Resources:表示U3D自动将资源打成一个AssetBundle包,所有放在Resources下的文件夹都会打成一个AssetBundle包,资源非常大,Resources文件夹在真 ...
- About Computer Graphics 2.0
Notes of Computer Graphics 2.0: towards end-user-generated contents CG 1.0 Modeling: construct 3D mo ...
- Unity 打AssetBundle和加载方案
一.如何组织assetBundle: unity5以前,打包需要自己去找依赖,然后需要按照拓扑图顺序压入AB栈,这样在最后打AB时才能有效利用依赖(栈内已有的AB才能作为依赖). unity5.x后, ...
- Spring Boot笔记一
Spring Boot 入门 Spring Boot 简介 > 简化Spring应用开发的一个框架:> 整个Spring技术栈的一个大整合:> J2EE开发的一站式解决方案: 微服务 ...
- 谈谈iOS Animation
零.前言 这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象好比语言的语法,是规则,形象好比具体的句子,可 ...
- 闪电动画模拟(Dielectric Breakdown Model)附源码
当两个物体之间存在较大的电势差时会出现放电现象,比如生活中常见的闪电现象,闪电形成的条件就是云层积累了大量负电荷之后与地面之间形成了强大的电势差.目前关于闪电建模的方法比较少,下面介绍一种利用电介击穿 ...
- AngularJs的UI组件ui-Bootstrap分享(十)——Model
Model是用来创建模态窗口的,但是实际上,并没有Model指令,而只有$uibModal服务,创建模态窗口是使用$uibModal.open()方法. 创建模态窗口时,要有一个模态窗口的模板和对应的 ...
随机推荐
- 消息队列-推/拉模式学习 & ActiveMQ及JMS学习
一种分类是推和拉 . 还有一种分类是 Queue 和 Pub/Sub . 先看的这一篇:http://blog.csdn.net/heyutao007/article/details/50131089 ...
- android 开发如何做内存优化
不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露.其实如果我 们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造 ...
- CSS文字控制与文本控制
一.CSS控制文字属性: 1.font-size:18px;:设置字号(默认是16px=1em),一般在制作网页的时候,先在body里同一设置下字体大小2.color:#093:设置字色3.font- ...
- sed总结
[-] 简介 调用方式 选项 命令集合 寻址方式 基本用法 文件操作 附加-插入-修改文本 删除文本 替换文本 转换文本 补充 ------------------------------------ ...
- Codeforces 424 B Megacity【贪心】
题意:给出城市(0,0),给出n个坐标,起始人数s,每个坐标k个人, 每个坐标可以覆盖到半径为r的区域,r=sqrt(x*x+y*y)的区域,问最小的半径是多少,使得城市的总人数大于等于1000000 ...
- swift2.0 Cannot assign a value of type '[CFString]' to a value of type '[String]'
Cannot assign a value of type '[CFString]' to a value of type '[String]' 代码示例如下: picker.mediaTypes = ...
- perl环境配置以及Eclipse安装perl开发插件
简介: 这篇文章将详细介绍 EPIC 组件的安装,EPIC 编辑环境,调试运行环境,着重介绍如何使用 EPIC 来快速.简便.准确地调试 Perl 语言程序,包括对于 Perl 程序的单步执行,断点用 ...
- Spring aop 实现异常拦截
使用aop异常挂载功能可以统一处理方法抛出的异常,减少很多重复代码,实现如下: 1.实现ThrowAdvice public class ExceptionHandler implements Thr ...
- iOS 开发者必不可少的 75 个工具,你都会了吗
如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断 ...
- 【转载】HBase基本概念和hbase shell常用命令用法
1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...