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

基于UDP传输MediaPipe数据的程序化手掌网格碰撞器失效问题

程序化手掌MeshCollider无法交互的问题解决

你的问题和烘焙操作无关,核心问题出在动态更新网格时未同步MeshCollider状态,以及网格数据不完整导致碰撞器无法正常工作。以下是具体问题分析和修复方案:

关键问题点

  • MeshCollider未同步动态网格:你在Update()中每帧更新了MeshFilter的网格数据,但MeshCollider不会自动感知Mesh的变化,必须手动刷新或重新赋值。
  • 网格数据不完整:当前代码仅设置了顶点和三角形,未重新计算法线、边界,这会导致碰撞器无法正确识别网格的物理形态。
  • 碰撞器初始化时机错误:Start方法中先给collide.sharedMesh赋值了空数据的mesh,后续网格更新后未同步碰撞器状态。

修复后的代码

using UnityEngine;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer), typeof(MeshCollider))]
public class ProceduralPalm : MonoBehaviour
{
    public UDPReceive udpReceive;
    Mesh mesh;
    MeshCollider collide;
    Vector3[] vertices;
    int[] triangles;
    public HandTracking handTracking;

    void Start()
    {
        mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;
        collide = GetComponent<MeshCollider>();
        
        // 初始化数组,避免每帧创建新对象减少GC开销
        vertices = new Vector3[7];
        triangles = new int[]
        {
            0, 1, 2, 2, 1, 3, 3, 1, 4,  4, 1, 5, 4, 5, 6,
            2, 1, 0, 3, 1, 2, 4, 1, 3, 5, 1, 4, 6, 5, 4
        };

        UpdateShape();
        UpdateMeshAndCollider();
    }

    // 更新顶点数据
    void UpdateShape()
    {
        vertices[0] = new Vector3(handTracking.x17, handTracking.y17, handTracking.z17);
        vertices[1] = new Vector3(handTracking.x13, handTracking.y13, handTracking.z13);
        vertices[2] = new Vector3(handTracking.x0,  handTracking.y0,  handTracking.z0);
        vertices[3] = new Vector3(handTracking.x1,  handTracking.y1,  handTracking.z1);
        vertices[4] = new Vector3(handTracking.x2,  handTracking.y2,  handTracking.z2);
        vertices[5] = new Vector3(handTracking.x9,  handTracking.y9,  handTracking.z9);
        vertices[6] = new Vector3(handTracking.x5,  handTracking.y5,  handTracking.z5);
    }

    void UpdateMeshAndCollider()
    {
        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        
        // 必须重新计算法线和边界,确保碰撞器正确识别网格
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        
        // 刷新MeshCollider:先置空再重新赋值触发更新
        collide.sharedMesh = null;
        collide.sharedMesh = mesh;
    }

    void Update()
    {
        UpdateShape();
        UpdateMeshAndCollider();
    }
}

额外注意事项

  • 若手掌网格变化频繁,MeshCollider的动态刷新可能带来性能损耗,可考虑用CapsuleCollider/BoxCollider组合模拟手掌碰撞,或降低碰撞器更新频率。
  • 确保场景中交互的目标物体也带有Collider组件,且至少一方带有Rigidbody组件(需物理交互时)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:35:41