Unity3D 旋转矩阵 顶点动画

来源:互联网 发布:淘宝宝贝描述模素材 编辑:程序博客网 时间:2024/06/10 06:26

首先先看一下矩阵旋转公式

这里写图片描述

这里写图片描述

这里写图片描述

其中负责旋转的部分是

这里写图片描述

负责缩放的部分是

这里写图片描述

负责平移的部分是

这里写图片描述

接下来我们来根据旋转的方式写一下旋转的方法

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