- 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