J'ai remarqué que lorsque j'ajoute d'autres sommets à une ligne de rendu de ligne, la ligne se tord et cesse d'être une ligne lisse.
.GIF ici: http://i.imgur.com/hRAhCXM.gif
Toutes les lignes sont au même niveau z, même si j'enlève les matériaux, les lignes semblent toujours se tordre.
Je n'ai aucune idée pourquoi il fait cela, ou comment procéder pour le résoudre, des suggestions? C #
Réponses:
Le problème est essentiellement le suivant:
Le LineRenderer essaie de connecter les positions des points rouges. Il crée les sommets verts pour faire un maillage. Ainsi, le segment de première ligne est superbe. Mais alors le LineRenderer essaie d'être économique, il réutilise les sommets de la fin d'un segment de ligne à la fin du deuxième segment de ligne. Quand il y a un angle aigu, vous obtenez le problème que vous voyez. Le deuxième segment de ligne est pincé à l'intersection car son «capuchon d'extrémité» n'est pas perpendiculaire à son autre «capuchon d'extrémité».
La solution est de créer votre propre rendu de ligne et de ne pas le rendre aussi économique. Vous pouvez le faire en générant un maillage dynamique . Le maillage sera composé d'une série de quadruples fins. Pour chaque segment de ligne, vous pouvez calculer les quatre coins du quad en calculant la normale de la ligne et une largeur de ligne spécifiée:
Ici,
a
,b
,c
etd
constituent les quatre coins d'un seul segment de ligne, tout comme les points verts dans l'image ci - dessus. Ces sommets seraient ajoutés au maillage, et vous ajouteriez également les indices pour transformer les quatre sommets en deux triangles (donc, six indices seraient ajoutés, abc et bdc).Cela peut évidemment devenir assez complexe. Je crois qu'une autre raison pour laquelle Unity a implémenté leur LineRenderer comme ils l'ont fait est que le faire de cette façon évite un autre problème, les virages. Lorsque vous commencez à dessiner chaque segment de ligne, vous commencez à voir où les deux segments de ligne se rejoignent et forment une laideur. Il existe des moyens de résoudre ce problème en calculant la normale partagée entre les deux lignes et en mettant à jour leurs sommets vers la normale partagée, mais cela ne résout que partiellement le problème, car vous pouvez toujours vous retrouver facilement avec des lignes pincées. La solution la plus robuste consiste à générer des sommets supplémentaires au niveau des joints pour servir de coins.
la source
J'ai eu le même problème et je le résous en ajoutant plus de points aux bords lisses ce n'est pas une solution élégante mais c'est simple et fonctionne. Au moins pour moi. J'ai écrit une fonction pour ce faire:
la source
Une façon de résoudre ce problème pour les lignes opaques est de rendre un cercle à chaque joint. Le cercle doit avoir un diamètre égal à la largeur de la ligne. Cela nécessite quelques sommets supplémentaires pour être rendus, mais c'est vraiment sympa. Vous pouvez également vous débarrasser des normales partagées entre les articulations.
Cela nécessite toujours que vous écriviez votre propre code de rendu au lieu d'utiliser le rendu de ligne Unity.
J'ai créé un atout qui fait exactement cela sur http://u3d.as/nFE
la source
La façon dont j'ai évité cela est que je mets toujours la position z à 0 dans la méthode LineRenderer.SetPosition (). Donc au lieu d'écrire
LineRenderer.SetPosition(i, myVector3);
J'ai écrit
LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));
Mais ce n'est pas la meilleure solution car vous obtiendrez toujours ces lignes étranges. La meilleure solution à laquelle je pouvais penser était de créer des lignes séparées. Cela a parfaitement fonctionné pour moi. J'espère que cela vous aidera.
la source