MMD 学习

  1 using UnityEngine;
  2 using System.Collections;
  3
  4 namespace UnityChan
  5 {
  6     public class SpringBone : MonoBehaviour
  7     {
  8
  9         public Transform child;
 10
 11
 12         public Vector3 boneAxis = new Vector3 (-1.0f, 0.0f, 0.0f);
 13         public float radius = 0.05f;
 14
 15
 16         public bool isUseEachBoneForceSettings = false;
 17
 18
 19         public float stiffnessForce = 0.01f;
 20
 21
 22         public float dragForce = 0.4f;
 23         public Vector3 springForce = new Vector3 (0.0f, -0.0001f, 0.0f);
 24         public SpringCollider[] colliders;
 25         public bool debug = true;
 26
 27         public float threshold = 0.01f;
 28         private float springLength;
 29         private Quaternion localRotation;
 30         private Transform trs;
 31         private Vector3 currTipPos;
 32         private Vector3 prevTipPos;
 33
 34         private Transform org;
 35
 36         private SpringManager managerRef;
 37
 38         private void Awake ()
 39         {
 40             trs = transform;
 41             localRotation = transform.localRotation;
 42
 43             managerRef = GetParentSpringManager (transform);
 44         }
 45
 46         private SpringManager GetParentSpringManager (Transform t)
 47         {
 48             var springManager = t.GetComponent<SpringManager> ();
 49
 50             if (springManager != null)
 51                 return springManager;
 52
 53             if (t.parent != null) {
 54                 return GetParentSpringManager (t.parent);
 55             }
 56
 57             return null;
 58         }
 59
 60         private void Start ()
 61         {
 62             springLength = Vector3.Distance (trs.position, child.position);
 63             currTipPos = child.position;
 64             prevTipPos = child.position;
 65         }
 66
 67         public void UpdateSpring ()
 68         {
 69
 70             org = trs;
 71
 72             trs.localRotation = Quaternion.identity * localRotation;
 73
 74             float sqrDt = Time.deltaTime * Time.deltaTime;
 75
 76             //stiffness
 77             Vector3 force = trs.rotation * (boneAxis * stiffnessForce) / sqrDt;
 78
 79             //drag
 80             force += (prevTipPos - currTipPos) * dragForce / sqrDt;
 81
 82             force += springForce / sqrDt;
 83
 84
 85             Vector3 temp = currTipPos;
 86
 87             //verlet
 88             currTipPos = (currTipPos - prevTipPos) + currTipPos + (force * sqrDt);
 89
 90
 91             currTipPos = ((currTipPos - trs.position).normalized * springLength) + trs.position;
 92
 93
 94             for (int i = 0; i < colliders.Length; i++) {
 95                 if (Vector3.Distance (currTipPos, colliders [i].transform.position) <= (radius + colliders [i].radius)) {
 96                     Vector3 normal = (currTipPos - colliders [i].transform.position).normalized;
 97                     currTipPos = colliders [i].transform.position + (normal * (radius + colliders [i].radius));
 98                     currTipPos = ((currTipPos - trs.position).normalized * springLength) + trs.position;
 99                 }
100
101
102             }
103
104             prevTipPos = temp;
105
106
107             Vector3 aimVector = trs.TransformDirection (boneAxis);
108             Quaternion aimRotation = Quaternion.FromToRotation (aimVector, currTipPos - trs.position);
109
110             Quaternion secondaryRotation = aimRotation * trs.rotation;
111             trs.rotation = Quaternion.Lerp (org.rotation, secondaryRotation, managerRef.dynamicRatio);
112         }
113
114         private void OnDrawGizmos ()
115         {
116             if (debug) {
117                 Gizmos.color = Color.yellow;
118                 Gizmos.DrawWireSphere (currTipPos, radius);
119             }
120         }
121     }
122 }

SpringBone

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 namespace UnityChan
 5 {
 6     public class SpringCollider : MonoBehaviour
 7     {
 8         //半径
 9         public float radius = 0.5f;
10
11         private void OnDrawGizmosSelected ()
12         {
13             Gizmos.color = Color.green;
14             Gizmos.DrawWireSphere (transform.position, radius);
15         }
16     }
17 }

