Scaling Versatile 3D Assets Editing with a Million-Scale Dataset
Badi Li1,2,4, Tianxin Huang1, Yu Zhou3, Wei-Shi Zheng2,4, Yi Ma1,2, Shenghua Gao1,2†
1 The University of Hong Kong
2 Shenzhen Loop Area Institute
3 Shanghai Innovation Institute
4 Sun Yat-Sen University
† Corresponding author
Alchemy3D is a strong baseline model for editing existing assets while preserving identity and structure.
We also release Alchemy3D-1M (1.25M unique assets, 1.38M edit pairs, 7 edit types) and GEdit3D-Bench. For evaluation, including several baselines, would be released at a separate repo: edit3dstudio.
One model family covers six editing types on assets: Addition, Removal, Replacement, Local/Global Appearance, Animations.
Model Variants also support 3D Part Segmentation, given 1-8 number of 2D segmentation maps.
- Pretrained Checkpoints & Inference Code
- Datasets and Benchmarks
- Pipelines for automatically produce 2D segmentation maps for Alchemy3D-Segment
- Training code
- Evaluation codes would be released at (edit3dstudio)
The environmental setup is largely adopted from TRELLIS.2. For users who already have environment ready for TRELLIS.2, you may directly test the models. Otherwise you may follow the instruction to prepare the environment.
- System: tested on Linux
- Hardware: NVIDIA GPU. 24GB is a practical minimum; H200 are the verified class
git clone https://github.com/libd1/Alchemy3D.git
cd Alchemy3D--new-env creates conda env alchemy3d with PyTorch 2.6.0 + CUDA 12.4. To reuse an existing env, drop --new-env. If several CUDA toolkits are installed, set CUDA_HOME first, e.g. export CUDA_HOME=/usr/local/cuda-12.4.
. ./setup.sh --new-env --basic --flash-attn --nvdiffrast --nvdiffrec --cumesh --o-voxel --flexgemm --blenderUsage: setup.sh [OPTIONS]
--new-env Create conda environment `alchemy3d`
--basic Core Python dependencies
--flash-attn flash-attention
--cumesh CuMesh
--o-voxel O-Voxel
--flexgemm FlexGEMM
--nvdiffrast nvdiffrast
--nvdiffrec nvdiffrec
--blender download blender
GPUs without flash-attn (e.g. V100): install xformers and set ATTN_BACKEND=xformers. If Hugging Face is unreachable, use the ModelScope IDs below; loading falls back automatically.
The setup.sh download blender binary if --blender set, in this case, you are to set the blender path with export BLENDER_PATH="$PWD/blender-4.3.2-linux-x64/blender" everytime running.
We release model weights on both Huggingface and ModelScope
| Model | Description | Hugging Face | ModelScope |
|---|---|---|---|
| Alchemy3D | Primary Model | libadi/Alchemy3D | libd55/Alchemy3D |
| Alchemy3D-Turbo | Step-distilled Version | libadi/Alchemy3D-Turbo | libd55/Alchemy3D-Turbo |
| Alchemy3D-Flux | Flux2 Encoder in place of DINOv3 for PBR Editing | libadi/Alchemy3D-Flux | libd55/Alchemy3D-Flux |
| Alchemy3D-Instruct | Instruction-driven Variant | libadi/Alchemy3D-Instruct | libd55/Alchemy3D-Instruct |
| Alchemy3D-Segment | Downstream Part Segmentation Model | libadi/Alchemy3D-Segment | libd55/Alchemy3D-Segment |
Examples live under assets/examples/edits/ and assets/examples/segment/.
See example.py. Alternatives: libadi/Alchemy3D-Turbo, libadi/Alchemy3D-Flux (or the ModelScope IDs above).
from alchemy3d.pipelines import Pipeline
import o_voxel
pipe = Pipeline.from_pretrained(model_name_or_path="libadi/Alchemy3D")
pipe.cuda()
output = pipe.run(
source="./assets/examples/edits/01/source.glb",
image="./assets/examples/edits/01/target_image.png",
comparison_video="example.mp4",
)[0]
glb = o_voxel.postprocess.to_glb(
vertices=output.vertices,
faces=output.faces,
attr_volume=output.attrs,
coords=output.coords,
attr_layout=output.layout,
voxel_size=output.voxel_size,
aabb=[[-0.5, -0.5, -0.5], [0.5, 0.5, 0.5]],
decimation_target=1_000_000,
texture_size=4096,
remesh=True,
remesh_band=1,
remesh_project=0,
verbose=False,
)
glb.export("example.glb")See example-instruct.py.
from alchemy3d.pipelines import Alchemy3DInstructPipeline
pipe = Alchemy3DInstructPipeline.from_pretrained("libadi/Alchemy3D-Instruct")
pipe.cuda()
instruction = open("./assets/examples/edits/01/instruction.txt").read()
output = pipe.run(
source="./assets/examples/edits/01/source.glb",
instruction=instruction,
comparison_video="example-instruct.mp4",
)[0]See example-segment.py.
from alchemy3d.pipelines import Alchemy3DSegmentPipeline
pipe = Alchemy3DSegmentPipeline.from_pretrained("libadi/Alchemy3D-Segment")
pipe.cuda()
images = [
"./assets/examples/segment/01/instance/002.png",
"./assets/examples/segment/01/instance/003.png",
]
meshes, preds = pipe.run(
source="./assets/examples/segment/01/source.glb",
image=[images],
return_label=True,
comparison_video="example-segment.mp4",
)| Resource | What it is | Links |
|---|---|---|
| Alchemy3D-1M | 1.25M assets, 1.38M pairs, 7 edit types | HF · ModelScope |
| GEdit3D-Bench | Open-world edit benchmark | HF · ModelScope |
| edit3dstudio | Evaluation code and baselines | GitHub |
Alchemy3D stands on TRELLIS.2 (Native and Compact Structured Latents for 3D Generation, Xiang et al., Microsoft).
We also thanks the contribution of several baselines methods/models: VoxHammer, Nano3D, AnchorFlow, 3DEditFormer, PartFlow etc.
Alchemy3D code is released under the Apache License 2.0.
O-Voxel is installed from TRELLIS.2 and remains under the MIT License © Microsoft Corporation. Other dependencies have their own terms:
@misc{li2026scalingversatile3dassets,
title={Scaling Versatile 3D Assets Editing with a Million-Scale Dataset},
author={Badi Li and Tianxin Huang and Yu Zhou and Wei-Shi Zheng and Yi Ma and Shenghua Gao},
year={2026},
eprint={2609.34271},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2609.34271},
}You may also consider citing TRELLIS.2 if you used Alchemy3D Model.

