protected void CalculateUV(Camera camera) { Mesh m = this.GetComponent <MeshFilter>().mesh; // precalculate all uv (quicker to calculate worldToViewPoint or raycast?) Vector2[] uvs = new Vector2[m.vertices.Length]; for (int i = 0; i < m.vertices.Length; i++) { Vector2 uv = camera.WorldToViewportPoint(this.worldVertices[i]); //fov must be properly set uvs[i] = uv; /*if (true || debug) { * Vector3 projected = camera.GetComponent<DrawProjector>().ProjectOnPlaneViewport(uv); * GameObject pgo = Math3DUtils.CreateSphere(projected, Color.cyan); * pgo.transform.rotation = this.transform.rotation; * pgo.name = "Projected"; * }*/ } for (int t = 0; t < m.triangles.Length / 3; t++) { TriangleTextureData vt = vts[t]; bool outOfView = this.OutOfViewportTriangle(uvs, t); bool visible = isVisible(vt.center, camera.transform); if (!outOfView && visible) { Vector2 a = uvs[m.triangles[t * 3 + 0]]; Vector3 b = uvs[m.triangles[t * 3 + 1]]; Vector3 c = uvs[m.triangles[t * 3 + 2]]; float curAngle = this.getAngle(t, camera); if (vt.uvs3 == null || Math.Abs(curAngle % 90) < Math.Abs(vt.angle % 90)) //not set OR new angle is better / smaller { vt.uvs3 = new Vector2[] { a, b, c }; vt.photo = camera.GetComponent <DrawProjector>().fn; vt.distance = Vector3.Distance(camera.transform.position, vt.center); vt.angle = curAngle; //Debug.Log("angle: " + vt.angle); } } } }
public void Init() { Mesh m = getMesh(); int nbTriangles = m.triangles.Length / 3; vts = new TriangleTextureData[nbTriangles]; worldVertices = new Vector3[m.vertices.Length]; for (int i = 0; i < m.vertices.Length; i++) { worldVertices[i] = this.transform.TransformPoint(m.vertices[i]); } for (int t = 0; t < nbTriangles; t++) { TriangleTextureData tex = new TriangleTextureData(); tex.center = getCenter(t); vts[t] = tex; } }
private static string ExportOneGameObject(GameObject go, ref int offsetV, ref int offsetVT) { Mesh m = go.GetComponent <MeshFilter>().mesh; TriangleTexture tt = go.GetComponent <TriangleTexture>(); // cube: 6 faces, 36 triangles, 24 vertices //Debug.Log("vertices: " + m.vertices.Length + " triangles: " + m.triangles.Length + " offsetV:" + offsetV + " offsetVT:" + offsetVT); string wavefrontV = ""; string wavefrontVT = ""; string wavefrontF = ""; for (int i = 0; i < m.vertices.Length; i++) { Vector3 wVertex = go.transform.TransformPoint(m.vertices[i]); wavefrontV += "v " + wVertex.x + " " + wVertex.y + " " + wVertex.z + " 1.0\n"; } int vt = 0; string matname = null; for (int t = 0; t < m.triangles.Length / 3; t++) { TriangleTextureData ttex = tt.vts[t]; int va = m.triangles[t * 3 + 0] + offsetV; int vb = m.triangles[t * 3 + 1] + offsetV; int vc = m.triangles[t * 3 + 2] + offsetV; if (ttex.uvs3 != null) { foreach (Vector2 uv in ttex.uvs3) //do not handle when same uv twice (duplicate date) //should group by texture (ttex['cube'] = []) { wavefrontVT += "vt " + uv.x + " " + uv.y + " # angle=" + ttex.angle + " distance=" + ttex.distance + "\n"; } string matnamecur = Path.GetFileNameWithoutExtension(ttex.photo); if (matname == null || matname != matnamecur) { matname = matnamecur; wavefrontF += "usemtl material_" + matname + "\n"; } wavefrontF += "f " + (va + 1) + "/" + (offsetVT + vt + 1) + " " + (vb + 1) + "/" + (offsetVT + vt + 2) + " " + (vc + 1) + "/" + (offsetVT + vt + 3) + "\n"; vt += 3; } else { wavefrontF += "f " + (va + 1) + " " + (vb + 1) + " " + (vc + 1) + "\n"; } } offsetV += m.vertices.Length; offsetVT += vt; return ("o " + go.name + "\n\n" + wavefrontV + "\n" + wavefrontVT + "\n" + wavefrontF + "#" + System.DateTime.Now.ToLongDateString() + " " + System.DateTime.Now.ToLongTimeString() + " v=" + m.vertices.Length + "; vt=" + vt + "; f=" + m.triangles.Length + ";" + "\n"); }