GAMESH

游戏美术动画unity资源搬运工!

剧情党,完美控!
桐崎千棘
当前位置:首页 > 学习 > 正文内容

unity使用json三维模型的变形动画

admin2年前 (2020-04-20)学习25820

有时我们只需要网格中顶点的子集即可动画,而无需完整的骨架,例如用于面部动画的一组嘴形或脸部顶点。一种简单的方法是使用“变形目标动画”。在此动画中,我们混合顶点而不是骨骼,这就是为什么它也被称为逐顶点动画的原因。动画存储为原始网格顶点的一系列变形版本。变形版本称为“变形目标”,而原始版本称为“基础”。我们可以使用权重数组在基本目标和变形目标之间进行混合:

v e r t e x = b a s e + i = 1 n ( w i ( t a r g e t i b a s e ) )

通过使用jd文件格式,我们可以在pos0和pos1,normal0和normal1之间进行插值

来自Unity Wiki的以下示例仅使用Lerp在2个网格之间混合顶点:

using UnityEngine;
 /// REALLY IMPORTANT NOTE./// When using the mesh morpher you should absolutely make sure that you turn/// off generate normals automatically in the importer, or set the normal angle to 180 degrees./// When importing a mesh Unity automatically splits vertices based on normal creases./// However the mesh morpher requires that you use the same amount of vertices for each mesh and that/// those vertices are laid out in the exact same way. Thus it wont work if unity autosplits vertices based on normals.[RequireComponent(typeof(MeshFilter))]public class MeshMorpher : MonoBehaviour{   public Mesh[] m_Meshes;
   public bool m_AnimateAutomatically = true;
   public float m_OneLoopLength = 1.0F; /// The time it takes for one loop to complete   public WrapMode m_WrapMode = WrapMode.Loop;
   private float m_AutomaticTime = 0;
 
   private int m_SrcMesh = -1;
   private int m_DstMesh = -1;
   private float m_Weight = -1;
   private Mesh m_Mesh;
 
   /// Set the current morph in       public void SetComplexMorph(int srcIndex, int dstIndex, float t)   {      if (m_SrcMesh == srcIndex && m_DstMesh == dstIndex && Mathf.Approximately(m_Weight, t))         return;
 
      Vector3[] v0 = m_Meshes[srcIndex].vertices;
      Vector3[] v1 = m_Meshes[dstIndex].vertices;
      Vector3[] vdst = new Vector3[m_Mesh.vertexCount];
      for (int i = 0; i < vdst.Length; i++)         vdst[i] = Vector3.Lerp(v0[i], v1[i], t);
 
      m_Mesh.vertices = vdst;
      m_Mesh.RecalculateBounds();
   } 
   /// t is between 0 and m_Meshes.Length - 1.   /// 0 means the first mesh, m_Meshes.Length - 1 means the last mesh.   /// 0.5 means half of the first mesh and half of the second mesh.   public void SetMorph(float t)   {      int floor = (int)t;
      floor = Mathf.Clamp(floor, 0, m_Meshes.Length - 2);
      float fraction = t - floor;
      fraction = Mathf.Clamp(t - floor, 0.0F, 1.0F);
      SetComplexMorph(floor, floor + 1, fraction);
   } 
   void Awake()   {      enabled = m_AnimateAutomatically;
      MeshFilter filter = GetComponent(typeof(MeshFilter)) as MeshFilter;
 
      // Make sure all meshes are assigned!      for (int i = 0; i < m_Meshes.Length; i++)      {         if (m_Meshes[i] == null)         {            Debug.Log("MeshMorpher mesh  " + i + " has not been setup correctly");
            m_AnimateAutomatically = false;
            return;
         }      } 
      //  At least two meshes      if (m_Meshes.Length < 2)      {         Debug.Log("The mesh morpher needs at least 2 source meshes");
         m_AnimateAutomatically = false;
         return;
      } 
      filter.sharedMesh = m_Meshes[0];
      m_Mesh = filter.mesh;
      int vertexCount = m_Mesh.vertexCount;
      for (int i = 0; i < m_Meshes.Length; i++)      {         if (m_Meshes[i].vertexCount != vertexCount)         {            Debug.Log("Mesh " + i + " doesn't have the same number of vertices as the first mesh");
            m_AnimateAutomatically = false;
            return;
         }      }   } 
   void Update()   {      if (m_AnimateAutomatically)      {         float deltaTime = Time.deltaTime * (m_Meshes.Length - 1) / m_OneLoopLength;
         m_AutomaticTime += deltaTime;
         float time;
         if (m_WrapMode == WrapMode.Loop)            time = Mathf.Repeat(m_AutomaticTime, m_Meshes.Length - 1);
         else if (m_WrapMode == WrapMode.PingPong)            time = Mathf.PingPong(m_AutomaticTime, m_Meshes.Length - 1);
         else            time = Mathf.Clamp(m_AutomaticTime, 0, m_Meshes.Length - 1);
 
         SetMorph(time);
      }   }}

转载http://www.cgdev.net/blog/476.html

扫描二维码推送至手机访问。

本サイト上に掲載の文章、画像、写真などを無断で複製することは法律で禁じられています。全ての著作権はGAMESHに帰属します。

本文链接:https://pylblog.com/post/178.html

标签: 3dmaxunity3d
分享给朋友:

相关文章

3dmax动作库

3dmax动作库

3dmax动画管理系统,支持biped系统动画快速存储读取!为广大动画师提供便捷,加速动画制作效率。程序支持将场景渲染gif动画,方便预览!程序分为两个模块,一个用作导出动画,一个用作加载动画。动作库...

3dmax自动存储辅助插件

3dmax自动存储辅助插件

如果您在工作时厌倦了3dsmax 自动保存和冻结,则此脚本适合您。它基于Vincent Lacour的想法。安装:将文件放在3dsmax安装的Scripts / startup文件夹中。重启...

3dmax bones骨骼动画曲线顺滑轨迹乱转解决

3dmax bones骨骼动画曲线顺滑轨迹乱转解决

今天在做项目时需要做一个小鸟眩晕的动画,首先先让小鸟转一个圆,然后我key了三帧奇怪的现象发生了,原本这三帧的效果轨迹线应该是一个规则的圆圈但是现在出现的是一个不规则的8字形如图:为什么会这样我也没具...

精美古埃及风格女孩人物模型 Egypt Girl角色模型

精美古埃及风格女孩人物模型 Egypt Girl角色模型

虚幻引擎项目资源古埃及风格女孩人物模型 Egypt Girl,导出max文件,版本为max2015!喜欢的可以拿去做个动画,原版虚幻资源自带几个动作,质量一般!链接:https://pan.baidu...

3dmax动画技巧-将鱼线浮出水面的部分固定(浮漂)

3dmax动画技巧-将鱼线浮出水面的部分固定(浮漂)

这周做一个钓鱼的项目时策划要求待机过程中鱼线露出水面的部分需要固定做一个浮漂,但是我的鱼线是用飘带插件解算的,下面始终在来回摆动。这就不得不需要我想办法去固定住露出水面的那一根骨骼了!首先我尝试使用i...

3dmax bone骨骼无法k帧

3dmax bone骨骼无法k帧

今天在做文件时遇到一个小问题,就是有一根bone始终无法记录关键帧,查找了半天愣是没法解决。正当要放弃的时候我在菜单栏动画栏发现了一个地方不对劲,凭借多年动画制作经验发现有个地方多了一个勾,原来是我把...

发表评论

访客

看不清,换一张

QQ登录
◎欢迎参与讨论,请在这里发表您的看法和观点。