Unity3D旋转矩阵 顶点动画
发表于2018-07-09
Unity中仅仅提供了一个4×4的矩阵类Matrix4x4,它可以包含位移T、旋转R和伸缩信息。
首先先看一下矩阵旋转公式



其中负责旋转的部分是

负责缩放的部分是

负责平移的部分是

接下来我们来根据旋转的方式写一下旋转的方法
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Twist : MonoBehaviour { private Mesh mesh; private void Start() { //获取mesh 为了得到所有顶点 mesh = GetComponent<MeshFilter>().mesh; } private void Update() { //将顶点坐标存入到数组中 Vector3[] vectors = mesh.vertices; //新建一个数组存取旋转后的顶点坐标 Vector3[] results = new Vector3[vectors.Length]; //设置一个旋转角度 float angle = Input.GetAxis("Horizontal") * Time.deltaTime * 100; for (int i = 0; i < vectors.Length; i++) { //因为直接给angle 所有点旋转角度一样 所以*上vectors[i].y //这个是调用围绕Y轴旋转 results[i] = DoTwistY(vectors[i], angle * vectors[i].y); } //将旋转后的顶点坐标再赋值给mesh的顶点 mesh.vertices = results; } //围绕着X轴旋转 Vector3 DoTwistX(Vector3 Position, float angle) { Vector3 result = Vector3.zero; float CosAngle = Mathf.Cos(angle); float SinAngle = Mathf.Sin(angle); result.x = Position.x; result.y = Position.y * CosAngle + SinAngle * Position.z; result.z = -Position.y * SinAngle + CosAngle * Position.z; return result; } //围绕着Y轴旋转 Vector3 DoTwistY(Vector3 Position,float angle) { Vector3 result = Vector3.zero; float CosAngle = Mathf.Cos(angle); float SinAngle = Mathf.Sin(angle); result.x = Position.x * CosAngle - SinAngle * Position.z; result.y = Position.y; result.z = Position.x * SinAngle + CosAngle * Position.z; return result; } //围绕Z轴旋转 Vector3 DoTwistZ(Vector3 Position, float angle) { Vector3 result = Vector3.zero; float CosAngle = Mathf.Cos(angle); float SinAngle = Mathf.Sin(angle); result.x = Position.x * CosAngle + SinAngle * Position.y; result.y = -Position.x * SinAngle + CosAngle * Position.y; result.z = Position.z; return result; } }
总结:
1.围绕着哪个轴旋转,哪个轴上的坐标就保持不变
2.第一行代表旋转后的x轴,第二行代表旋转后的y轴,第三行代表旋转后的z轴
3.第一列代表x轴,第二列代表y轴,第三列代表z轴
4.计算公式就是永远有的x,y,z乘上相对应的变化值相加变得出对应的轴的坐标