public MyObject(Lib3dsMesh _node, Lib3dsFile _model)
            {
                this.node  = _node;
                this.model = _model;

                if (_node.faces == null || _node.faces.Count == 0)
                {
                    this.Flag = false;
                }
                else
                {
                    this.Flag       = true;
                    this.Normalizes = new Lib3dsVertex[_node.faces.Count];

                    for (int i = 0; i < _node.faces.Count; i++)
                    {
                        Lib3dsFace   face   = _node.faces[i];
                        Lib3dsVertex Point1 = _node.vertices[face.index[0]];
                        Lib3dsVertex Point2 = _node.vertices[face.index[1]];
                        Lib3dsVertex Point3 = _node.vertices[face.index[2]];

                        this.Normalizes[i] = CreateNormalize(Point1, Point2, Point3);
                    }
                }
            }
        /// <summary>
        /// Caltulate the normalize line of a face.
        /// </summary>
        /// <param name="p1">Vertex 1</param>
        /// <param name="p2">Vertex 2</param>
        /// <param name="p3">Vertex 3</param>
        /// <returns>Normalized Vertex</returns>
        private Lib3dsVertex CreateNormalize(Lib3dsVertex p1, Lib3dsVertex p2, Lib3dsVertex p3)
        {
            Lib3dsVertex v1  = new Lib3dsVertex();
            Lib3dsVertex v2  = new Lib3dsVertex();
            Lib3dsVertex rnt = new Lib3dsVertex();

            v1.x = (p1.x - p3.x);
            v1.y = (p1.y - p3.y);
            v1.z = (p1.z - p3.z);

            v2.x = (p3.x - p2.x);
            v2.y = (p3.y - p2.y);
            v2.z = (p3.z - p2.z);

            rnt.x = v1.y * v2.z - v1.z * v2.y;
            rnt.y = v1.z * v2.x - v1.x * v2.z;
            rnt.z = v1.x * v2.y - v1.y * v2.x;

            return(rnt);
        }
Esempio n. 3
0
        //写3DS文件
        protected virtual bool writeToFile()
        {
            if (mDbVertices == null || mDbTextureCoors == null || uFacesIndex == null)
            {
                return(false);
            }

            //新建LIB3DS文件对象
            Lib3dsFile file = LIB3DS.lib3ds_file_new();

            file.frames = 360;

            //新建网格节点
            Lib3dsMesh             mesh = LIB3DS.lib3ds_mesh_new("mesh");
            Lib3dsMeshInstanceNode inst;

            LIB3DS.lib3ds_file_insert_mesh(file, mesh, -1);

            //一、将顶点写入网格
            int nVertices = mDbVertices.GetLength(0);

            LIB3DS.lib3ds_mesh_resize_vertices(mesh, (ushort)nVertices, true, false);
            for (int i = 0; i < nVertices; i++)
            {
                Lib3dsVertex vertexTmp = new Lib3dsVertex(mDbVertices[i, 0], mDbVertices[i, 1], mDbVertices[i, 2]);
                LIB3DS.lib3ds_vector_copy(mesh.vertices[i], vertexTmp);

                //将纹理坐标写入网格
                mesh.texcos[i] = new Lib3dsTexturecoordinate(mDbTextureCoors[i, 0], mDbTextureCoors[i, 1]);
            }

            //二、将纹理信息写入文件
            Lib3dsMaterial mat = LIB3DS.lib3ds_material_new("material1");

            LIB3DS.lib3ds_file_insert_material(file, mat, -1);

            //如果没有指定纹理,则默认为灰色材质
            if (String.IsNullOrEmpty(mSzTextureFilename))
            {
                mat.diffuse[0] = 0.5f;
                mat.diffuse[1] = 0.5f;
                mat.diffuse[2] = 0.5f;
            }
            else
            {
                mat.texture1_map.name    = mSzTextureFilename;
                mat.texture1_map.percent = 1.0f;
            }

            //三、将三角化后的面的顶点索引号写入网格
            int nFaces = uFacesIndex.GetLength(0);

            LIB3DS.lib3ds_mesh_resize_faces(mesh, (ushort)nFaces);
            for (int i = 0; i < nFaces; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    mesh.faces[i].index[j] = uFacesIndex[i, j];
                }

                //指定每个三角化后的面的材质
                mesh.faces[i].material = 0;
            }

            inst = LIB3DS.lib3ds_node_new_mesh_instance(mesh, "01", null, null, null);
            LIB3DS.lib3ds_file_append_node(file, inst, null);

            if (!LIB3DS.lib3ds_file_save(file, mSzOutputFilename))
            {
                LIB3DS.lib3ds_file_free(file);
                return(false);
            }

            LIB3DS.lib3ds_file_free(file);
            return(true);
        }