Package: impasse
ImpasseA simple Python wrapper forassimpusingcffito access the library.
Requires Python >= 3.7.It's a fork ofPyAssimp,
Assimp's official Python port. In contrast to PyAssimp, it strictly targets modern Python 3 and
provides type hints. It also aims to allow mutating scenes before exporting by having
all wrapper classes operate directly on the underlying C data structures.UsageComplete example: 3D viewerimpassecomes with a simple 3D viewer that shows how to load and display a 3D
model using a shader-based OpenGL pipeline.To use it:python./scripts/3d_viewer.py<pathtoyourmodel>You can use this code as starting point in your applications.Writing your own codeTo get started withimpasse, examine the simplersample.pyscript inscripts/,
which illustrates the basic usage. All Assimp data structures are wrapped usingctypes. All the data+length fields in Assimp's data structures (such asaiMesh::mNumVertices,aiMesh::mVertices) are replaced by list-like wrapper classes,
so you can calllen()on them to get their respective size and access
members using[].For example, to load a file namedhello.3dsand print the first
vertex of the first mesh, you would do (proper error handling
substituted by assertions ...):fromimpasseimportloadscene=load('hello.3ds')assertlen(scene.meshes)mesh=scene.meshes[0]assertlen(mesh.vertices)print(mesh.vertices[0])Another example to list the 'top nodes' in a
scene:fromimpasseimportloadscene=load('hello.3ds')forcinscene.root_node.children:print(str(c))All of assimp's coordinate classes are returned as NumPy arrays, so you can
work with them using library for 3d math that handles NumPy arrays. Using transforms.py
to modify the scene:importmathimportnumpyimporttransformationsimportimpasse# assimp returns an immutable scene, we have to copy it if we want to change itscene=impasse.load('hello.3ds').copy_mutable()transform=scene.root_node.transformation# Rotate the root node's transform by 180 deg on Xtransform=numpy.dot(transformations.rotation_matrix(math.pi,(1,0,0)),transform)scene.root_node.transformation=transformimpasse.export(scene,'whatever.obj','obj')InstallingInstallimpasseby running:pipinstallimpasseor, if you want to install from the source directory:pipinstall-e.Impasse requires an assimp dynamic library (DLLon Windows,.soon linux,.dynlibon macOS) in order to work. The default search directories are:the current directoryon linux additionally:/usr/lib,/usr/local/lib,/usr/lib/<CPU_ARCH>-linux-gnuTo build that library, refer to the Assimp masterINSTALLinstructions. To look in more places, edit./impasse/helper.py.
There's anadditional_dirslist waiting for your entries.ProgressAll features present in PyAssimp are now present in Assimp (plus a few more!) Since the API
largely mirrors PyAssimp's, most existing code should work in Impasse with minor changes.Note that Impasse is not complete. Many assimp features are still missing, mostly around mutating
scenes. Notably, anything that would require anewordeletein assimp's C++ API is not supported.PerformanceImpasse tries to avoid unnecessary copies or conversions of data owned by C, and most classes
are just thin layers around the underlying CFFI structs. NumPy arrays that directly map to the
underlying structs' memory are used for the coordinate structs likeMatrix4x4andVector3D.Testing with a similarquicktest.pyscript against assimp's test model directory:Impasse** Loaded 169 models, got controlled errors for 28 files, 0 uncontrolled

real	0m1.460s
user	0m1.676s
sys	0m0.571sPyAssimp** Loaded 165 models, got controlled errors for 28 files, 4 uncontrolled

real	0m7.607s
user	0m7.746s
sys	0m0.579s