예제 #1
0
        static void ExportRoutine(string sourceFile,string targetFile)
        {
            //Load src file
            DMC4Model mdl = new DMC4Model();
            mdl.LoadModel(sourceFile);

            //Convert
            WavefrontModel convertedMdl = WavefrontModel.FromDMC4Model(mdl);
            convertedMdl.SaveModel(targetFile);
        }
        public static WavefrontModel FromDMC4Model(DMC4Model model)
        {
            WavefrontModel convertedModel = new WavefrontModel();
            float3[] vertices = new float3[model.Vertices.Length];
            float3[] normals = new float3[model.Vertices.Length];
            float3[] texcoords = new float3[model.Vertices.Length];
            for (int i = 0; i < model.Vertices.Length; i++)
            {
                vertices[i] = new float3((float)model.Vertices[i].Position.X / (float)model.Vertices[i].Position.W,
                    (float)model.Vertices[i].Position.Y / (float)model.Vertices[i].Position.W,
                    (float)model.Vertices[i].Position.Z / (float)model.Vertices[i].Position.W);
                normals[i] = new float3((float)model.Vertices[i].Normals.X / (float)model.Vertices[i].Normals.W,
                    (float)model.Vertices[i].Normals.Y / (float)model.Vertices[i].Normals.W,
                    (float)model.Vertices[i].Normals.Z / (float)model.Vertices[i].Normals.W);
                texcoords[i] = new float3((float)model.Vertices[i].TEXCOORD0.X / (float)short.MaxValue,
                    (float)model.Vertices[i].TEXCOORD0.Y / (float)short.MaxValue,
                    0.0f);

            }
            short[] tris = new short[model.Triangles.Length];
            for (int i = 0; i < model.Triangles.Length; i++)
            {
                tris[i] = (short)(model.Triangles[i] + 1);//Triangle indexing in Wavefront starts from 1
            }
            //Remap vertices (denormalization)
            foreach (var vertex in vertices)
            {
                vertex.X = vertex.X * (model.MaxBoundingbox.X - model.MinBoundingbox.X) + model.MinBoundingbox.X;
                vertex.Y = vertex.Y * (model.MaxBoundingbox.Y - model.MinBoundingbox.Y) + model.MinBoundingbox.Y;
                vertex.Z = vertex.Z * (model.MaxBoundingbox.Z - model.MinBoundingbox.Z) + model.MinBoundingbox.Z;
            }

            convertedModel.Vertices = vertices;
            convertedModel.Normals = normals;
            convertedModel.TextureCoordinates = texcoords;
            convertedModel.Triangles = tris;

            return convertedModel;
        }