You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

关键修改说明

  1. 统一坐标转换逻辑:无论初始还是更新阶段,都用transform.InverseTransformPoint()将顶点的世界坐标转换为物体本地坐标,和Unity预设Mesh的坐标逻辑保持一致。
  2. 更新Mesh边界:每次修改顶点后调用mesh.RecalculateBounds(),确保Mesh的渲染、碰撞边界正确,避免后续出现显示异常或交互问题。

内容的提问来源于stack exchange,提问作者Crimsonbolt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:23:13