Jump to content
Unity Insider Forum

Tiling Kanten


Kojote

Recommended Posts

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?

914b16-1528716809.jpg

Grüße von Kojote

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...