如何获取三点构成的反弹角的垂直向量/角度以实现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线段求交、线段偏移两个工具函数即可,适合复杂折线场景。
效果参考图


内容的提问来源于stack exchange,提问作者jpwrunyan
相关产品推荐
相关产品推荐

