- Home /
 
Applying texture to quads on procedural cube
Hey guys, I am getting some weird texture stretching, I have spherized a cube with a random number of faces (which means twice as many triangles) per side and randomized their height from the origin to make my planetoid.
However, I want to apply my texture to each side of the cube before I spherize it.
I will attach my code as I have procedurally generated my cube (basically iterate through x,y,z and if x||y||z = units/2 (units is my number of quads per side) then I place a vector3 at (x,y,z).
I then assigned references to those verts in subcollections based on their position (so my edge/corner vertices are in multiple collections).
I now want to use those collections to assign my texture to that face...
WHAT AM I MISSING?!
 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 using System;
 
 
 // manipulate indexOf of cubeSides instead!
 
 
 public class Spherizer : MonoBehaviour {
     public Transform World, cube; 
     MeshFilter worldFilter;
     public float radius = 5f; //IDE
     public float units = 10, limit = 5; //units defined in IDE
     public int smooth = 50; // 0-100 bigger = smoother
     Vector3 cubeOrigin;
     List<Vector2> uvs;
     Mesh mesh;
     // Use this for initialization
     void Start () {        
         MakeSphere();
     }
     
     // Update is called once per frame
     void Update () {
         
         /*for(int i = 0; i < worldFilter.mesh.vertices.Length; i++) {
 
             Debug.DrawRay(worldFilter.mesh.vertices[i], worldFilter.mesh.normals[i] * 2, Color.green);
 
         }*/
     }
     public void MakeSphere(){
         //instantiate global variables
         World = GameObject.FindGameObjectWithTag("World").transform; 
         cubeOrigin = transform.position;
         limit = units/2;
         worldFilter = World.gameObject.GetComponent<MeshFilter>();
         
         //instantiate local variables
         List<Vector3> worldVertices = new List<Vector3>();
         List<Vector3> worldNormals = new List<Vector3>();
         List<int> worldTriangles = new List<int>();
         List<Vector2> uvs = new List<Vector2>();
         //temp lists
         List<List<Vector3>> cubeSides = new List<List<Vector3>>();
         for (int i = 0; i < 6; i++) {
             cubeSides.Add(new List<Vector3>());
         }
         
         //Build world mesh
         for (float x=-limit;x<=limit;x++){
             for (float y=-limit;y<=limit;y++) {
                 for (float z=-limit;z<=limit;z++){
                     if (Math.Abs(x)==limit||Math.Abs(y)==limit||Math.Abs(z)==limit&&!worldVertices.Contains(new Vector3(x,y,z))) {
                         worldVertices.Add(new Vector3(x,y,z));                    
                     }
                 }
             }
         }
         foreach (Vector3 vert in worldVertices) {
             worldNormals.Add(vert.normalized);
             if (vert.x==limit) {
                 cubeSides[0].Add(vert);
             }
             if (vert.y==limit) {                
                 cubeSides[1].Add(vert);
             }
             if (vert.z==limit) {
                 cubeSides[2].Add(vert);
             }
             if (vert.x==-limit) {                
                 cubeSides[3].Add(vert);
             }
             if (vert.y==-limit) {
                 cubeSides[4].Add(vert);
             }
             if (vert.z==-limit) {                
                 cubeSides[5].Add(vert);
             }
         }
         for (int side = 0;side<cubeSides.Count;side++) {
             switch (side) {
             case 0: //x=5
                 for (int i = 0;i<(cubeSides[side].Count);i++){
                     if (cubeSides[side][i].y<limit&&cubeSides[side][i].z<limit) {
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+1]));
                         
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+1]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                     }
                 }
                 break;
             case 1: //y=5
                 for (int i = 0;i<(cubeSides[side].Count);i++){
                     if (cubeSides[side][i].x<limit&&cubeSides[side][i].z<limit) {
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+1]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+1]));
                     }
                 }
                 break;
             case 2: //z=5
                 for (int i = 0;i<(cubeSides[side].Count);i++){
                     if (cubeSides[side][i].x<limit&&cubeSides[side][i].y<limit) {
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+1]));
                         
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+1]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                     }
                 }
                 break;
             case 3: //x=-5
                 for (int i = 0;i<(cubeSides[side].Count);i++){
                     if (cubeSides[side][i].y<limit&&cubeSides[side][i].z<limit) {
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+1]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+1]));
                     }
                 }
                 break;
             case 4: //y=-5
                 for (int i = 0;i<(cubeSides[side].Count);i++){
                     if (cubeSides[side][i].x<limit&&cubeSides[side][i].z<limit) {
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+1]));
                         
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+1]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                     }
                 }
                 break;
             case 5: //z=-5
                 for (int i = 0;i<(cubeSides[side].Count);i++){
                     if (cubeSides[side][i].y<limit&&cubeSides[side][i].x<limit) {
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+1]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+2]));
                         worldTriangles.Add(worldVertices.IndexOf(cubeSides[side][i+(int)units+1]));
                     }
                 }
                 break;
             default:
                 Debug.Log("Out of Bounds");
             break;
             }
         }
         for(int i = 0;i<worldVertices.Count;i++){
             Vector3 vert = worldVertices[i];
             float distance = (cubeOrigin-vert).magnitude;
             Vector3 vect = cubeOrigin - vert;
             vect = vect.normalized;
             vect *= ((distance - radius) + UnityEngine.Random.Range(-radius/smooth, radius/smooth));
             vert += vect;
             worldVertices[i] = vert;
         }
         //worldFilter.mesh.RecalculateNormals();
         //worldFilter.mesh.RecalculateBounds();
         worldFilter.mesh.vertices = worldVertices.ToArray();
         worldFilter.mesh.triangles = worldTriangles.ToArray();
         worldFilter.mesh.normals = worldNormals.ToArray();
         foreach (Vector3 vert in worldVertices) {
             //vert.Normalize();
             uvs.Add (new Vector2(    vert.normalized.x,// / Mathf.PI + 0.5f,
                                     vert.normalized.y));// / Mathf.PI + 0.5f));
         }
         worldFilter.mesh.uv = uvs.ToArray();
         worldFilter.mesh.uv1 = worldFilter.mesh.uv;
         worldFilter.mesh.uv2 = worldFilter.mesh.uv; 
         //World.gameObject.renderer.material.mainTextureScale = new Vector2(units,units);
         //Debug.Log(worldFilter.gameObject.GetComponent<Shader>().name);
     }
 }
 
 
               
