El problema es básicamente esto:
LineRenderer está intentando conectar las posiciones de los puntos rojos. Está creando los vértices verdes para hacer una malla. Entonces, el segmento de la línea superior se ve muy bien. Pero entonces el LineRenderer intenta ser económico, reutiliza los vértices desde el final de un segmento de línea en el final del segundo segmento de línea. Cuando hay un ángulo agudo, obtienes el problema que estás viendo. El segundo segmento de línea se pellizca en la intersección porque su 'tapa final' no es perpendicular con su otra 'tapa final'.
La solución es crear su propio renderizador de línea y no hacerlo tan económico. Puede hacer esto generando una malla dinámica . La malla consistirá en una serie de quads delgados. Para cada segmento de línea, puede calcular las cuatro esquinas del quad calculando la normalidad de la línea y un ancho de línea específico:
Vector3 normal = Vector3.Cross(start, end);
Vector3 side = Vector3.Cross(normal, end-start);
side.Normalize();
Vector3 a = start + side * (lineWidth / 2);
Vector3 b = start + side * (lineWidth / -2);
Vector3 c = end + side * (lineWidth / 2);
Vector3 d = end + side * (lineWidth / -2);
Aquí, a
, b
, c
y d
compensar las cuatro esquinas de un solo segmento de línea, al igual que los puntos verdes en la imagen de arriba. Estos vértices se agregarían a la malla, y también agregaría los índices para convertir los cuatro vértices en dos triángulos (por lo tanto, se agregarían seis índices, abc y bdc).
Obviamente, esto puede ser bastante complejo. Creo que otra razón por la que Unity implementó su LineRenderer de la manera en que lo hicieron fue porque hacerlo de esa manera evita otro problema, las esquinas. Cuando comience a dibujar cada segmento de línea, comenzará a ver dónde se unen los dos segmentos de línea y forman una junta fea. Hay maneras de lidiar con esto calculando la normal compartida entre ambas líneas y actualizando sus vértices a la normal compartida, pero esto solo resuelve parcialmente el problema, ya que aún puede terminar fácilmente con líneas pinzadas. La solución más robusta es generar vértices adicionales en las juntas para actuar como esquinas.