Ejemplo n.º 1
0
    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);
                }
            }
        }
    }
Ejemplo n.º 2
0
    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;
        }
    }
Ejemplo n.º 3
0
    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");
    }