minuschki Geschrieben 14. September 2021 Melden Share Geschrieben 14. September 2021 Hallo zusammen Ich erstelle mit dem angehängten Script ein Mesh, welches ein Graustufenbild als hightmap benutzt. Das funktioniert tadellos. Das Problem ist aber beim Hinzufügen eines Bildes als Textur. In der letzten Zeile füge ich ein Material hinzu. Die Textur soll aber nicht gekachelt, sondern als ganzes Bild über dem gesamten Mesh angezeigt werden (siehe Bild 2). Wie kann ich das hinkriegen? Besten Dank im Voraus! using System.Collections; using System.Collections.Generic; using UnityEngine; public class BergMaker : MonoBehaviour { public Material myMaterial; public void BergGenerieren() { Texture2D hMap = Resources.Load("Berg1") as Texture2D; List<Vector3> verts = new List<Vector3>(); List<int> tris = new List<int>(); //Bottom left section of the map, other sections are similar for(int i = 0; i < 250; i++) { for(int j = 0; j < 250; j++) { //Add each new vertex in the plane verts.Add(new Vector3(i, hMap.GetPixel(i,j).grayscale * 50, j)); //Skip if a new square on the plane hasn't been formed if (i == 0 || j == 0) continue; //Adds the index of the three vertices in order to make up each of the two tris tris.Add(250 * i + j); //Top right tris.Add(250 * i + j - 1); //Bottom right tris.Add(250 * (i - 1) + j - 1); //Bottom left - First triangle tris.Add(250 * (i - 1) + j - 1); //Bottom left tris.Add(250 * (i - 1) + j); //Top left tris.Add(250 * i + j); //Top right - Second triangle } } Vector2[] uvs = new Vector2[verts.Count]; for (var i = 0; i < uvs.Length; i++) //Give UV coords X,Z world coords uvs[i] = new Vector2(verts[i].x, verts[i].z); GameObject plane = new GameObject("ProcPlane"); //Create GO and add necessary components plane.transform.position = new Vector3(-125, -20, 50); plane.AddComponent<MeshFilter>(); plane.AddComponent<MeshRenderer>(); Mesh procMesh = new Mesh(); procMesh.vertices = verts.ToArray(); //Assign verts, uvs, and tris to the mesh procMesh.uv = uvs; procMesh.triangles = tris.ToArray(); procMesh.RecalculateNormals(); //Determines which way the triangles are facing plane.GetComponent<MeshFilter>().mesh = procMesh; //Assign Mesh object to MeshFilter plane.GetComponent<MeshRenderer>().material = myMaterial; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 14. September 2021 Melden Share Geschrieben 14. September 2021 Moin! Deine UV-Koordinaten sind Vielfache von 1, also 0, 1, 2, 3, ... UV-Koordinaten gehen aber nur von 0 bis 1. Vom ersten Quadrat gehen die UV-Koordinaten also von 0 bis 1, das Quadrat daneben geht von 1 bis 2. Texturen wiederholen sich normalerweise, daher zeigen beide (alle) Quadrate einmal das vollständige Bild an. Wenn du z.B. ein 10x10-Grid hast, dann müsste das erste Quadrat das erste Zehntel, das zweite das zweite Zehntel usw. anzeigen. Dann gehen alle Quadrate zusammen von 0 bis 1. Du musst also bei den UVs durch die Anzahl der Vertices auf der jeweiligen Achse teilen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 14. September 2021 Autor Melden Share Geschrieben 14. September 2021 Danke für deine Erklärung! Ich habe deinen Rat befolgt und siehe da, es klappt wie gewünscht. Wieder was dazugelernt! Besten Dank und noch einen schönen Tag! uvs[i] = new Vector2(verts[i].x / 250, verts[i].z / 250); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 15. September 2021 Autor Melden Share Geschrieben 15. September 2021 Ich hätte da noch ein kleines Problem! Das erstellte Mesh hat den Pivot-Punkt bei der Ecke links unten, was wiederum zu Folge hat, dass sich das Objekt bei einer Rotation um die Y-Achse um diese Ecke dreht. Es sollte sich aber um das Zentrum drehen. Ich habe mir vorgestellt, man könne den Pivot per Skript ins Zentrum setzen, was aber offenbar nicht möglich ist. Bei meiner Suche nach einer Lösung des Problems, finde ich nur so Basteleien mit Parent-Gameobject, offset und so weiter, was ich aber sehr umständlich finde. Mir schwebt eigentlich eine Lösung vor, die folgendermassen aussieht: Man erstellt in der Hierarchie ein Empty GameObject (Drehpunkt ist bereits im Zentrum) und fügt ihm die Komponenten <Transform> und <Meshfilter> hinzu. Danach möchte ich das mittels Script ertellte Mesh dem Empty GameObject übergeben, aber so, dass der Drehpunkt im Zentrum verbleibt! Ist das möglich? Mein Versuch ist insofern fehlgeschlagen, dass ich zwar das Mesh auf das Empty GameObject übertragen konnte, aber der Pivot dummerweise wiederum in die untere linke Ecke verschoben wird. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 15. September 2021 Melden Share Geschrieben 15. September 2021 Warum ziehst du nicht einfach bei jedem Vertex einmal die halbe Breite und Länge von der jeweiligen Achse ab? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
minuschki Geschrieben 15. September 2021 Autor Melden Share Geschrieben 15. September 2021 Und schon wieder ein Volltreffer! Danke, dein Tipp ist ist bereits umgesetzt und funktioniert perfekt! 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.