The coding is a little sloppy for now, I try to get functionality and then edit for eloquence.
I am going to be using AddRange() to get rid of all of the Add() calls in my triangles section for sure ;)
Can I assign a material to a range of normals somehow?
Seriously? Nobody has an answer to this question? I have searched unity answers thoroughly to no end. I have a few ideas based on this post: http://answers.unity3d.com/questions/30934/texturing-a-cube-different-textures-on-a-face.html
Hopefully this produces an answer... I will post my results for the community.
It would seem that your texture coordinates are not well distributed. Try applying a a debug UV texture to visualize it (http://i70.photobucket.com/albums/i113/Huidafa/UVTextureChecker4096.png).
As you can see, it it is not applying it to anything beyond object level...

$$anonymous$$aybe this will help, I unscaled it and left my uvs normalized. I also commented out my spherizing loop...

Answer by Cyber_Defect · Apr 08, 2013 at 08:54 PM
I ended up rethinking the entire process and scrapping this method.
If anyone finds a solution to this send me a message, otherwise I am retiring this question as a poor implementation of a concept.
Your answer
 
             Follow this Question
Related Questions
Apply texture to a bar (cube) 2 Answers
How to add my texture to a cube? 2 Answers
Create Material with gradient on a sphere? 2 Answers
Recommended Sphere Texture size? 1 Answer
How to make my rotating sphere sticky? 2 Answers