Kojote Geschrieben 11. Juni 2018 Melden Share Geschrieben 11. Juni 2018 Grüße! Ich baue mir gerade ein Terrain aus mehreren Teilen und nutze dazu Tiling. An sich passen die Kanten der Terrains gut zusammen. Je nach Blickwinkel kommt es jedoch immer wieder dazu, dass kleine Kanten zu sehen sind, wie im Bild ersichtlich. Sobald der Blickwinkel etwas geändert wird, sind diese Kanten wieder verschwunden. Kann mir da jemand einen Tipp geben, was man dagegen machen kann? Grüße von Kojote Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
thewhiteshadow Geschrieben 11. Juni 2018 Melden Share Geschrieben 11. Juni 2018 Die Kanten entstehen vermutlich durch Rundungsfehler. Versuch mal das Terrain minimal zu skalieren. z.b. 1.00001, das sollte eine Überlappung bewirken. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. Juni 2018 Melden Share Geschrieben 11. Juni 2018 @Kojote Schalte mal in der Scene View oben links den Wireframe-Modus an, dann siehst du das Problem. Unity's Terrain Engine macht wie so ziemlich jede andere Terrain Engine Tessellation. Heißt in diesem Fall, dass weiter entfernte Teile des Terrains in niedrigerer Qualität gezeichnet werden. Wenn du dir das im Wireframe-Modus anschaust, ist das vermutlich einleuchtender als jede Erklärung. Dein Problem entsteht mit ziemlicher Sicherheit dadurch, dass die Fläche auf dem angrenzenden Terrain mit weniger Tris gerendert wird als die auf dem näheren Terrain. Ich glaube nicht, dass du das verhindern kannst. Eine Überlappung wäre möglich, kann aber andere Probleme verursachen, zum Beispiel dass man den Trick sieht, wenn man nah rangeht. Insbesondere, weil 1.00001 nicht ausreicht, um das zu beheben. Mein Lösungsvorschlag wäre, die Übergänge zu verstecken. Felsen, Büsche, solcherlei Dinge. Die müssen ja nicht einmal die Kante entlang gehen - sie müssen nur die Kante verstecken, wenn man aus der Entfernung draufschaut, denn von Nahem sieht ja sowieso alles wieder gut aus. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 11. Juni 2018 Autor Melden Share Geschrieben 11. Juni 2018 Erst mal danke für die Antwort. Das ist jetzt allerdings ein kleines Problem, da die Kamerafahrt durch eine Sandwüste geht, da kann ich nicht viel verstecken. Da muss ich mir jetzt was einfallen lassen. ^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 11. Juni 2018 Melden Share Geschrieben 11. Juni 2018 Sandsturm? Ansonsten halt mal überlegen, warum du überhaupt mehrere Terrains hast. Das macht man ja nicht nur zum Spaß. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
thewhiteshadow Geschrieben 12. Juni 2018 Melden Share Geschrieben 12. Juni 2018 Wenn es an der Terrain-Auflösung liegt meine ich mal gelesen zu haben, dass es eine Funktion gibt die genau das für angrenzende Terrains angleicht. https://docs.unity3d.com/ScriptReference/Terrain.SetNeighbors.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 12. Juni 2018 Melden Share Geschrieben 12. Juni 2018 Oha, den kannte ich nicht. Das ist ja praktisch. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 12. Juni 2018 Autor Melden Share Geschrieben 12. Juni 2018 Werde ich dann gleich mal testen, vielen dank @thewhiteshadow Damit sollte es eigentlich gehen: Terrain.SetNeighbors(); Terrain.Flush(); Wenn man weiß nach was man sucht, findet man es auch. 🙂 EDIT: So, mit dem Code sollte es gehen: Terrain terrainLinks; Terrain terrainOben; Terrain terrainRechts; vaTerrainr terrainUnten; private void Start() { var thisTerrain : Terrain = GetComponent(Terrain); thisTerrain.SetNeighbors( terrainLinks, terrainOben, terrainRechts, terrainUnten); } Das soll sich laut Tutorial in jedem Terrain befinden, Frage wäre, was macht das genau und wie? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 12. Juni 2018 Melden Share Geschrieben 12. Juni 2018 Dein Code ist C#, hat aber eine Zeile UnityScript drin? Und: Du lässt die vier Felder serialisieren (entweder public oder, was ich empfehlen würde, [SerializeField]) und ziehst einfach die Terrains jeweils in alle Nachbarterrains rein. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 12. Juni 2018 Autor Melden Share Geschrieben 12. Juni 2018 vor 2 Stunden schrieb Sascha: Dein Code ist C#, hat aber eine Zeile UnityScript drin? Kleiner Fehler, hatte mir den Code von UnityScript fix in C# hier umgeschrieben, Zeile übersehen. Wie würde das mit SerializedField funktionieren, so richtig hab ich das immer noch nicht mit SerializedField verstanden. Was mache ich eigentlich bei den Fällen wo es nicht in alle Richtungen einen Nachbar gibt, einfach freilassen? Bisher siehts bei mir nun so aus: using System.Collections; using System.Collections.Generic; using UnityEngine; public class MOTR_System_Terrain_Set_Neighbors : MonoBehaviour { private Terrain thisTerrain; public Terrain terrainPositivZ; public Terrain terrainNegativZ; public Terrain terrainPositivX; public Terrain terrainNegativX; private void Start() { thisTerrain = gameObject.GetComponent<Terrain>(); thisTerrain.SetNeighbors(terrainNegativX, terrainPositivZ, terrainPositivX, terrainNegativZ); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 12. Juni 2018 Melden Share Geschrieben 12. Juni 2018 vor einer Stunde schrieb Kojote: Wie würde das mit SerializedField funktionieren, so richtig hab ich das immer noch nicht mit SerializedField verstanden. Wenn deine Variable public ist, dann bedeutet das in C#, dass andere Klassen den Wert auslesen und ändern können. In Unity heißt das zusätzlich, dass der Wert im Editor editiert werden kann und dass der eingestellte Wert als Teil deiner Szene gespeichert (serialisiert) wird. Wenn du jetzt nicht willst, dass andere Klassen den Wert der Variable auslesen und ändern können, dann machst du die Variable z.B. private. Dadurch geht aber auch der Unity-Effekt (zu sehen im Inspektor, serialisiert) flöten. Mit [SerializeField] schaltest du Serialisierung wieder ein, ohne deine Variable öffentlich zu machen. vor 1 Stunde schrieb Kojote: Was mache ich eigentlich bei den Fällen wo es nicht in alle Richtungen einen Nachbar gibt, einfach freilassen? Da gehe ich stark von aus. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 12. Juni 2018 Autor Melden Share Geschrieben 12. Juni 2018 Ahhh, jetzt versteh ichs auch mal, danke dir! Und hier noch mal der Code, falls ihn mal jemand braucht: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Set_Neighbors : MonoBehaviour { private Terrain thisTerrain; public Terrain terrainPositivZ; public Terrain terrainNegativZ; public Terrain terrainPositivX; public Terrain terrainNegativX; private void Start() { thisTerrain = gameObject.GetComponent<Terrain>(); thisTerrain.SetNeighbors(terrainNegativX, terrainPositivZ, terrainPositivX, terrainNegativZ); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.