Я заметил, что когда я добавляю больше вершин в линию рендерера линий, линия скручивается и перестает быть гладкой линией.
.GIF Здесь: http://i.imgur.com/hRAhCXM.gif
Все линии находятся на одном и том же уровне z, даже если я удаляю материалы, линии, кажется, все еще искривляются.
Я понятия не имею, почему это происходит, или как решить эту проблему, какие-либо предложения? C #
Ответы:
Проблема в основном это:
LineRenderer пытается соединить красные точки. Это создание зеленых вершин для создания сетки. Так что сегмент верхней линии выглядит великолепно. Но тогда LineRenderer пытается быть экономным, он использует вершины от конца одного отрезка в конце второго отрезка. Когда есть острый угол, вы получаете проблему, которую видите. Второй отрезок линии зажимается на пересечении, потому что его «концевая заглушка» не перпендикулярна другой «концевой заглушке».
Решение состоит в том, чтобы создать свой собственный рендер, а не сделать его таким экономичным. Вы можете сделать это, создав динамическую сетку . Сетка будет состоять из серии тонких четырехугольников. Для каждого отрезка линии вы можете вычислить четыре угла четырехугольника, вычислив нормаль линии и заданную ширину линии:
Здесь
a
,b
,c
иd
составляет четыре угла одного сегмента линии, так же как и зеленые точки на изображении выше. Эти вершины будут добавлены в сетку, и вы также добавите индексы, чтобы превратить четыре вершины в два треугольника (таким образом, будет добавлено шесть индексов, abc и bdc).Это, очевидно, может быть довольно сложным. Я полагаю, что еще одна причина, по которой Unity реализовал свой LineRenderer так, как они это сделали, заключалась в том, что это было сделано, чтобы избежать другой проблемы - углов. Когда вы начнете рисовать каждый отрезок линии, вы увидите, где два отрезка соединяются и образуют некрасивое соединение. Есть способы справиться с этим, рассчитав общий нормаль между обеими линиями и обновив их вершины до общего нормального значения, но это только частично решает проблему, так как вы все равно можете легко получить сжатые линии. Наиболее надежным решением является создание дополнительных вершин в соединениях, которые будут выступать в качестве углов.
источник
У меня была та же проблема, и я решил ее, добавив больше точек к сглаженным краям, это не элегантное решение, а простое и работающее. По крайней мере для меня. Я написал функцию для этого:
источник
Один из способов решить эту проблему для непрозрачных линий - это нарисовать окружность на каждом стыке. Круг должен иметь диаметр, равный ширине линии. Это требует нескольких дополнительных вершин для рендеринга, но выглядит действительно красиво. Вы также можете избавиться от общих норм между суставами.
Это все еще требует, чтобы вы написали свой собственный код рендеринга вместо использования Unity Line Renderer.
Я сделал актив, который делает это на http://u3d.as/nFE
источник
Чтобы избежать этого, я всегда устанавливаю позицию z в 0 в методе LineRenderer.SetPosition (). Так что вместо того, чтобы писать
LineRenderer.SetPosition(i, myVector3);
я написал
LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));
Но это не лучшее решение, так как вы все равно получите эти странные строки. Лучшее решение, о котором я мог подумать, - это создание отдельных строк. Это отлично сработало для меня. Надеюсь, это поможет вам.
источник