Проблема в основному така:
LineRenderer намагається з'єднати позиції червоних точок. Це створення зелених вершин для створення сітки. Тож сегмент верхньої лінії виглядає чудово. Але тоді LineRenderer намагається бути економним, він повторно використовує вершини з кінця одного відрізка рядка в кінці сегмента другого рядка. Коли є різкий кут, ви отримуєте проблему, яку ви бачите. Відрізок другого рядка притискається до перетину, оскільки його «кінцева шапка» не перпендикулярна до інших «кінцевих кришок».
Рішення полягає в тому, щоб створити власний лінійний рендерінг, а не робити його таким економічним. Це можна зробити, створивши динамічну сітку . Сітка буде складатися з серії тонких квадроциклів. Для кожного сегмента рядка ви можете обчислити чотири кути квадрата шляхом обчислення нормалі лінії та заданої ширини лінії:
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);
Тут a
, b
, c
і d
становить чотири кути одного сегмента лінії, так само як і зелені точки на зображенні вище. Ці вершини будуть додані до сітки, і ви також додали б індекси, щоб чотири вершини скласти у два трикутники (так, додавали б шість індексів, abc та bdc).
Це, очевидно, може бути досить складним. Я вважаю, що ще одна причина, що Unity реалізував LineRenderer так, як вони це зробили, тому що, роблячи це таким чином, можна уникнути іншої проблеми, куточків. Коли ви почнете малювати кожен сегмент рядка, ви почнете бачити, де два сегментних рядків збираються разом і утворюють потворний стик. Існують способи впоратися з цим, обчисливши загальну нормальну між обома лініями та оновивши їх вершини до спільної нормальної, але це лише частково вирішує проблему, оскільки ви все ще можете легко закінчити стисканими рядками. Найбільш надійне рішення - генерувати додаткові вершини на місцях стиків, щоб вони виконували роль кутів.