Mesh Manipulation - Mesh旋转角度

上一次提到了如何充值Mesh的中心点,这一次我们就实现一下如何给Mesh添加旋转角度。下面上代码。
旋转分成3个轴向,通过X,Y,Z轴来进行旋转。

using UnityEngine;

namespace LDFW.Model
{
    

    public class MeshRotator : MonoBehaviour
    {
        public static Mesh RotateMeshAroundXAxis(Mesh targetMesh, float degree)
        {
            if (targetMesh == null)
            {
                Debug.LogError("Target mesh cannot be null!");
                return null;
            }

            Mesh newMesh = MeshGenerator.DuplicateMesh(targetMesh);

            int vertexCount = targetMesh.vertices.Length;
            Vector3[] newVertices = new Vector3[vertexCount];

            for (int i = 0; i < vertexCount; i++)
            {
                Vector3 currentVertex = targetMesh.vertices[i];
                Vector2 rotatedVector = Rotate(new Vector2(currentVertex.y, currentVertex.z), degree);
                newVertices[i] = new Vector3(currentVertex.x, rotatedVector.x, rotatedVector.y);
            }

            newMesh.vertices = newVertices;

            newMesh.RecalculateBounds();
            newMesh.RecalculateNormals();

            System.GC.Collect();

            return newMesh;
        }

        public static Mesh RotateMeshAroundYAxis(Mesh targetMesh, float degree)
        {
            if (targetMesh == null)
            {
                Debug.LogError("Target mesh cannot be null!");
                return null;
            }

            Mesh newMesh = MeshGenerator.DuplicateMesh(targetMesh);

            int vertexCount = targetMesh.vertices.Length;
            Vector3[] newVertices = new Vector3[vertexCount];

            for (int i = 0; i < vertexCount; i++)
            {
                Vector3 currentVertex = targetMesh.vertices[i];
                Vector2 rotatedVector = Rotate(new Vector2(currentVertex.x, currentVertex.z), degree);
                newVertices[i] = new Vector3(rotatedVector.x, currentVertex.y,  rotatedVector.y);
            }

            newMesh.vertices = newVertices;

            newMesh.RecalculateBounds();
            newMesh.RecalculateNormals();

            System.GC.Collect();

            return newMesh;
        }

        public static Mesh RotateMeshAroundZAxis(Mesh targetMesh, float degree)
        {
            if (targetMesh == null)
            {
                Debug.LogError("Target mesh cannot be null!");
                return null;
            }

            Mesh newMesh = MeshGenerator.DuplicateMesh(targetMesh);

            int vertexCount = targetMesh.vertices.Length;
            Vector3[] newVertices = new Vector3[vertexCount];

            for (int i = 0; i < vertexCount; i++)
            {
                Vector3 currentVertex = targetMesh.vertices[i];
                Vector2 rotatedVector = Rotate(new Vector2(currentVertex.x, currentVertex.y), degree);
                newVertices[i] = new Vector3(rotatedVector.x, rotatedVector.y, currentVertex.z);
            }

            newMesh.vertices = newVertices;

            newMesh.RecalculateBounds();
            newMesh.RecalculateNormals();

            System.GC.Collect();

            return newMesh;
        }

        public static Vector2 Rotate(Vector2 v, float degrees)
        {
            float sin = Mathf.Sin(degrees * Mathf.Deg2Rad);
            float cos = Mathf.Cos(degrees * Mathf.Deg2Rad);

            float tx = v.x;
            float ty = v.y;

            return new Vector2((cos * tx) - (sin * ty), (sin * tx) + (cos * ty));
        }
    }
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自维基百科的定义,我这里也引述一下...
    AndrewFan阅读 7,896评论 3 12
  • 《机械制图》10%(50+30=80) 单项选择题 Q-B1-E-001 L 基本幅面不能满足需要而采用加长幅面时...
    开源时代阅读 9,498评论 1 1
  • 喜欢自己一个人的时候听着淡淡的歌或者眯着眼睛想一些往事,总感觉那是很惬意的事情。我才发现,这回忆就像是毒药,而我中...
    读书使我快乐的阅读 1,690评论 0 1
  • “在真正的比赛中,冠军永远跑在掌声之前。只有冠军冲过了线,掌声才会想起,之前陪伴自己的都只有汗水的滴落和坚持的...
    幽兰采釆阅读 1,807评论 0 1
  • 每天至少给自己留一点孤独的时空,没有什么可以打扰到你,清净下来才能够好好思考,才可以看看自己都在干什么,看看周围都...
    我们这代人阅读 1,547评论 0 0