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乘上相对应的变化值相加变得出对应的轴的坐标
