Zauważyłem, że dodając więcej wierzchołków do linii renderującej linie, linia skręca się i przestaje być gładką linią.
.GIF Tutaj: http://i.imgur.com/hRAhCXM.gif
Wszystkie linie są na tym samym poziomie Z, nawet jeśli usunę materiały, linie nadal wydają się skręcać.
Nie mam pojęcia, dlaczego to robi lub jak to rozwiązać, jakieś sugestie? C #
Odpowiedzi:
Problem polega w zasadzie na tym:
LineRenderer próbuje połączyć pozycje z czerwoną kropką. Tworzy zielone wierzchołki, aby utworzyć siatkę. Tak więc segment górnej linii wygląda świetnie. Ale potem LineRenderer stara się być ekonomiczny, ponownie wykorzystuje wierzchołki od końca jednego segmentu linii na końcu drugiego segmentu linii. Gdy jest ostry kąt, pojawia się problem, który widzisz. Drugi segment linii jest ściśnięty na przecięciu, ponieważ jego „zaślepka” nie jest prostopadła do drugiego „zaślepki”.
Rozwiązaniem jest stworzenie własnego renderera linii, a nie uczynienie go tak ekonomicznym. Możesz to zrobić, generując dynamiczną siatkę . Siatka będzie się składać z szeregu cienkich quadów. Dla każdego segmentu linii można obliczyć cztery rogi kwadratu, obliczając normalną linię i określoną szerokość linii:
Tutaj
a
,b
,c
id
tworzą cztery narożniki jednego segmentu linii, podobnie jak zielone kropki na obrazie powyżej. Te wierzchołki zostaną dodane do siatki, a także dodasz indeksy, aby przekształcić cztery wierzchołki w dwa trójkąty (a więc dodanych zostanie sześć indeksów, abc i bdc).Może to oczywiście stać się dość skomplikowane. Uważam, że innym powodem, dla którego Unity zaimplementowało swój LineRenderer, było to, że w ten sposób unika się innego problemu, narożników. Kiedy zaczniesz rysować każdy segment linii, zaczniesz widzieć, gdzie dwa segmenty linii łączą się i tworzą brzydkie połączenie. Istnieją sposoby, aby sobie z tym poradzić, obliczając wspólną normalną między obiema liniami i aktualizując ich wierzchołki do wspólnej normalnej, ale to tylko częściowo rozwiązuje problem, ponieważ nadal możesz łatwo skończyć z zaciśniętymi liniami. Najbardziej niezawodnym rozwiązaniem jest wygenerowanie dodatkowych wierzchołków w stawach, które będą działać jako narożniki.
źródło
Miałem ten sam problem i rozwiązuję go, dodając więcej punktów do gładkich krawędzi, nie jest to eleganckie rozwiązanie, ale jest proste i działa. Przynajmniej dla mnie. Napisałem funkcję, aby to zrobić:
źródło
Jednym ze sposobów rozwiązania tego problemu dla nieprzezroczystych linii jest narysowanie okręgu w każdym złączu. Okrąg musi mieć średnicę równą szerokości linii. Wymaga to renderowania kilku dodatkowych wierzchołków, ale wygląda naprawdę ładnie. Możesz także pozbyć się wspólnych norm między stawami.
Nadal wymaga to napisania własnego kodu renderującego zamiast korzystania z modułu Unity Line Renderer.
Zrobiłem zasób, który właśnie to robi na http://u3d.as/nFE
źródło
Unikałem tego, ponieważ zawsze ustawiałem pozycję z na 0 w metodzie LineRenderer.SetPosition (). Więc zamiast pisać
LineRenderer.SetPosition(i, myVector3);
napisałem
LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));
Ale to nie jest najlepsze rozwiązanie, ponieważ nadal będziesz otrzymywać te dziwne linie. Najlepszym rozwiązaniem, jakie mogłem wymyślić, było utworzenie oddzielnych linii. To działało idealnie dla mnie. Mam nadzieję, że to ci pomoże.
źródło