Python bindings for xatlas
Project Links
Meta
Author: Markus Worchel
Requires Python: >=3.8
Classifiers
Python bindings for xatlas
(Unofficial) Python bindings for xatlas, a library that generates texture coordinates for triangle meshes.
Installation
From source
git clone --recursive https://github.com/mworchel/xatlas-python.git
pip install ./xatlas-python
Using Pip
pip install xatlas
Usage
Parametrize a mesh and export it
import trimesh
import xatlas
# We use trimesh (https://github.com/mikedh/trimesh) to load a mesh but you can use any library.
mesh = trimesh.load_mesh("input.obj")
# The parametrization potentially duplicates vertices.
# `vmapping` contains the original vertex index for each new vertex (shape N, type uint32).
# `indices` contains the vertex indices of the new triangles (shape Fx3, type uint32)
# `uvs` contains texture coordinates of the new vertices (shape Nx2, type float32)
vmapping, indices, uvs = xatlas.parametrize(mesh.vertices, mesh.faces)
# Trimesh needs a material to export uv coordinates and always creates a *.mtl file.
# Alternatively, we can use the `export` helper function to export the mesh as obj.
xatlas.export("output.obj", mesh.vertices[vmapping], indices, uvs)
# Both `xatlas.parametrize` and `xatlas.export` also accept vertex normals
Parametrize multiple meshes using one atlas
mesh1 = trimesh.load_mesh("input1.obj")
mesh2 = trimesh.load_mesh("input2.obj")
atlas = xatlas.Atlas()
atlas.add_mesh(mesh1.vertices, mesh1.faces)
atlas.add_mesh(mesh2.vertices, mesh2.faces)
# Optionally parametrize the generation with
# `xatlas.ChartOptions` and `xatlas.PackOptions`.
atlas.generate()
vmapping1, indices1, uvs1 = atlas[0]
vmapping2, indices2, uvs2 = atlas[1]
Repack multiple parametrized meshes into one atlas
vertices1, indices1, uvs1 = load_mesh_with_uvs("input1.obj")
vertices2, indices2, uvs2 = load_mesh_with_uvs("input2.obj")
atlas = xatlas.Atlas()
atlas.add_uv_mesh(uvs1, indices1)
atlas.add_uv_mesh(uvs2, indices2)
atlas.generate()
vmapping1, indices1, uvs1 = atlas[0]
vmapping2, indices2, uvs2 = atlas[1]
Query the atlas
atlas.mesh_count # Number of meshes
len(atlas) # Convenience binding for `atlas.mesh_count`
atlas.get_mesh(i) # Data for the i-th mesh
atlas[i] # Convenience binding for `atlas.get_mesh`
atlas.width # Width of the atlas
atlas.height # Height of the atlas
atlas.utilization # Utilization of the first atlas
atlas.get_utilization(i) # Utilization of i-th atlas
atlas.get_mesh_vertex_assignement(i) # Returns two arrays, with the atlas index and
# chart index of each vertex in the i-th mesh
atlas.get_mesh_chart_count(i) # Returns the number of charts of the i-th mesh
atlas.get_mesh_chart(i, j) # Returns the j-th chart of the i-th mesh
# The image requires passing custom PackOptions:
# pack_options = xatlas.PackOptions()
# pack_options.create_image = True
# atlas.generate(pack_options=pack_options)
atlas.chart_image # Debug image of the first atlas
atlas.get_chart_image(i) # Debug image of the i-th atlas
... # See xatlas documentation for all properties
License
The xatlas Python bindings are provided under a MIT license. By using, distributing, or contributing to this project, you agree to the terms and conditions of this license.
References
Test model taken from the ABC dataset
0.0.11
Jul 04, 2025
0.0.10
Apr 02, 2025
0.0.9
Feb 11, 2024
0.0.8
Aug 27, 2023
0.0.7
Dec 09, 2022
0.0.6
Oct 10, 2021
0.0.5
Jul 23, 2021
0.0.4
Jun 15, 2021
0.0.3
Feb 18, 2021
0.0.2
Feb 08, 2021
Wheel compatibility matrix
Files in release
xatlas-0.0.11-cp310-cp310-macosx_10_14_x86_64.whl (217.2KiB)
xatlas-0.0.11-cp310-cp310-macosx_11_0_arm64.whl (195.1KiB)
xatlas-0.0.11-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (261.7KiB)
xatlas-0.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (255.5KiB)
xatlas-0.0.11-cp310-cp310-musllinux_1_2_i686.whl (1.3MiB)
xatlas-0.0.11-cp310-cp310-musllinux_1_2_x86_64.whl (1.2MiB)
xatlas-0.0.11-cp310-cp310-win32.whl (180.3KiB)
xatlas-0.0.11-cp310-cp310-win_amd64.whl (201.4KiB)
xatlas-0.0.11-cp311-cp311-macosx_10_14_x86_64.whl (218.2KiB)
xatlas-0.0.11-cp311-cp311-macosx_11_0_arm64.whl (196.3KiB)
xatlas-0.0.11-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (262.3KiB)
xatlas-0.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (256.1KiB)
xatlas-0.0.11-cp311-cp311-musllinux_1_2_i686.whl (1.3MiB)
xatlas-0.0.11-cp311-cp311-musllinux_1_2_x86_64.whl (1.2MiB)
xatlas-0.0.11-cp311-cp311-win32.whl (181.3KiB)
xatlas-0.0.11-cp311-cp311-win_amd64.whl (201.9KiB)
xatlas-0.0.11-cp312-cp312-macosx_10_14_x86_64.whl (218.2KiB)
xatlas-0.0.11-cp312-cp312-macosx_11_0_arm64.whl (196.3KiB)
xatlas-0.0.11-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (262.1KiB)
xatlas-0.0.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (254.9KiB)
xatlas-0.0.11-cp312-cp312-musllinux_1_2_i686.whl (1.3MiB)
xatlas-0.0.11-cp312-cp312-musllinux_1_2_x86_64.whl (1.2MiB)
xatlas-0.0.11-cp312-cp312-win32.whl (181.5KiB)
xatlas-0.0.11-cp312-cp312-win_amd64.whl (203.0KiB)
xatlas-0.0.11-cp313-cp313-macosx_10_14_x86_64.whl (218.3KiB)
xatlas-0.0.11-cp313-cp313-macosx_11_0_arm64.whl (196.4KiB)
xatlas-0.0.11-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (261.9KiB)
xatlas-0.0.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (254.7KiB)
xatlas-0.0.11-cp313-cp313-musllinux_1_2_i686.whl (1.3MiB)
xatlas-0.0.11-cp313-cp313-musllinux_1_2_x86_64.whl (1.2MiB)
xatlas-0.0.11-cp313-cp313-win32.whl (181.5KiB)
xatlas-0.0.11-cp313-cp313-win_amd64.whl (203.0KiB)
xatlas-0.0.11-cp38-cp38-macosx_10_14_x86_64.whl (217.0KiB)
xatlas-0.0.11-cp38-cp38-macosx_11_0_arm64.whl (195.0KiB)
xatlas-0.0.11-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (261.4KiB)
xatlas-0.0.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (255.5KiB)
xatlas-0.0.11-cp38-cp38-musllinux_1_2_i686.whl (1.3MiB)
xatlas-0.0.11-cp38-cp38-musllinux_1_2_x86_64.whl (1.2MiB)
xatlas-0.0.11-cp38-cp38-win32.whl (180.2KiB)
xatlas-0.0.11-cp38-cp38-win_amd64.whl (201.0KiB)
xatlas-0.0.11-cp39-cp39-macosx_10_14_x86_64.whl (217.2KiB)
xatlas-0.0.11-cp39-cp39-macosx_11_0_arm64.whl (195.3KiB)
xatlas-0.0.11-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (261.9KiB)
xatlas-0.0.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (255.7KiB)
xatlas-0.0.11-cp39-cp39-musllinux_1_2_i686.whl (1.3MiB)
xatlas-0.0.11-cp39-cp39-musllinux_1_2_x86_64.whl (1.2MiB)
xatlas-0.0.11-cp39-cp39-win32.whl (180.5KiB)
xatlas-0.0.11-cp39-cp39-win_amd64.whl (208.2KiB)
xatlas-0.0.11-pp310-pypy310_pp73-macosx_10_15_x86_64.whl (217.3KiB)
xatlas-0.0.11-pp310-pypy310_pp73-macosx_11_0_arm64.whl (195.0KiB)
xatlas-0.0.11-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (261.6KiB)
xatlas-0.0.11-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (255.9KiB)
xatlas-0.0.11-pp310-pypy310_pp73-win_amd64.whl (200.9KiB)
xatlas-0.0.11-pp311-pypy311_pp73-macosx_10_15_x86_64.whl (218.5KiB)
xatlas-0.0.11-pp311-pypy311_pp73-macosx_11_0_arm64.whl (196.3KiB)
xatlas-0.0.11-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (262.5KiB)
xatlas-0.0.11-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (257.3KiB)
xatlas-0.0.11-pp311-pypy311_pp73-win_amd64.whl (201.6KiB)
xatlas-0.0.11-pp38-pypy38_pp73-macosx_10_14_x86_64.whl (216.9KiB)
xatlas-0.0.11-pp38-pypy38_pp73-macosx_11_0_arm64.whl (195.0KiB)
xatlas-0.0.11-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (261.7KiB)
xatlas-0.0.11-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (255.8KiB)
xatlas-0.0.11-pp38-pypy38_pp73-win_amd64.whl (200.8KiB)
xatlas-0.0.11-pp39-pypy39_pp73-macosx_10_15_x86_64.whl (217.2KiB)
xatlas-0.0.11-pp39-pypy39_pp73-macosx_11_0_arm64.whl (195.0KiB)
xatlas-0.0.11-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl (261.5KiB)
xatlas-0.0.11-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (255.8KiB)
xatlas-0.0.11-pp39-pypy39_pp73-win_amd64.whl (200.8KiB)
xatlas-0.0.11.tar.gz (7.4MiB)