Unity自定义Mesh旋转异常:设置90°旋转实际生效180°求助
问题分析与修复方案
你的问题出在Mesh顶点的坐标空间不一致上:
- Start方法里,你直接把顶点的世界坐标存入meshVertices,但Mesh的顶点数据要求是物体本地空间坐标(相对于挂载该脚本的GameObject自身)。
- 而Update中的DeformingFace方法,却是将顶点世界坐标减去物体自身世界坐标,转换成了本地坐标。这种初始与更新阶段的坐标空间不匹配,会在物体旋转时导致顶点计算逻辑混乱,最终出现旋转角度翻倍的问题。
修复后的脚本
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DeformFace : MonoBehaviour { public Face face; public List<Vertex> sharedVertices = new List<Vertex>(); Mesh mesh; public List<Vector3> meshVertices = new List<Vector3>(); private void Start() { sharedVertices = face.sharedVertices; mesh = GetComponent<MeshFilter>().mesh; // 初始就将顶点世界坐标转换为物体本地坐标 for (int i = 0; i < sharedVertices.Count; i++) { meshVertices.Add(transform.InverseTransformPoint(sharedVertices[i].transform.position)); } mesh.vertices = meshVertices.ToArray(); mesh.RecalculateBounds(); // 同步更新Mesh边界,避免显示或碰撞异常 } private void Update() { DeformingFace(); } public void DeformingFace() { for (int i = 0; i < sharedVertices.Count; i++) { // 统一用InverseTransformPoint转换坐标,保持逻辑一致性 meshVertices[i] = transform.InverseTransformPoint(sharedVertices[i].transform.position); } mesh.vertices = meshVertices.ToArray(); mesh.RecalculateBounds(); } }
关键修改说明
- 统一坐标转换逻辑:无论初始还是更新阶段,都用
transform.InverseTransformPoint()将顶点的世界坐标转换为物体本地坐标,和Unity预设Mesh的坐标逻辑保持一致。 - 更新Mesh边界:每次修改顶点后调用
mesh.RecalculateBounds(),确保Mesh的渲染、碰撞边界正确,避免后续出现显示异常或交互问题。
内容的提问来源于stack exchange,提问作者Crimsonbolt
相关产品推荐
相关产品推荐

