File size: 7,327 Bytes
0cf1ca0 77bc72c 0cf1ca0 77bc72c 45f0041 77bc72c 99ac109 77bc72c 45f0041 77bc72c 45f0041 77bc72c 45f0041 77bc72c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | ---
license: mit
pipeline_tag: image-to-3d
tags:
- 3d
- novel-view-synthesis
- triangle-splatting
- simulation
datasets:
- lhmd/re10k_torch
---
<h1 align="center">TriSplat: Simulation-Ready Feed-Forward 3D Scene Reconstruction</h1>
<p align="center">
<a href="https://arxiv.org/abs/2605.26115"><img src="https://img.shields.io/badge/Paper-B31B1B?style=for-the-badge&logo=arxiv&logoColor=white" alt="Paper"></a>
<a href="https://lhmd.top/trisplat"><img src="https://img.shields.io/badge/Project%20Page-000000?style=for-the-badge&logo=googlechrome&logoColor=white" alt="Project Page"></a>
<a href="https://github.com/ziplab/TriSplat"><img src="https://img.shields.io/badge/Code-181717?style=for-the-badge&logo=github&logoColor=white" alt="Code"></a>
<a href="https://huggingface.co/lhmd/TriSplat"><img src="https://img.shields.io/badge/Models-FFD21E?style=for-the-badge&logo=huggingface&logoColor=black" alt="Models"></a>
</p>
<p align="center">
<a href="https://lhmd.top/">Weijie Wang</a><sup>1,*</sup>
<a href="https://github.com/puLangMu">Zimu Li</a><sup>1,*</sup>
<a href="https://chuan-10.github.io/">Jinchuan Shi</a><sup>1</sup>
<a href="https://steve-zeyu-zhang.github.io/">Zeyu Zhang</a><sup>1</sup>
<a href="https://botaoye.github.io/">Botao Ye</a><sup>2,3</sup> <br />
<a href="https://people.inf.ethz.ch/~pomarc/">Marc Pollefeys</a><sup>2,4</sup>
<a href="https://donydchen.github.io/">Donny Y. Chen</a><sup>5</sup>
<a href="https://bohanzhuang.github.io/">Bohan Zhuang</a><sup>1</sup>
</p>
<p align="center">
<sup>1</sup>Zhejiang University
<sup>2</sup>ETH Zurich
<sup>3</sup>ETH AI Center
<sup>4</sup>Microsoft
<sup>5</sup>Monash University
</p>
<p align="center">
<img src="https://lhmd.top/trisplat/assets/images/teaser.jpg" alt="TriSplat teaser" width="100%">
</p>
TriSplat is a feed-forward 3D reconstruction model that predicts simulation-ready triangle meshes from sparse, unposed images. Unlike Gaussian-splatting pipelines that require post-hoc mesh extraction, TriSplat directly predicts oriented triangle primitives, camera poses, point maps, and appearance attributes in one forward pass. We train on RealEstate10K and DL3DV, and evaluate zero-shot generalization on ScanNet with RE10K-trained models.
## Method
<p align="center">
<img src="https://lhmd.top/trisplat/assets/figures/web/pipeline2.png" alt="TriSplat pipeline" width="100%">
</p>
Given sparse input views, TriSplat predicts dense local point maps, triangle attributes, camera poses, and optional intrinsics. Point-map geometry anchors triangle orientation through geometry normals, a learned normal refiner, and a monocular-normal bootstrap. A differentiable triangle rasterizer renders RGB, depth, and normals, while mesh export only needs opacity filtering, winding correction, and duplicate-vertex merging.
## Installation
Create the environment:
```bash
conda create -y -n trisplat python=3.10
conda activate trisplat
pip install --upgrade pip
```
Install PyTorch and Python dependencies:
```bash
pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 \
--index-url https://download.pytorch.org/whl/cu118
pip install -r requirements.txt --no-build-isolation
```
Build CUDA extensions:
```bash
bash scripts/env/rebuild_extensions.sh
```
Download initialization weights used by the model:
```bash
mkdir -p pretrained_weights
wget -O pretrained_weights/pi3.safetensors \
https://huggingface.co/yyfz233/Pi3/resolve/main/model.safetensors
wget -O pretrained_weights/omnidata_dpt_normal_v2.ckpt \
'https://zenodo.org/records/10447888/files/omnidata_dpt_normal_v2.ckpt?download=1'
```
## Models
Download released TriSplat checkpoints from [lhmd/TriSplat](https://huggingface.co/lhmd/TriSplat):
```bash
mkdir -p checkpoints
wget -O checkpoints/re10k_trisplat.ckpt \
https://huggingface.co/lhmd/TriSplat/resolve/main/re10k_trisplat.ckpt
wget -O checkpoints/dl3dv_trisplat.ckpt \
https://huggingface.co/lhmd/TriSplat/resolve/main/dl3dv_trisplat.ckpt
```
## Datasets
Packed `.torch` datasets default to:
```text
data/re10k
data/dl3dv
```
You can also set:
```bash
export RE10K_ROOT="$PWD/data/re10k"
export DL3DV_ROOT="$PWD/data/dl3dv"
```
## Training
Train on RealEstate10K:
```bash
bash scripts/train/train_re10k.sh --gpus 0,1,2,3,4,5,6,7 --wandb-mode offline
```
Train on DL3DV:
```bash
bash scripts/train/train_dl3dv.sh --gpus 0,1,2,3,4,5,6,7 --wandb-mode offline
```
Extra arguments after `--` are passed to Hydra. Use `--ckpt` to resume or initialize from a checkpoint.
## Evaluation
Evaluate and render RealEstate10K meshes:
```bash
bash scripts/eval/eval_re10k_mesh.sh \
--ckpt checkpoints/re10k_trisplat.ckpt \
--data-root "$RE10K_ROOT"
```
Evaluate and render DL3DV meshes:
```bash
bash scripts/eval/eval_dl3dv_mesh.sh \
--ckpt checkpoints/dl3dv_trisplat.ckpt \
--data-root "$DL3DV_ROOT"
```
## Simulation
TriSplat exports ordinary triangle meshes, so the output can be opened directly by common graphics and simulation tools. The evaluation scripts above write per-scene meshes under:
```text
outputs/<eval_root>/<run_name>/<scene>/mesh/DIRECT_triangle_mesh.ply
outputs/<eval_root>/<run_name>/<scene>/mesh/DIRECT_triangle_mesh.off
outputs/<eval_root>/<run_name>/<scene>/mesh/DIRECT_triangle_mesh_post.ply
outputs/<eval_root>/<run_name>/<scene>/mesh/DIRECT_triangle_mesh_post.off
```
The `_post` mesh is the default rendering and simulation output. It applies connected-component cleanup to the direct mesh, keeping the largest components and removing small disconnected floaters, unreferenced vertices, and degenerate triangles. For example, after running `scripts/eval/eval_re10k_mesh.sh`, use:
```bash
ls outputs/re10k_mesh_eval/re10k_mesh_eval/*/mesh/DIRECT_triangle_mesh_post.ply
```
The exported `_post.ply` mesh is vertex-colored and can be imported into [Blender](https://www.blender.org/), [Open3D](https://www.open3d.org/), [Isaac Sim](https://developer.nvidia.com/isaac/sim), [Unity](https://unity.com/), or [PyBullet](https://pybullet.org/) as a static triangle mesh. For simulation, use the `.ply` mesh for visual geometry and generate a collision mesh in your simulator if needed; for example, simplify or convex-decompose it before rigid-body simulation when the raw mesh is too dense.
## Citation
If you find this repository useful, please cite:
```bibtex
@article{wang2026trisplat,
title={TriSplat: Simulation-Ready Feed-Forward 3D Scene Reconstruction},
author={Wang, Weijie and Li, Zimu and Shi, Jinchuan and Zhang, Zeyu and Ye, Botao and Pollefeys, Marc and Chen, Donny Y. and Zhuang, Bohan},
journal={arXiv preprint arXiv:2605.26115},
year={2026}
}
```
## Acknowledgements
This codebase builds on open-source work including [YoNoSplat](https://github.com/justimyhxu/YoNoSplat), [MVSplat](https://github.com/donydchen/mvsplat), [pixelSplat](https://github.com/dcharatan/pixelsplat), [CroCo](https://github.com/naver/croco), [DINOv2](https://github.com/facebookresearch/dinov2), [Omnidata](https://github.com/EPFL-VILAB/omnidata), [3D Gaussian Splatting](https://github.com/graphdeco-inria/gaussian-splatting), and [Triangle Splatting](https://github.com/trianglesplatting/triangle-splatting). |