Vấn đề cơ bản là thế này:
LineRenderer đang cố gắng kết nối các vị trí chấm đỏ. Nó tạo ra các đỉnh màu xanh lá cây để tạo lưới. Vì vậy, phân khúc hàng đầu trông tuyệt vời. Nhưng sau đó LineRenderer cố gắng tiết kiệm, nó sử dụng lại các đỉnh từ cuối đoạn một dòng ở cuối đoạn thứ hai. Khi có một góc nhọn, bạn sẽ gặp vấn đề bạn đang gặp phải. Đoạn đường thứ hai bị chèn ép tại giao lộ vì 'nắp cuối' của nó không vuông góc với 'nắp cuối' khác.
Giải pháp là tạo trình kết xuất dòng của riêng bạn và không làm cho nó quá kinh tế. Bạn có thể làm điều này bằng cách tạo ra một lưới năng động . Lưới sẽ bao gồm một loạt các hình tứ giác mỏng. Đối với mỗi phân đoạn dòng, bạn có thể tính toán bốn góc của hình tứ giác bằng cách tính mức bình thường của dòng và độ rộng dòng được chỉ định:
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);
Ở đây, a
, b
, c
và d
tạo nên bốn góc của một đoạn thẳng duy nhất, giống như các dấu chấm màu xanh lá cây trong hình trên. Các đỉnh này sẽ được thêm vào lưới và bạn cũng sẽ thêm các chỉ số để biến bốn đỉnh thành hai hình tam giác (vì vậy, sáu chỉ số sẽ được thêm vào, abc và bdc).
Điều này rõ ràng có thể trở nên khá phức tạp. Tôi tin rằng một lý do khác khiến Unity triển khai LineRenderer của họ theo cách họ đã làm là vì làm theo cách đó để tránh một vấn đề khác, các góc. Khi bạn bắt đầu vẽ từng đoạn đường, bạn sẽ bắt đầu thấy hai đoạn đường nối với nhau và tạo thành một khớp xấu xí. Có nhiều cách để giải quyết vấn đề này bằng cách tính toán bình thường được chia sẻ giữa cả hai dòng và cập nhật các đỉnh của chúng thành bình thường được chia sẻ, nhưng điều này chỉ giải quyết được một phần vấn đề, vì bạn vẫn có thể dễ dàng kết thúc với các dòng bị chèn ép. Giải pháp mạnh mẽ nhất là tạo ra các đỉnh bổ sung tại các khớp để hoạt động như các góc.