# A High-Resolution Texture Mapping Technique for 3D Textured Model
## The Proposed Texture Mapping Method  
### Mesh Partitioning  
The purpose of mesh partitioning is to partition 3D meshes into several charts, where a chart denotes a group of meshes that are tightly connected to each other and form a boundary loop only. When a chart is mostly flat and compact in boundaries, it is easy to preserve the shape in mesh parameterization. By contrast, when a chart is bent too much or closed on both sides, that is, two boundary loops, the shape distortion in the mesh parameterization increases, thereby reducing the texture resolution in some regions. A conventional approach to dealing with this issue is to map each mesh on the 3D model onto the UV domain independently, which can accurately preserve the shape of all 2D meshes and pack them all tightly row by row [40]. However, this approach might result in an un-editable texture map, because all 2D meshes are independently projected and distributed irregularly. The proposed mesh partitioning technique essentially assigns a cost to each mesh, which denotes a mesh's weight calculated by considering the flatness and distance of the mesh with respect to a chart. An iterative procedure combining chart growth and seed mesh upgrades is implemented to expand and modify charts as well as seed meshes in sequence. The chart growth is a process to cluster all meshes into charts in accordance with each mesh's cost. When a closed chart is detected as possibly occurring, a new seed mesh is added to separate the chart into two. The seed mesh upgrading is a process to upgrade the seed mesh of each chart that has been expanded. Whenever a chart is grown, its seed mesh is recomputed by putting it near the center of the new chart. Two costs are defined and used in chart growth and seed mesh upgrading. The cost used in chart growth is defined as  
\[Cost1(F,\,F^{\prime})=\,(1-(\mathbf{N}_{\text{C}}\cdot\mathbf{N}_{F^{\prime}}))(|\mathbf{P} _{F^{\prime}}-\mathbf{P}_{F}|), \tag{1}\]  
where \(Cost1(F,\,F^{\prime})\) denotes the weight of a candidate mesh \(F^{\prime}\) neighboring a chart \(C\), \(F\) is the neighboring mesh of \(F^{\prime}\) that has been in \(C,\mathbf{N}_{C}\) is the normal vector of \(C\) evaluated by the average of all normal vectors of the meshes in \(C,\mathbf{N}_{F^{\prime}}\) is the normal vector of the candidate mesh, and \(\mathbf{P}_{F^{\prime}}\) and \(\mathbf{P}_{F}\) are the centroids of \(F^{\prime}\) and \(F\), respectively. Equation (1) indicates that the cost \(Cost1(F,\,F^{\prime})\) considers both the flatness and distance of \(F^{\prime}\) with respect to the chart \(C\). The cost used in seed mesh upgrading is defined as  
\[Cost2\big{(}F,\ F^{\prime}\big{)}=\big{|}\mathbf{P}_{F^{\prime}}-\mathbf{P}_{F}\big{|}, \tag{2}\]  
which is used to determine the mesh \(F\) that is closest to the candidate mesh \(F^{\prime}\). Figure 2 depicts the flowchart of the proposed mesh partitioning algorithm, which has three main steps: initial seed meshes, chart growth, and seed mesh upgrading. In step 1, a set of seed meshes are initially assigned on the input 3D meshes. A default value of 10 is typically used and the seed meshes are randomly selected from the 3D meshes. Each seed mesh is initially assigned as a chart. In step 2, chart growth, all meshes neighboring the charts are found by using the topological data of the mesh model. Equation (1) is then employed to evaluate a cost for each of these meshes. The costs are sorted from minimum to maximum. The mesh with the minimum cost is selected to cluster with its neighboring chart. Three criteria are then checked in sequence. First, is this chart (which has just grown) a single boundary loop? If yes, go to the next criterion. If not, a new seed mesh is added. The last mesh added to this chart is regarded as the new seed mesh. Second, are all meshes clustered into charts? If yes, go to the next criterion. If not, go back to the beginning of this step. Third, are all charts a single boundary loop? If yes, this step is finished. If not, go back to the beginning of this step.