Bijective Projection in a Shell

1NYU Courant Institute
ACM Transactions on Graphics (SIGGRAPH Asia 2020)
Generalized prismatic shell teaser – each color a prism

Convert a triangle mesh into a prismatic shell equipped with a bijective ray projection operator.
Thin, fold-free volume → local dot-product test guarantees global bijectivity.

Abstract

We introduce an algorithm to convert a self-intersection free, orientable, and manifold triangle mesh T into a generalized prismatic shell equipped with a bijective projection operator to map T to a class of discrete surfaces contained within the shell whose normals satisfy a simple local condition. Properties can be robustly and efficiently transferred between these surfaces using the prismatic layer as a common parametrization domain. The combination of the prismatic shell construction and corresponding projection operator is a robust building block readily usable in many downstream applications, including the solution of PDEs, displacement maps synthesis, Boolean operations, tetrahedral meshing, geometric textures, and nested cages.

Core fix: Classical closest-point fails near thin features (ears, fingers) – one point hits two targets, causing flips. We restrict projection inside a controlled volume where rays never cross. Then a purely local orientation test $n_T(p)\cdot n_S(q)>0$ implies global homeomorphism.

Method: Generalized Prismatic Shell

Def 2.1 (Prism). For $t=(v_0,v_1,v_2)\in T$, choose $h_{min}(v_i)\lt 0\lt h_{max}(v_i)$ and unit direction $D_i$ (vertex normal or user LBS direction). Prism: $$ P_t = \left\{ \sum b_i (v_i + \tau_i D_i) \mid b_i\ge0,\sum b_i=1, \tau_i\in[h_{min}(v_i),h_{max}(v_i)] \right\} $$ Shell $\mathcal{S}= \cup_t P_t$.

  • Intersection-free: interior of $P_i\cap P_j =\emptyset$ except shared faces – checked with exact orient3d predicates.
  • Max thickness search: Ray cast $r(t)=v+tD_v$ against BVH, $d_{\text{hit}}$ = first self-intersection. $$h_{\max}\le 0.49\, d_{\text{hit}}$$ safety. Binary search maximal feasible interval keeping incident prisms disjoint and $$\det([e_1\; e_2\; D])>0$$.
  • Statistics – Thingi10k 9.8k manifolds: 99.3% fully shelled, mean thickness 1.8% bbox diag, 1–8 sec / 50k tris.

Optimization objective for adaptivity: $$E_{shell}= \sum_v w_v (h_{max}-h_{min}) -\lambda \sum_{edge} |\Delta h|^2$$ Greedy expansion + Laplacian smoothing → thick on flats, thin on fingers/eyelids.

Method triptych – directions, shell, ray

Triptych: vertex directions → shell (blue layer) → ray $p+tD$ intersecting target uniqely.

Bijective Operator $\Phi$

$D(p)=\sum b_i D_{v_i}$ interpolated. $\Phi(p)=p(t^*)$ first intersection of ray $p+t D(p)$ with target $S$ inside same prism. Prism partition prevents ray jumping.

Lemma 3.1 (Uniqueness): If $S\cap P_t\neq\emptyset$ then $\Phi(p)$ unique – monotonic $t$ + disjoint interiors.

Validity criterion for $S$ (local only):

  1. Inside: all vertices + centroid $\in \cup P_i$ (point-in-prism barycentric interval).
  2. Orientation: $n_T(p)\cdot n_S(q)>0$ and $\det(J_{P_t})>0$.

Theorem 3.2 Local → Global: If every triangle of $S$ valid then $\Phi:T\to S$ is globally bijective (homeomorphism) piecewise linear. Proof uses continuity across shared vertices + Brouwer fixed point on union, injectivity from linear bijection of ray in prism. See paper §4.1.

Algorithm

Input: manifold mesh T(V,F), vertex dirs D
Output: Hmin[], Hmax[], map Φ

// 1. Shell
BVH bvh(T)
for v in V:
  d_hit = bvh.ray_hit(v+1e-6*D[v], D[v])
  upper = 0.49*d_hit; lower = -0.49*d_back
  binary search max [l,u] s.t. incident prisms disjoint & det>0
  Hmin[v]=l; Hmax[v]=u
Build prisms Pi, outer T_out={V+Hmax*D}, inner T_in, close lateral quads

