Me di cuenta de que a medida que agrego más vértices a una línea de Renderizador de línea, la línea se retuerce y deja de ser una línea suave.
.GIF aquí: http://i.imgur.com/hRAhCXM.gif
Todas las líneas están en el mismo nivel z, incluso si elimino los materiales, las líneas todavía parecen torcerse.
No tengo idea de por qué hace esto, o cómo solucionarlo, ¿alguna sugerencia? C #
Respuestas:
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:
Aquí,
a
,b
,c
yd
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.
fuente
Tuve el mismo problema y lo solucioné agregando más puntos a los bordes lisos, no es una solución elegante, pero es simple y funciona. Al menos para mi. Escribí una función para hacer esto:
fuente
Una forma de resolver esto para las líneas opacas es representar un círculo en cada unión. El círculo debe tener un diámetro igual al ancho de la línea. Esto requiere algunos vértices adicionales para ser renderizado, pero se ve muy bien. También puede deshacerse de las normales compartidas entre las articulaciones.
Esto aún requiere que escriba su propio código de representación en lugar de usar el Unity Line Renderer.
Hice un activo que hace precisamente esto en http://u3d.as/nFE
fuente
La forma en que evité esto es que siempre establezco la posición z en 0 en el método LineRenderer.SetPosition (). Entonces en lugar de escribir
LineRenderer.SetPosition(i, myVector3);
escribí
LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));
Pero esa no es la mejor solución, ya que aún obtendrás esas líneas extrañas. La mejor solución que se me ocurrió fue crear líneas separadas. Eso funcionó perfectamente para mí. Espero que esto te ayude.
fuente