aPyOpenGL is a Python version framework of aOpenGL for motion data processing and visualization.
Our framework is based on right-hand coordinate with y-axis as the up vector.

For Linux users, we provide a shell script that creates a conda environment in install.sh. You can modify the environment name by changing ENV_NAME in the script, which is set to env-apyopengl by default.
bash install.sh
For the visualization modules, install necessary modules first.
pip install -r requirements.txt
imageio_download_bin freeimage
Also, visit this perfect guide to install FBX SDK on your computer: Link for Windows
aPyOpenGL has four main modules agl, kin, transforms, and ops, and one additional auxiliary module utils. Example codes are in examples and you can run the code you want through:
python examples/{script_to_run}.py
If you add the path of this framework to the global environment variable, you can use this framework anywhere in your local computer.
Add this line to ~/.bashrc:
export PYTHONPATH=$PYTHONPATH:{path/to/aPyOpenGL}
and then execute this:
source ~/.bashrc
Add the path of the cloned repository to the environment variable PYTHONPATH. If you don't know how, please refer to this.
- F1: Render the scene in GL_FILL mode.
- F2: Render the scene in GL_LINE mode.
- F5: Capture the screen in image and save in
captures/yyyy-mm-dd/images. - F6: Capture the screen in video if entered once, and save in
captures/yyyy-mm-dd/videosif entered again. - Alt + Left Mouse: Tumble tool for the camera.
- Alt + Middle Mouse: Track tool for the camera.
- Alt + Mouse Scroll: Dolly tool for the camera.
- Mouse Scroll: Zoom tool for the camera.
- A: Switch the visualization of the axis.
- G: Switch the visualization of the grid.
- F: Switch the visualization of the render fps text.
- Left / Right arrow: Move 1 second to the past / future.
Additionally, you can add your own custom commands. You can find the examples in the codes in examples.
We provide BVH parser for motion data and FBX parser for both motion and mesh data. Motion data in this framework is basically structred by hierarchy of Joint, Skeleton, Pose, and Motion, and you can see the structure here.
transforms provides several operations for transformation in both numpy and pytorch.
Modules that start with n_ indicates that it's for numpy ndarray, and t_ indicates pytorch tensor.
utils provides several utility functions like multiprocessing.
We are planning to support motion manipulation functions, like kin namespace in aOpenGL. This will be updated soon!
Published papers developed on top of this framework are as follows:
- SALAD: Skeleton-aware Latent Diffusion for Text-driven Motion Generation and Editing [Hong et al. CVPR 2025]
- AnyMoLe: Any Character Motion In-betweening Leveraging Video Diffusion Models [Yun et al. CVPR 2025]
- ASMR: Adaptive Skeleton-Mesh Rigging and Skinning via 2D Generative Prior [Hong et al. Eurographics 2025]
- Geometry-Aware Retargeting for Two-Skinned Characters Interaction [Jang et al. SIGGRAPH Asia 2024]
- Long-term Motion In-Betweening via Keyframe Prediction [Hong et al. SCA2024]
The overall structure of the rendering modules is inspired by aOpenGL and LearnOpenGL
Data processing, operation functions, and utility functions are inspired by fairmotion, pytorch3d, PFNN, and LaFAN1 repositories