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

Unity3D如何用LineRenderer基于两个网格顶点绘制随BlendShape调整的圆/椭圆

Unity3D 颈部环绕动态椭圆/圆实现方案

2个顶点绑定方案完全可行

实现逻辑如下:

  • 仅需绑定颈部同一横截面的前后两个顶点(或左右两个顶点),无需关联大量网格顶点。
  • 运行时实时读取两个顶点的世界坐标,直接计算得到截面圆心、对应轴的半径:圆心为两个顶点的中点,对应轴半径为两点距离的1/2;椭圆另一轴的比例可提前预设固定值,也可额外加两个垂直方向顶点实现完全自适应的椭圆。
  • 动态计算LineRenderer顶点:按你需要的平滑度(比如32段)遍历极坐标角度,将极坐标点结合颈部骨骼的旋转转换为世界坐标,赋值给LineRenderer即可生成环绕的圆/椭圆。
  • 自动同步BlendShape缩放:由于两个绑定顶点的位置会随BlendShape变化自动更新,计算出的半径也会同步变化,无需额外监听BlendShape参数即可实现图形同步缩放。

核心实现代码参考:

public LineRenderer neckLine;
public MeshRenderer neckMeshRenderer;
// 提前记录颈部同一截面两个端点的顶点索引
public int frontVertexIndex;
public int backVertexIndex;
public int smoothSegment = 32;
// 椭圆短轴比例,若要正圆可设为1
public float shortAxisRatio = 0.8f;

private Mesh _neckMesh;
private Vector3[] _vertices;

void Start()
{
    _neckMesh = neckMeshRenderer.GetComponent<MeshFilter>().mesh;
    neckLine.loop = true;
    neckLine.useWorldSpace = true;
    _vertices = new Vector3[_neckMesh.vertexCount];
}

void Update()
{
    _neckMesh.GetVertices(_vertices);
    // 顶点转世界坐标
    Vector3 frontPos = neckMeshRenderer.transform.TransformPoint(_vertices[frontVertexIndex]);
    Vector3 backPos = neckMeshRenderer.transform.TransformPoint(_vertices[backVertexIndex]);
    // 计算圆心和半径
    Vector3 center = (frontPos + backPos) / 2f;
    float longRadius = Vector3.Distance(frontPos, backPos) / 2f;
    float shortRadius = longRadius * shortAxisRatio;
    // 对齐颈部截面朝向
    Quaternion neckRotation = neckMeshRenderer.transform.rotation;
    
    // 生成圆周顶点
    Vector3[] linePoints = new Vector3[smoothSegment + 1];
    for (int i = 0; i <= smoothSegment; i++)
    {
        float rad = 2 * Mathf.PI * i / smoothSegment;
        Vector3 localPoint = new Vector3(Mathf.Cos(rad) * longRadius, Mathf.Sin(rad) * shortRadius, 0);
        linePoints[i] = center + neckRotation * localPoint;
    }
    // 更新LineRenderer
    neckLine.positionCount = linePoints.Length;
    neckLine.SetPositions(linePoints);
}

4顶点方形转圆角方案可行性说明

该方案可正常实现,但适用场景有一定限制:

  • 优势:LineRenderer所需顶点数更少,性能开销略低于动态计算圆周顶点的方案。
  • 限制:当颈部BlendShape调整导致长宽比变化范围较大时,圆角的弧度需要同步动态调整,否则容易出现形变;如果仅需要正圆形且颈部缩放比例范围小,该方案可以满足需求,否则更推荐使用动态计算圆周顶点的方案,适配性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:45:04