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

如何获取三点构成的反弹角的垂直向量/角度以实现2D粗线渲染

2D折线粗化拐角交点计算方案

问题梳理

你要实现的是2D折线的粗线渲染,核心需求是计算折线拐角处的顶点,用于生成自定义网格,目前你已经可以计算出拐角的角平分线方向,只需要补充方向旋转、厚度偏移的逻辑即可实现目标。

思路1:基于现有角平分线逻辑修改(最适配你当前代码)

2D平面下向量旋转90度不需要复杂矩阵运算,直接用坐标置换规则即可:

  • 向量(x,y)逆时针旋转90度得到(-y, x)
  • 向量(x,y)顺时针旋转90度得到(y, -x)
    你当前代码计算出的n就是拐角的角平分线方向,只需要把这个方向旋转90度,再乘以厚度的一半,就能得到你要的D1、D2点。

可直接运行的修改后代码

using UnityEngine;

public class ThickLineRenderer : MonoBehaviour {
    // 可调整的线厚度参数
    public float thickness = 0.2f;

    private void OnDrawGizmos() {
        Vector3[] points = new Vector3[] { new Vector3(-1, -1), new Vector3(0, 0), new Vector3(-1, 1) };

        Vector3 p1 = points[0];
        Vector3 p2 = points[1];
        Vector3 p3 = points[2];
  
        Gizmos.color = Color.white;
        Gizmos.DrawLine(p1, p2);
        Gizmos.DrawLine(p2, p3);

        // 计算两条线段的单位方向向量
        Vector3 n1 = (p2 - p1).normalized;
        Vector3 n2 = (p3 - p2).normalized;
  
        // 计算角平分线单位向量
        Vector3 n = (n1 + n2).normalized;

        // 把角平分线向量旋转90度,得到垂直于厚度方向的边向量
        Vector3 perpendicular = new Vector3(-n.y, n.x, 0);
        // 乘以半厚得到偏移量
        Vector3 offset = perpendicular * thickness * 0.5f;

        // 你需要的D1、D2点
        Vector3 D1 = p2 + offset;
        Vector3 D2 = p2 - offset;

        // 绘制D1D2验证效果
        Gizmos.color = Color.red;
        Gizmos.DrawLine(D1, D2);
        // 保留原有蓝线方便对比
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(p2, p2 + n * thickness * 0.5f);
        Gizmos.DrawLine(p2, p2 - n * thickness * 0.5f);
    }
}

思路2:平行线求交方案(适配全场景,包括凹角、多段折线)

如果要处理多段连续折线的粗化,更通用的方案如下:

  • 对每一段原始线段,分别向两侧偏移半厚,生成两条平行线段
  • 相邻两段的同侧平行线求交点,这个交点就是粗线网格的拐角顶点
  • 按顺序把所有交点拼接成三角形带,即可生成完整的粗线网格
    该方案不需要处理旋转逻辑,只需要实现基础的2D线段求交、线段偏移两个工具函数即可,适合复杂折线场景。

效果参考图

现有效果示意图:已有C点,目标获取D点
最终目标粗线渲染效果示意图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:24:03