OpenCTM icon indicating copy to clipboard operation
OpenCTM copied to clipboard

Read .obj and converted to ctm but failed to load in three.js

Open mayurdp313 opened this issue 5 years ago • 0 comments

When I read the .obj file and convert to Mesh to generate ctm File it was created but failed to load in three.js

it show following message

Uncaught Error in data stream *** sample .obj file is uploaded

`using OpenCTM; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 {

class Program
{
    private static float[] vert = new float[]{  0,0,0,
                                                1,0,0,
                                                1,1,0,
                                                0,1,0};//v
    private static float[] normals = new float[]{1,1,1,
                                                1,1,1,
                                                1,1,1,
                                                1,1,1};//vn
    private static AttributeData[] uvad = { new AttributeData ("uv1", "test",
                                                                AttributeData.STANDARD_UV_PRECISION,
                                                                new float[]{0.0034f, 0.1f,
                                                                            0.8f, 1.0f,
                                                                            0.351f, 0.612f,
                                                                            0.1229f, 0.91224f}) };//vt
    private static int[] ind = new int[] { 0, 1, 2, 0, 2, 3 };//f
    private static Mesh quad = new Mesh(vert, normals, ind, uvad, new AttributeData[0]);
    
    
    public void rawTest()
    {
        testEncoder(new RawEncoder());
    }

    public void mg1Test()
    {
        testEncoder(new MG1Encoder());
    }

    public void mg2Test()
    {
        testEncoder(new MG2Encoder(MG2Encoder.STANDARD_VERTEX_PRECISION, MG2Encoder.STANDARD_NORMAL_PRECISION));
    }

    private void testEncoder(MeshEncoder encoder)
    {
        MemoryStream memory = new MemoryStream();
        CtmFileWriter writer = new CtmFileWriter(memory, encoder);
        writer.encode(quad, null);

        memory.Seek(0, SeekOrigin.Begin);
        using (FileStream file = new FileStream("mayu.ctm", FileMode.Create, System.IO.FileAccess.Write))
            memory.CopyTo(file);
        Stream readMemory = new MemoryStream(memory.ToArray());
        CtmFileReader reader = new CtmFileReader(readMemory);
        Mesh m = reader.decode();

        m.checkIntegrity();

        //MG2Encoder mg2 = encoder as MG2Encoder;

        //Chech file integirty
        //MemoryStream ms = new MemoryStream();
        //using (FileStream file = new FileStream("col.ctm", FileMode.Open, FileAccess.Read))
        //    file.CopyTo(ms);

        //Stream readMemory1 = new MemoryStream(ms.ToArray());
        //CtmFileReader reader1 = new CtmFileReader(readMemory1);
        //Mesh m2 = reader1.decode();

        //m2.checkIntegrity();
        //float[] v = m2.vertices;
        //float[] n = m2.normals;
        //AttributeData []ad = m2.texcoordinates;
        //int[] index = m2.indices;
        //var t= m2.getVertexCount();
        //var c = m2.getTriangleCount();

        
    }

    static void Main(string[] args)
    {
        Program p = new ConsoleApplication1.Program();

        var filrread = File.ReadAllLines(@"D:\\collar.obj");
       //var filrread = File.ReadAllLines(@"D:\\Box.obj");
       // var filrread = File.ReadAllLines(@"D:\\boxxxx.obj");

        var ctmName = filrread.Where(x => x.Contains("object")).Select(x => x.Split(' ')[2]).FirstOrDefault();

        var vcount = Convert.ToInt32(filrread.Where(x => x.Contains("vertices")).Select(x => x.Split(' ')[1]).FirstOrDefault())*3;
        var vncount = Convert.ToInt32(filrread.Where(x => x.Contains("normals")).Select(x => x.Split(' ')[1]).FirstOrDefault())*3;
        var vtcount = Convert.ToInt32(filrread.Where(x => x.Contains("texture")).Select(x => x.Split(' ')[1]).FirstOrDefault())*3;

        var fcount = Convert.ToInt32(filrread.Where(x => x.Contains("triangles")).Select(x => x.Split(' ')[4]).FirstOrDefault());

        var v = filrread.Where(x => x.StartsWith("v ")).Select(x => x.Replace("v  ", string.Empty).Split(' ').ToList()).ToList();
        var vn = filrread.Where(x => x.StartsWith("vn ")).Select(x => x.Replace("vn ", string.Empty).Split(' ').ToList()).ToList();
        var vt = filrread.Where(x => x.StartsWith("vt ")).Select(x => x.Replace("vt ", string.Empty).Split(' ').ToList()).ToList();

        var f = filrread.Where(x => x.StartsWith("f ")).Select(x => x.Replace("f ", string.Empty).TrimEnd().Split(' ').ToList().Select(ac => ac.Split('/')[0])).ToList();

        List<float> vertex = new List<float>();
        List<float> normal = new List<float>();
        List<float> uv = new List<float>();
        List<int> index = new List<int>();

        int cnt = 0;
        foreach (var item in v)
        {
            foreach (var itemList in item)
            {
                vertex.Add(Convert.ToSingle(itemList));
                //normal.Add(cnt);
                //uv.Add(cnt);
                //cnt++;
            }
        }

        foreach (var item in vn)
        {
            foreach (var itemList in item)
            {
                normal.Add(Convert.ToSingle(itemList));
            }
        }

        foreach (var item in vt)
        {
            //foreach (var itemList in item)
            for (int i = 0; i < item.Count - 1; i++)
            {
                //uv.Add(Convert.ToSingle(itemList[i]));
                uv.Add(Convert.ToSingle(item[i]));
            }
        }

        foreach (var item in f)
        {
            foreach (var itemList in item)
            {
                index.Add(Convert.ToInt32(itemList)-1);  // remove -1 For Face adjustment
            }
        }

        //if (vertex.Count == vcount && normal.Count == vncount && uv.Count == (vtcount-vt.Count) && f.Count == fcount)
        {

            vert = vertex.ToArray();
            normals = normal.ToArray();
            AttributeData ad = new AttributeData(ctmName, "1", AttributeData.STANDARD_UV_PRECISION, uv.ToArray());
            List<AttributeData> adlist = new List<AttributeData>();
            adlist.Add(ad);
            ind = index.ToArray();

            quad = new Mesh(vert, normals, ind, adlist.ToArray(), new AttributeData[0]);
        }


        p.mg2Test();
    }
}

} collar.obj.txt `

mayurdp313 avatar Jul 11 '19 10:07 mayurdp313