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

Unity网格生成问题:如何使三角形顶点与下一个GameObject的点对齐?

问题分析与解决

你的问题出在坐标转换的对象搞反了,而且没有正确获取上一段黄点的实际位置:

  1. 你现在用lastSegment.yellowDotRight.transform.InverseTransformPoint(segment.transform.position),是把当前段根节点的世界坐标,转成了上一段右黄点的局部坐标——但你实际需要的是上一段右黄点的世界坐标,转成当前段GameObject的局部坐标,因为Mesh的顶点是基于当前段的局部空间的。
  2. 代码里的meshf是未定义变量,应该直接用当前段获取到的MeshFilter组件。
  3. 第一次循环时lastSegment如果没初始化会触发空引用,记得循环前给它赋值(比如赋值为第一个segment,再从第二个开始循环)。

修正后的代码

// 先初始化lastSegment,确保segments不为空
if(segments.Count == 0) return;
Segment lastSegment = segments[0];

// 从第二个段开始处理,第一个段可单独处理或跳过
for(int i = 1; i < segments.Count; i++)
{
    Segment segment = segments[i];
    MeshFilter meshFilter = segment.GetComponent<MeshFilter>();
    Mesh mesh = meshFilter.mesh;
    mesh.Clear();
                
    List<Vector3> vertList = new List<Vector3>();

    // 核心修正:把上一段右黄点的世界坐标,转成当前段的局部坐标
    Vector3 lastRightDotWorldPos = lastSegment.yellowDotRight.transform.position;
    Vector3 relativeToCurrentSegment = segment.transform.InverseTransformPoint(lastRightDotWorldPos);
    vertList.Add(relativeToCurrentSegment);     // 转换后就能和上一段黄点对齐

    // 当前段的右、左黄点局部坐标(原逻辑正确,基于当前段中心偏移)
    vertList.Add(new Vector3(0f, 0f, -segment.yellowDotRightDistanceFromCenter * thicknessFactor));
    vertList.Add(new Vector3(0f, 0f, segment.yellowDotLeftDistanceFromCenter * thicknessFactor));

    // 赋值网格数据并刷新
    mesh.vertices = vertList.ToArray();
    mesh.triangles = new int[] { 0, 1, 2 };
    mesh.RecalculateNormals(); // 刷新法线确保光照正常
    meshFilter.mesh = mesh;

    lastSegment = segment;
}

额外说明

  • Mesh的顶点必须是当前段GameObject的局部坐标,所以所有外部点都要通过当前段的transform.InverseTransformPoint()转成局部空间。
  • 如果黄点本身是基于段的局部空间偏移的,也可以直接用黄点的局部坐标转换,但核心逻辑不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:37:40