Jump to content
Unity Insider Forum

Image auf das gesamte Mesh anwenden


minuschki
 Share

Recommended Posts

Hallo zusammen

Ich erstelle mit dem angehängten Script ein Mesh, welches eine 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;
	}
}

 

Berg.png

Bild2.png

Link to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...