SpringCollider

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 namespace UnityChan
 5 {
 6     public class SpringManager : MonoBehaviour
 7     {
 8         //Kobayashi
 9         // DynamicRatio is paramater for activated level of dynamic animation
10         public float dynamicRatio = 1.0f;
11
12         //Ebata
13         public float            stiffnessForce;
14         public AnimationCurve    stiffnessCurve;
15         public float            dragForce;
16         public AnimationCurve    dragCurve;
17         public SpringBone[] springBones;
18
19         void Start ()
20         {
21             UpdateParameters ();
22         }
23
24         void Update ()
25         {
26 #if UNITY_EDITOR
27
28         if(dynamicRatio >= 1.0f)
29             dynamicRatio = 1.0f;
30         else if(dynamicRatio <= 0.0f)
31             dynamicRatio = 0.0f;
32         //Ebata
33         UpdateParameters();
34 #endif
35         }
36
37         private void LateUpdate ()
38         {
39
40             if (dynamicRatio != 0.0f) {
41                 for (int i = 0; i < springBones.Length; i++) {
42                     if (dynamicRatio > springBones [i].threshold) {
43                         springBones [i].UpdateSpring ();
44                     }
45                 }
46             }
47         }
48
49         private void UpdateParameters ()
50         {
51             UpdateParameter ("stiffnessForce", stiffnessForce, stiffnessCurve);
52             UpdateParameter ("dragForce", dragForce, dragCurve);
53         }
54
55         private void UpdateParameter (string fieldName, float baseValue, AnimationCurve curve)
56         {
57             var start = curve.keys [0].time;
58             var end = curve.keys [curve.length - 1].time;
59             //var step    = (end - start) / (springBones.Length - 1);
60
61             var prop = springBones [0].GetType ().GetField (fieldName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
62
63             for (int i = 0; i < springBones.Length; i++) {
64
65                 if (!springBones [i].isUseEachBoneForceSettings) {
66                     var scale = curve.Evaluate (start + (end - start) * i / (springBones.Length - 1));
67                     prop.SetValue (springBones [i], baseValue * scale);
68                 }
69             }
70         }
71     }
72 }

SpringManager

视频:https://pan.baidu.com/s/1nvmEC3Z

项目:https://pan.baidu.com/s/1qYbdgqK

用到的资源:https://pan.baidu.com/s/1miLm6O4

时间: 2024-08-02 12:19:08

MMD 学习的相关文章

MMD日文乱码解决

记录一下自己在学习MMD遇到的问题. 日文乱码是很常见的,因为很多MMD资源是日本的. 1.解压乱码 我以好压为例,其他解压软件也是可以通过设置解决的 设置 原文地址:https://www.cnblogs.com/xiyu714/p/8887474.html

MMD :maximum mean discrepancy

MMD :maximum mean discrepancy(最大平均差异) MMD:maximum mean discrepancy.最大平均差异.最先提出的时候用于双样本的检测(two-sample test)问题,用于判断两个分布p和q是否相同.它的基本假设是:如果对于所有以分布生成的样本空间为输入的函数f,如果两个分布生成的足够多的样本在f上的对应的像的均值都相等,那么那么可以认为这两个分布是同一个分布.现在一般用于度量两个分布之间的相似性.在[1]中从任意空间到RKHS上介绍了MMD的计

零基础学习Linux必会的60个常用命令

Linux必学的60个命令Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, 就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统. 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个.这里笔者把比较重要和使用频率最多的命令,按照它们在系统中的作用分成下面六个部分一一介绍. ◆ 安装和登录命令

12.2周一学习记录

1.决定再重新读一遍sv论文. 2.MMD:https://blog.csdn.net/a1154761720/article/details/51516273 3.pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法 https://blog.csdn.net/xiexu911/article/details/80820028 4.中位数 https://blog.csdn.net/zhang20072844/article/details/133

Vue.js学习笔记:属性绑定 v-bind

v-bind  主要用于属性绑定,Vue官方提供了一个简写方式 :bind,例如: <!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a> 绑定HTML Class 一.对象语法: 我们可以给v-bind:class 一个对象,以动态地切换class.注意:v-bind:class指令可以与普通的class特

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

【安全牛学习笔记】

弱点扫描 ╋━━━━━━━━━━━━━━━━━━━━╋ ┃发现弱点                                ┃ ┃发现漏洞                                ┃ ┃  基于端口五福扫描结果版本信息(速度慢)┃ ┃  搜索已公开的漏洞数据库(数量大)      ┃ ┃  使用弱点扫描器实现漏洞管理            ┃ ╋━━━━━━━━━━━━━━━━━━━━╋ [email protected]:~# searchsploit Usage:

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys