- Home /
when I try to move the vertices of a cube a face disapears though the vertices stay intact
Hello, so I just started getting into the world of creating meshes through script, with the intention of creating a minecraft style block placing mechanic and adding an interesting touch allowing the player to change the position of the vertices and hopefully the edges in the future. here is the code i used
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Create_Mesh : MonoBehaviour {
Mesh mesh;
MeshFilter mF;
MeshRenderer mR;
public float width;
public float height;
public float depth;
public Material mat;
Vector3[] vertices = new Vector3[24];
int[] tri = new int[36];
Vector3[] normals = new Vector3[24];
Vector2[] uv = new Vector2[24];
public List<GameObject> vertexHandles = new List<GameObject>();
public List<HandleScript> handleScripts = new List<HandleScript>();
public Vector3[] repVerts = new Vector3[8];
public int[] realVertLink = new int[24];
public Color[] handleColors = new Color[2];
void Start () {
mF = gameObject.AddComponent<MeshFilter>();
mR = gameObject.AddComponent<MeshRenderer>();
mesh = new Mesh();
mF.mesh = mesh;
mR.material = mat;
//vertices
//front face
vertices[0] = new Vector3 (0, 0, 0);
vertices[1] = new Vector3 (width, 0, 0);
vertices[2] = new Vector3(0, height, 0);
vertices[3] = new Vector3 (width, height, 0);
//Right Face
vertices[4] = new Vector3(width, 0, 0);
vertices[5] = new Vector3(width, 0, depth);
vertices[6] = new Vector3(width, height, 0);
vertices[7] = new Vector3(width, height, depth);
//back face
vertices[8] = new Vector3 (width, 0, depth);
vertices[9] = new Vector3 (0, 0, depth);
vertices[10] = new Vector3 (width, height, depth);
vertices[11] = new Vector3 (0, height, depth);
//left face
vertices[12] = new Vector3 (0, 0, depth);
vertices[13] = new Vector3 (0, 0, 0);
vertices[14] = new Vector3 (0, height, depth);
vertices[15] = new Vector3 (0, height, 0);
//top face
vertices[16] = new Vector3 (0, height, 0);
vertices[17] = new Vector3 (width, height, 0);
vertices[18] = new Vector3 (0, height, depth);
vertices[19] = new Vector3 (width, height, depth);
//bot face
vertices[20] = new Vector3 (0, 0, depth);
vertices[21] = new Vector3 (width, 0, depth);
vertices[22] = new Vector3 (0, 0, 0);
vertices[23] = new Vector3 (width, 0, 0);
mesh.vertices = vertices;
//lower triangle front
tri[0] = 2;
tri[1] = 1;
tri[2] = 0;
//upper Triangle front
tri[3] = 2;
tri[4] = 3;
tri[5] = 1;
//Upper triangle right
tri[6] = 6;
tri[7] = 7;
tri[8] = 5;
//lower right tri
tri[9] = 6;
tri[10] = 5;
tri[11] = 4;
//upper back tri
tri [12] = 10;
tri [13] = 9;
tri [14] = 8;
//lower back tri
tri [15] = 10;
tri [16] = 11;
tri [17] = 9;
//upper triangle left
tri [18] = 14;
tri [19] = 15;
tri [20] = 13;
//lower triangle left
tri [21] = 14;
tri [22] = 13;
tri [23] = 12;
//upper top face
tri[24] = 18;
tri[25] = 19;
tri[26] = 17;
//lower top face
tri[27] = 18;
tri[28] = 17;
tri[29] = 16;
//upper bot tri
tri [30] = 22;
tri [31] = 23;
tri [32] = 21;
//lower bot tri
tri [33] = 22;
tri [34] = 21;
tri [35] = 20;
mesh.triangles = tri;
//normals
normals[0] = -Vector3.forward;
normals[1] = -Vector3.forward;
normals[2] = -Vector3.forward;
normals[3] = -Vector3.forward;
normals[4] = Vector3.right;
normals[5] = Vector3.right;
normals[6] = Vector3.right;
normals[7] = Vector3.right;
normals[8] = Vector3.forward;
normals[9] = Vector3.forward;
normals[10] = Vector3.forward;
normals[11] = Vector3.forward;
normals[12] = -Vector3.right;
normals[13] = -Vector3.right;
normals[14] = -Vector3.right;
normals[15] = -Vector3.right;
normals[16] = Vector3.up;
normals[17] = Vector3.up;
normals[18] = Vector3.up;
normals[19] = Vector3.up;
normals [20] = -Vector3.up;
normals [21] = -Vector3.up;
normals [22] = -Vector3.up;
normals [23] = -Vector3.up;
mesh.normals = normals;
//uv
uv[0] = new Vector2 (0, 0);
uv[1] = new Vector2 (1, 0);
uv[2] = new Vector2 (0, 1);
uv[3] = new Vector2 (1, 1);
uv[4] = new Vector2 (0, 0);
uv[5] = new Vector2 (1, 0);
uv[6] = new Vector2 (0, 1);
uv[7] = new Vector2 (1, 1);
uv[8] = new Vector2 (0, 0);
uv[9] = new Vector2 (1, 0);
uv[10] = new Vector2 (0, 1);
uv[11] = new Vector2 (1, 1);
uv[12] = new Vector2 (0, 0);
uv[13] = new Vector2 (1, 0);
uv[14] = new Vector2 (0, 1);
uv[15] = new Vector2 (1, 1);
uv[16] = new Vector2 (0, 0);
uv[17] = new Vector2 (1, 0);
uv[18] = new Vector2 (0, 1);
uv[19] = new Vector2 (1, 1);
uv[20] = new Vector2 (0, 0);
uv[21] = new Vector2 (1, 0);
uv[22] = new Vector2 (0, 1);
uv[23] = new Vector2 (1, 1);
mesh.uv = uv;
//set representative vertices ***basicaly the corners, i just forgor the word***
repVerts[0] = new Vector3 (0, 0, 0);
repVerts[1] = new Vector3 (width, 0, 0);
repVerts[2] = new Vector3 (0, height, 0);
repVerts[3] = new Vector3 (width, height, 0);
repVerts[4] = new Vector3 (0, 0, depth);
repVerts[5] = new Vector3 (width, 0, depth);
repVerts[6] = new Vector3 (0, height, depth);
repVerts[7] = new Vector3 (width, height, depth);
//link real verts to ref ***organizes vertices so every 3 represent a corner
realVertLink[0] = 0;
realVertLink[1] = 13;
realVertLink[2] = 22;
realVertLink[3] = 1;
realVertLink[4] = 4;
realVertLink[5] = 23;
realVertLink[6] = 2;
realVertLink[7] = 15;
realVertLink[8] = 16;
realVertLink[9] = 3;
realVertLink[10] = 6;
realVertLink[11] = 17;
realVertLink[12] = 9;
realVertLink[13] = 12;
realVertLink[14] = 20;
realVertLink[15] = 5;
realVertLink[16] = 8;
realVertLink[17] = 21;
realVertLink[18] = 11;
realVertLink[19] = 14;
realVertLink[20] = 18;
realVertLink[21] = 7;
realVertLink[22] = 10;
realVertLink[23] = 19;
//spawn controll handles
SpawnControlHandles(repVerts);
}
//spawns control handles
void SpawnControlHandles (Vector3[] verticesPos) {
for (int i = 0; i < verticesPos.Length; i++){
GameObject clone = GameObject.CreatePrimitive(PrimitiveType.Cube);
HandleScript hS = clone.AddComponent<HandleScript>();
hS.id = i;
hS.vertex = true;
hS.cM = gameObject.GetComponent<Create_Mesh>();
hS.materlialColors = handleColors;
clone.name = "Vertex" + i;
clone.transform.position = verticesPos[i];
vertexHandles.Add(clone);
handleScripts.Add(hS);
}
}
//moves controlHandles
public void MoveVertexHandle (int id, Vector3 position) {
int actualID = id * 3;
vertices[actualID] = position;
vertices[actualID +1] = position;
vertices[actualID +2] = position;
mesh.vertices = vertices;
mesh.RecalculateNormals();
}
void Update () {
}
}
As the question says it all goes well until I try to move the handles and one of the faces totaly disapears (im prety sure since i dont see the triangle gizmo) and the other faces don´t have the vertex moved nor they disapear. The mesh is created fine, it create the handle fine(all they do is if draged it will call a fucntion in the Create Mesh script to change the position of the vertices its linked to). I am absolutely clueless on to why this is not working and I realy apreciate your time. sorry for the long question and thanks a lot in advanced.
Answer by Bunny83 · Dec 19, 2014 at 03:53 AM
Uhm, you don't seem to transform the vertex positions into worldspace and when done back to localspace. Is your gameobject located at 0,0,0 without any rotation? In this case it won't matter, if not your handles will be way off.
Another way is of course to parent your handles to the actual mesh object and use localPosition to read and write the position once it's a child of the same Transform. Using localPosition is also usually slightly faster since position has to figure out the worldspace position first.
edit
Additionally i just realized you forgot to use realVertLink inside your MoveVertexHandle method. It should be something like:
public void MoveVertexHandle (int id, Vector3 position)
{
int actualID = id * 3;
vertices[realVertLink[actualID]] = position;
vertices[realVertLink[actualID +1]] = position;
vertices[realVertLink[actualID +2]] = position;
mesh.vertices = vertices;
mesh.RecalculateNormals();
mesh.RecalculateBounds();
}
I've also added RecalculateBounds. If you don't call RecalculateBounds the object might be clipped to early (or too late but that's not visible. It's just a performance thing).
good observation, actualy it is at 0, 0, 0 but eventualy ill have to change it. thanks a lot.
@Bunny83 cant thank you enough. its working great now. sprry for not marking your answer as correct before, thought i did and i just noticed i hadn`t.