Unity3D旋转矩阵 顶点动画

发表于2018-07-09
评论0 2.2k浏览
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乘上相对应的变化值相加变得出对应的轴的坐标

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引