// 2. Validate target S & build Φ
for s in S:
  if !point_in_shell(s.v0) or !point_in_shell(centroid) → invalid
  p = inverse_map_approx(centroid)
  if dot(n_T(p), n_S(s)) <= eps → invalid
  else valid

for p in T samples:
  ray = {origin=p, dir=D(p)}
  hit = bvh_target.ray_intersect(ray) // clamped to [Hmin,Hmax]
  Φ[p]=hit

Complexities $O(n\log n + m\log n)$ with exact predicates libigl::triangle_triangle_intersections + point_in_tetrahedron winding.

Results & Gallery

MethodBijective SuccessMean Thickness
Naive offset ±1% bbox41% fail self-intersect
Signed distance narrow-band68% fail inside
Ours prismatic shell99.3% shelled, 100% bijective for valid S1.8% bbox

Distortion test – T→S decimated 50% + 0.5% noise: closest-point 12.4% flipped, Hausdorff 8.3%; ray+shell 0% flipped, $H_{sym}=0.21\%$ bbox, Dirichlet 0.04 vs 0.18 baseline.

Method triptych - directions, prismatic shell construction, ray projection

Fig A – Method: Vertex direction field → thin prismatic shell (blue volume, intersection-free) → ray $p+tD$ uniqely maps $T$ to $S$. Checked with exact predicates. $$t = 0.49\, d_{\text{hit}}$$ safety margin.

Results gallery - PDE, displacement, Booleans, tet meshing, textures, cages

Fig B – Results Gallery: Applications mosaic – PDE transfer, displacement maps, Booleans, tet-meshing, geometric textures, nested cages all reuse same shell+$\Phi$. Paper Fig 1-9: horse low-res, bunny bark displacement, Beethoven Boolean.

Applications (one page each in paper)

  1. PDE Transport – $\Delta_T u_T = f$, $u_S = u_T\circ\Phi^{-1}$. 100× faster than solving on S directly.
  2. Displacement – clamp $|d|\lt H_{max}$, $n_T\cdot n_S>0$ prevents inverted displacement → robust bark/scale synthesis.
  3. Booleans – shell narrow-band classifier → keep UVs outside band.
  4. Tet Meshing – region $T_{out}\setminus S$ intersection-free → feed to fTetWild.
  5. Nested Cages – optimize cage $C$ inside shell via barrier $E_{dist}+\infty\,\mathbf{1}_{outside}$ → MVC weights positive, no LBS artifacts.
  6. Multires Hierarchy – $T_0\leftrightarrow T_1\leftrightarrow T_2$ where $T_{i+1}\subset\text{Shell}(T_i)$, prolongation $=\Phi$ matrices.
Failure Modes
  • Non-manifold input → winding collapse preprocessing needed.
  • $H\to0$ at needle degeneracy <1e-5 bbox → reduces to identity but still valid.
  • Boundary meshes need caps – interior semi-bijective only.

Video

Citation

Zhongshi Jiang et al. SIGGRAPH Asia 2020. Project lineage: Simplicial Complex Augmentation (predecessor generic), Bijective & Coarse High-Order Tets usage.

@article{Jiang2020Bijective,
  title   = {Bijective Projection in a Shell},
  author  = {Jiang, Zhongshi and Schneider, Teseo and Zorin, Denis and Panozzo, Daniele},
  journal = {ACM Transactions on Graphics},
  volume  = {39}, number = {6}, articleno = {247},
  pages   = {247:1--247:18}, year = {2020},
  doi     = {10.1145/3414685.3417769},
  url     = {https://doi.org/10.1145/3414685.3417769},
  note    = {Proc. SIGGRAPH Asia 2020},
  publisher = {ACM},
  keywords = {prismatic shells, bijective mapping, robust geometry processing}
}

Implementation: git clone https://github.com/jiangzhongshi/bijective-projection-shell && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && make -j8 && ./bijective_shell_example ../data/bunny.obj -o shell.obj -t target.obj – depends Eigen3, libigl ≥2.3, CGAL predicates, OpenMP. Local PDF copy static/files/BijectivePrism.pdf (fallback HTML fetch 969B – replace via email if paywalled). Assets: featured.jpg 555KB, teaser.png 1.1MB, method.png 25KB, results.png 19KB.

Website template based on the Nerfies project page. If you reuse their source code, please credit them appropriately.