Mesh Manipulation - Mesh旋轉(zhuǎn)角度

上一次提到了如何充值Mesh的中心點,這一次我們就實現(xiàn)一下如何給Mesh添加旋轉(zhuǎn)角度。下面上代碼。
旋轉(zhuǎn)分成3個軸向,通過X,Y,Z軸來進行旋轉(zhuǎn)。

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));
        }
    }
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 歐拉角的定義 在寫這篇博客之前,我搜索了網(wǎng)上很多關(guān)于歐拉角的定義,發(fā)現(xiàn)大部分引用自維基百科的定義,我這里也引述一下...
    AndrewFan閱讀 3,013評論 3 12
  • 《機械制圖》10%(50+30=80) 單項選擇題 Q-B1-E-001 L 基本幅面不能滿足需要而采用加長幅面時...
    開源時代閱讀 4,374評論 1 1
  • 喜歡自己一個人的時候聽著淡淡的歌或者瞇著眼睛想一些往事,總感覺那是很愜意的事情。我才發(fā)現(xiàn),這回憶就像是毒藥,而我中...
    讀書使我快樂的閱讀 282評論 0 1
  • “在真正的比賽中,冠軍永遠跑在掌聲之前。只有冠軍沖過了線,掌聲才會想起,之前陪伴自己的都只有汗水的滴落和堅持的...
    幽蘭采釆閱讀 293評論 0 1
  • 每天至少給自己留一點孤獨的時空,沒有什么可以打擾到你,清凈下來才能夠好好思考,才可以看看自己都在干什么,看看周圍都...
    我們這代人閱讀 249評論 0 0

友情鏈接更多精彩內(nèi)容