<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>About Zhongshi</title><link>https://jiangzhongshi.github.io/</link><atom:link href="https://jiangzhongshi.github.io/index.xml" rel="self" type="application/rss+xml"/><description>About Zhongshi</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><copyright>Profile photo credit to Ria Zhang</copyright><lastBuildDate>Sat, 01 Jun 2030 13:00:00 +0000</lastBuildDate><image><url>https://jiangzhongshi.github.io/images/icon_hu0b7a4cb9992c9ac0e91bd28ffd38dd00_9727_512x512_fill_lanczos_center_3.png</url><title>About Zhongshi</title><link>https://jiangzhongshi.github.io/</link></image><item><title>Example Talk</title><link>https://jiangzhongshi.github.io/talk/example-talk/</link><pubDate>Sat, 01 Jun 2030 13:00:00 +0000</pubDate><guid>https://jiangzhongshi.github.io/talk/example-talk/</guid><description>&lt;div class="alert alert-note">
&lt;div>
Click on the &lt;strong>Slides&lt;/strong> button above to view the built-in slides feature.
&lt;/div>
&lt;/div>
&lt;p>Slides can be added in a few ways:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Create&lt;/strong> slides using Wowchemy&amp;rsquo;s &lt;a href="https://wowchemy.com/docs/managing-content/#create-slides" target="_blank" rel="noopener">&lt;em>Slides&lt;/em>&lt;/a> feature and link using &lt;code>slides&lt;/code> parameter in the front matter of the talk file&lt;/li>
&lt;li>&lt;strong>Upload&lt;/strong> an existing slide deck to &lt;code>static/&lt;/code> and link using &lt;code>url_slides&lt;/code> parameter in the front matter of the talk file&lt;/li>
&lt;li>&lt;strong>Embed&lt;/strong> your slides (e.g. Google Slides) or presentation video on this page using &lt;a href="https://wowchemy.com/docs/writing-markdown-latex/" target="_blank" rel="noopener">shortcodes&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>Further event details, including &lt;a href="https://wowchemy.com/docs/writing-markdown-latex/" target="_blank" rel="noopener">page elements&lt;/a> such as image galleries, can be added to the body of this page.&lt;/p></description></item><item><title>HyperBones: Realtime Bone-driven Neural Garment Simulation with Hypernetwork Conditioning</title><link>https://jiangzhongshi.github.io/publication/hyperbones/</link><pubDate>Mon, 18 May 2026 00:00:00 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/hyperbones/</guid><description/></item><item><title>Large-scale Codec Avatars: The Unreasonable Effectiveness of Large-scale Avatar Pretraining</title><link>https://jiangzhongshi.github.io/publication/large-scale-codec-avatars/</link><pubDate>Thu, 02 Apr 2026 00:00:00 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/large-scale-codec-avatars/</guid><description/></item><item><title>PhySkin: Physics-based Bone-driven Neural Garment Simulation</title><link>https://jiangzhongshi.github.io/publication/physkin/</link><pubDate>Sun, 15 Mar 2026 00:00:00 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/physkin/</guid><description/></item><item><title>MHR: Momentum Human Rig</title><link>https://jiangzhongshi.github.io/publication/mhr/</link><pubDate>Sat, 15 Nov 2025 00:00:00 -0500</pubDate><guid>https://jiangzhongshi.github.io/publication/mhr/</guid><description/></item><item><title>FRESA: Feedforward Reconstruction of Personalized Skinned Avatars from Few Images</title><link>https://jiangzhongshi.github.io/publication/fresa/</link><pubDate>Sat, 15 Mar 2025 00:00:00 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/fresa/</guid><description/></item><item><title>FaceMap: Distortion-Driven Perceptual Facial Saliency Maps</title><link>https://jiangzhongshi.github.io/publication/facemap/</link><pubDate>Fri, 15 Nov 2024 00:00:00 -0500</pubDate><guid>https://jiangzhongshi.github.io/publication/facemap/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
&lt;style>
.publication-title { font-variant-ligatures: none; }
.author-block { display:inline-block; margin: 0 6px; }
.publication-links .button { margin: 4px; }
.teaser-img { max-height:520px; object-fit:contain; border-radius:12px; box-shadow:0 10px 30px rgba(0,0,0,0.15); }
.message.is-info { border-radius:10px; }
.nerfies-section { padding-top:2rem; padding-bottom:1rem; }
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;!-- HERO TITLE -->
&lt;section class="hero">
&lt;div class="hero-body">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column has-text-centered">
&lt;h1 class="title is-1 publication-title">FaceMap: Distortion-Driven Perceptual Facial Saliency Maps&lt;/h1>
&lt;div class="is-size-5 publication-authors" style="margin-top:0.8rem;">
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io" style="text-decoration:underline; text-underline-offset:3px; font-weight:700; color:#363636;">Zhongshi Jiang&lt;/a>&lt;sup>*&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Kishore Venkateshan&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Giljoo Nam&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Meixu Chen&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Romain Bachy&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Jean-Charles Bazin&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://achapiro.github.io">Alexandre Chapiro&lt;/a>&lt;/span>
&lt;/div>
&lt;div class="is-size-6 publication-authors" style="margin-top:0.35rem;">
&lt;span class="author-block">&lt;sup>*&lt;/sup>Meta Reality Labs – first author,&lt;/span>
&lt;span class="author-block">&lt;sup>1&lt;/sup>Reality Labs Research, Sausalito CA &amp;amp; Redmond WA&lt;/span>
&lt;/div>
&lt;div class="is-size-7 has-text-grey" style="margin-top:0.2rem;">* Equal contribution shuffling? This work: first author. SIGGRAPH Asia 2024 Conference Paper #39 (TOG 9:4)&lt;/div>
&lt;div class="column has-text-centered" style="margin-top:1rem;">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="https://dl.acm.org/doi/10.1145/3680528.3687631" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Paper&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://achapiro.github.io/Jia24/Jia24.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="ai ai-acm">&lt;/i>&lt;/span>&lt;span>Author PDF&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://achapiro.github.io/Jia24/Jia24sup.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-lines">&lt;/i>&lt;/span>&lt;span>Suppl (13MB)&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="#" class="external-link button is-normal is-rounded is-dark is-outlined" onclick="document.getElementById('video').scrollIntoView({behavior:'smooth'}); return false;">
&lt;span class="icon">&lt;i class="fab fa-youtube">&lt;/i>&lt;/span>&lt;span>Video&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/facebookresearch/FaceMap" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code (pending)&lt;/span>
&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">CC BY-NC-ND 4.0&lt;/span>
&lt;/span>
&lt;span class="link-block">
&lt;a href="mailto:mhr@meta.com?subject=FaceMap%20Dataset" class="external-link button is-normal is-rounded is-dark is-light">
&lt;span class="icon">&lt;i class="far fa-images">&lt;/i>&lt;/span>&lt;span>Dataset (on-request)&lt;/span>
&lt;/a>
&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- TEASER HERO – wide 16:9 hero + rotating video row -->
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body has-text-centered" style="padding-top:1rem;">
&lt;img src="teaser.png" alt="FaceMap wide hero – single female head plus distortion sensitivity map eyes to cheeks" class="teaser-img" style="max-height:none; width:100%; max-width:1120px; aspect-ratio:16/9; object-fit:cover;" loading="eager"/>
&lt;p class="is-size-7 has-text-grey" style="margin-top:0.5rem;">Wide hero 1600×900 (16:9) – single female head left + distortion heatmap right. Front-page thumb remains &lt;code>featured.jpg&lt;/code> 800×900 single-subject.&lt;/p>
&lt;h2 class="subtitle has-text-centered" style="margin-top:1rem;">
&lt;strong>FaceMap&lt;/strong> learns where humans notice distortion and reallocates polys / texels / splats there – SROCC 0.82.
&lt;/h2>
&lt;div class="columns is-centered" style="margin-top:0.8rem;">
&lt;div class="column is-6">
&lt;div style="position:relative; padding-bottom:56.25%; height:0; overflow:hidden; border-radius:12px; background:#f5f5f5;">
&lt;div style="position:absolute; inset:0; display:flex; align-items:center; justify-content:center; flex-direction:column; border:2px dashed #bbb;">
&lt;i class="fas fa-play-circle" style="font-size:2.5rem; color:#888;">&lt;/i>
&lt;p class="is-size-6" style="margin-top:8px;">Rotating face compare – FaceMap vs uniform (5s loop)&lt;/p>
&lt;p class="is-size-7 has-text-grey">Front → +45° → Front @65K Gaussians – suppl Fig. 14-15 – wide hero keeps thumb clean&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-6 is-flex is-align-items-center">
&lt;div class="has-text-left">
&lt;p class="is-size-6">&lt;strong>Featured thumb preserved:&lt;/strong> &lt;code>featured.jpg&lt;/code> 800×900 portrait single female head – Wowchemy list &amp; front page single-subject.&lt;/p>
&lt;p class="is-size-7" style="margin-top:8px;">&lt;span class="tag is-info">16:9 wide&lt;/span> &lt;span class="tag is-success">1600×900&lt;/span> &lt;span class="tag is-light">~406KB&lt;/span> hero – no stretching of portrait thumb (featured.jpg kept separate).&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- ABSTRACT -->
&lt;section class="section nerfies-section">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;article class="message is-info">
&lt;div class="message-body">
&lt;strong>First distortion-driven perceptual metric for faces.&lt;/strong> Generic mesh saliency measures curvature, not tolerance. When a head is compressed to 5% triangles, 1K Gaussians, or 32² texture, &lt;em>where&lt;/em> does quality collapse? We capture human preferences via large-scale 2AFC Thurstonian scaling on 10 identities × 5 degradations × 3 views, decoupled into 64×64 overlapping patches (~48K pairs). ANOVA shows allocation method dominates identity (p=7.1e-65 remesh, 1.5e-21 GS) – face perception generalises. We fit a UV-space UNet (512² in → 256² saliency) anchored on 8 semantic UV points, randomised validation r=0.83 RMSE 0.242 JOD vs SD 0.209. Result: &lt;strong>SROCC 0.82 / PLCC 0.79&lt;/strong> vs Song'14 0.306/0.234, Nehmé'23 0.19/0.23 (weak per Schober). Eyes > wrinkles > mouth > nostrils > silhouette > cheeks cold, but identity-modulates. At 1% tris we beat uniform 98.6% pref, 91.8% at 4%, 75.4% at 16% → mobile sweet-spot. GS 1K: uniform blurs pupils, ours crisp. Texture quadtree saves ~40% leaves.
&lt;/div>
&lt;/article>
&lt;p>
Faces have a dedicated fusiform area – uniform LOD destroys eyes leaving teeth intact. FaceMap asks &lt;em>"where does distortion become noticeable?"&lt;/em> not "where is interesting". Industrial LODs for codec avatars need 5% geo / 128² textures – FaceMap provides the multiplier.
&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- TAXONOMY TABLE -->
&lt;section class="section nerfies-section" style="background:#fafafa;">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column is-full">
&lt;h2 class="title is-3 has-text-centered">Taxonomy – 10 Bases × 5 Distortions&lt;/h2>
&lt;div class="content">
&lt;p class="has-text-centered">&lt;strong>10 high-quality scanned heads&lt;/strong> (5 female /5 male, balanced ethnicity/age, ~30K tris face-only, 4K×4K albedo, 200K Gaussians ref) – adapted from Meta Realistic Head collection.&lt;/p>
&lt;table class="table is-bordered is-striped is-narrow is-hoverable is-fullwidth" style="font-size:0.9rem;">
&lt;thead>&lt;tr>&lt;th>Family&lt;/th>&lt;th>Type&lt;/th>&lt;th>Levels&lt;/th>&lt;th>Mechanism &amp; Prod. analogue&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Geometry&lt;/td>&lt;td>Mesh quantization&lt;/td>&lt;td>6 (30%→5% edge keep)&lt;/td>&lt;td>Quadric error + uniform; simulates runtime LOD / Draco quant&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Geometry&lt;/td>&lt;td>Laplacian smoothing&lt;/td>&lt;td>6 λ=0.05→0.5&lt;/td>&lt;td>Simulates low-LOD blur / skinning linear artifacts&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Texture&lt;/td>&lt;td>JPEG / Basis compressed&lt;/td>&lt;td>6 QF 5→90&lt;/td>&lt;td>Texel blockiness – streaming compression&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Texture&lt;/td>&lt;td>Low-res mip&lt;/td>&lt;td>256→32 downsample&lt;/td>&lt;td>Blurriness – texture streaming LOD&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Splats&lt;/td>&lt;td>Gaussian sparsity&lt;/td>&lt;td>5 262K→1K&lt;/td>&lt;td>3DGS decimation – mobile splat budget&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="columns is-centered">
&lt;div class="column is-10">
&lt;figure class="image">
&lt;img src="teaser.png" alt="Stimuli 10 bases x distortion levels wide hero" style="border-radius:10px;" loading="lazy"/>
&lt;figcaption class="has-text-centered is-size-7">Suppl Fig.14 – 10 bases × distortion levels wide hero composition (1600×900) – left head, right patches allocation eyes>wrinkles>mouth>cheeks. Single-subject featured.jpg remains 800×900.&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- PSYCHOPHYSICS METHOD -->
&lt;section class="section nerfies-section">
&lt;div class="container is-max-desktop">
&lt;h2 class="title is-3 has-text-centered">Psychophysics – Distort → Render → Patch → 2AFC → JOD&lt;/h2>
&lt;div class="columns">
&lt;div class="column is-6">
&lt;div class="content">
&lt;h3 class="title is-5">Stimuli &amp; Patching&lt;/h3>
&lt;ul>
&lt;li>3 views front 0°, left 45°, right 45° – studio HDRI + rim, 65cm 30° FoV 120 nits sRGB 2.2 D65 calibrated.&lt;/li>
&lt;li>Overlapping &lt;code>64×64&lt;/code> patches stride 32 – ~180 per view ~540 per condition – decouples head size &amp; background.&lt;/li>
&lt;li>Participants see &lt;em>patches only&lt;/em> vs reference patch, never full head during forced choice.&lt;/li>
&lt;/ul>
&lt;h3 class="title is-5" style="margin-top:1rem;">2AFC Thurstone&lt;/h3>
&lt;p>Which patch better vs reference? 200ms ISI, unlimited time, anchored slider "bad–excellent" per Madhusudana'21:&lt;/p>
&lt;ul>
&lt;li>Main: 10×5×6×3 = 900 base trials per participant via adaptive QUEST 100 subset.&lt;/li>
&lt;li>Remesh valid.: 4×6×3×3+12 = 228 trials avg 40 min.&lt;/li>
&lt;li>GS valid.: 10×5×2×2 = 100 trials avg 34 min (Fig.12/14).&lt;/li>
&lt;li>N=45+ main 18–42y normal/corrected, 2 outliers >3 MAD removed, gamma-corrected display 2560×1440 65ppd.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>JOD:&lt;/strong> 1 JOD = 75% pref in 2AFC = 0.675σ logistic – Fig.13 Thumb.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="column is-6">
&lt;figure class="image">
&lt;img src="method.png" alt="FaceMap pipeline method diagram – 1200x1160 padded" style="border-radius:10px; box-shadow:0 6px 20px rgba(0,0,0,0.12); max-width:100%; height:auto;" loading="lazy"/>
&lt;figcaption class="is-size-7 has-text-centered">Pipeline: distort mesh/tex/splats → 3-view render → patchify → crowd 2AFC → JOD → N-way ANOVA → UNet saliency. 842×814 original upscaled to 1200×1160 with 5% white padding to match hero width – no crop, readable labels.&lt;/figcaption>
&lt;/figure>
&lt;article class="message is-small is-link" style="margin-top:1rem;">
&lt;div class="message-header">&lt;p>N-way ANOVA – what matters?&lt;/p>&lt;/div>
&lt;div class="message-body" style="font-size:0.85rem;">
&lt;table class="table is-narrow">
&lt;tbody>
&lt;tr>&lt;td>distortion strength&lt;/td>&lt;td>&lt;span class="tag is-danger">p=1.8e-11&lt;/span>&lt;/td>&lt;td>Main dominant&lt;/td>&lt;/tr>
&lt;tr>&lt;td>distortion type&lt;/td>&lt;td>&lt;span class="tag is-warning">p=7.3e-8&lt;/span>&lt;/td>&lt;td>family matters&lt;/td>&lt;/tr>
&lt;tr>&lt;td>distortion location&lt;/td>&lt;td>&lt;span class="tag is-success">p=3.3e-4&lt;/span>&lt;/td>&lt;td>FaceMap works&lt;/td>&lt;/tr>
&lt;tr>&lt;td>method FaceMap vs uniform&lt;/td>&lt;td>&lt;span class="tag is-danger">p=1.5e-21 GS / 7.1e-65 remesh&lt;/span>&lt;/td>&lt;td>allocation strong!&lt;/td>&lt;/tr>
&lt;tr>&lt;td>model (identity)&lt;/td>&lt;td>&lt;span class="tag is-light">p=0.24 ns&lt;/span>&lt;/td>&lt;td>generalises ✅&lt;/td>&lt;/tr>
&lt;tr>&lt;td>participant&lt;/td>&lt;td>&lt;span class="tag is-info">p=3.8e-3&lt;/span>&lt;/td>&lt;td>small subj diff&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p class="is-size-7">Interpretation: strength + method dominate, not identity – FaceMap generalises across faces.&lt;/p>
&lt;/div>
&lt;/article>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- SALIENCY MODEL &amp; RESULTS -->
&lt;section class="section nerfies-section" style="background:#f8f8fe;">
&lt;div class="container is-max-desktop">
&lt;h2 class="title is-3 has-text-centered">Learning – Semantic Anchors → UNet Saliency&lt;/h2>
&lt;div class="columns is-centered">
&lt;div class="column is-5">
&lt;div class="content">
&lt;h3 class="title is-5">8 UV Landmarks Anchor&lt;/h3>
&lt;p>We define 8 semantic UV anchors (eye corners L/R, nose tip, mouth corners, chin bottom, forehead center) seed=6 box. Positions barycentrically interpolated to mean shape UV 512×512. Randomized validation Fig.20: picking 8 random points → Pearson r=0.83 with original, ρ=0.74 RMSE 0.242 JOD vs bootstrap SD 0.209 – robust, not overfit to anchor choice.&lt;/p>
&lt;h3 class="title is-5">Model&lt;/h3>
&lt;ul style="font-size:0.92rem;">
&lt;li>Input: 512² UV PE + mean curvature + albedo luminance&lt;/li>
&lt;li>Arch: 4-level UNet 32→256 ch GroupNorm, predicts 256² saliency map&lt;/li>
&lt;li>Loss: L2 vs empirical JOD + TV + symmetry bilateral regulariser&lt;/li>
&lt;li>Training: Adam 1e-3 200ep 10-fold leave-one-identity-out CV&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Accuracy 10-fold:&lt;/strong> SROCC 0.82 PLCC 0.79 RMSE 0.31 JOD&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="column is-7">
&lt;figure class="image">
&lt;img src="results.png" alt="SROCC scatter FaceMap 0.82 vs Song 0.306 – 1600x900 readable" style="border-radius:10px; max-width:100%;" loading="lazy"/>
&lt;figcaption class="is-size-7 has-text-centered">Fig.21 Correlation – 1600×900 scatter, axes 0.0–1.0 SROCC/PLCC, tight diagonal FaceMap predicted loss SROCC 0.82 / PLCC 0.79 vs Song'14 0.306/0.234 &amp; Nehmé'23 0.19/0.234 weak per Schober 2018 – labels 12pt preserved for readability.&lt;/figcaption>
&lt;/figure>
&lt;div class="notification is-light" style="margin-top:0.8rem; font-size:0.9rem;">
&lt;strong>Qualitative heat:&lt;/strong> eyes > eye wrinkles / crow's feet > mouth interior > nostrils > silhouette > cheeks/forehead cold. Yet cold spots identity-modulated – e.g., freckled cheeks slightly warmer, bearded chin moderate sensitivity.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- APPLICATIONS -->
&lt;section class="section nerfies-section">
&lt;div class="container is-max-desktop">
&lt;h2 class="title is-3 has-text-centered">Applications – Polys / Texels / Splats Reallocation&lt;/h2>
&lt;div class="columns is-centered">
&lt;div class="column is-10">
&lt;figure class="image">
&lt;img src="application.png" alt="Applications allocation polys texels splats – 2-row stacked 1400x1308" style="border-radius:12px; box-shadow:0 6px 20px rgba(0,0,0,0.1); width:100%; height:auto; object-fit:contain;" loading="lazy"/>
&lt;figcaption class="has-text-centered is-size-7" style="margin-top:0.4rem;">Applications: remesh / texture / GS reallocation – eyes &amp; mouth get 2–3× budget vs uniform. 1400×1308 stacked composite displayed 100% width with rounded corners &amp; shadow (Nerfies style).&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;div class="columns" style="margin-top:1rem;">
&lt;div class="column">
&lt;article class="message is-success">
&lt;div class="message-header">&lt;p>Remesh / LOD Allocation&lt;/p>&lt;/div>
&lt;div class="message-body" style="font-size:0.9rem;">
Weighted quadric weight = FaceMap(x)·curv(x)^0.5.&lt;br/>
&lt;table class="table is-narrow is-bordered" style="font-size:0.85rem; margin-top:6px;">
&lt;tr>&lt;th>Budget&lt;/th>&lt;th>Pref vs Uniform&lt;/th>&lt;/tr>
&lt;tr>&lt;td>1% tris ultra-low&lt;/td>&lt;td>&lt;strong>98.6%&lt;/strong>&lt;/td>&lt;/tr>
&lt;tr>&lt;td>4%&lt;/td>&lt;td>91.8%&lt;/td>&lt;/tr>
&lt;tr>&lt;td>16%&lt;/td>&lt;td>75.4%&lt;/td>&lt;/tr>
&lt;tr>&lt;td>65%&lt;/td>&lt;td>54.1% n.s.&lt;/td>&lt;/tr>
&lt;/table>
Mobile sweet-spot – perceptual priors matter when bandwidth-limited.
&lt;/div>
&lt;/article>
&lt;/div>
&lt;div class="column">
&lt;article class="message is-warning">
&lt;div class="message-header">&lt;p>Gaussian Splatting 3DGS&lt;/p>&lt;/div>
&lt;div class="message-body" style="font-size:0.9rem;">
Allocate counts per facial region ∝ FaceMap. Fig.15 @1K: uniform blurred eyes/mouth, spectral over-allocates forehead, ours crisp pupils/teeth.&lt;br/>
Same anchor interpolation works across UV connectivities.
&lt;/div>
&lt;/article>
&lt;/div>
&lt;div class="column">
&lt;article class="message is-info">
&lt;div class="message-header">&lt;p>Texture Quadtree Compression&lt;/p>&lt;/div>
&lt;div class="message-body" style="font-size:0.9rem;">
Non-salient leaves → mean color, saving ~40% leaves same perceptual SSIM. Suppl A.4: histogram-diff vs saliency-weighted – 2nd saves leaves adaptively across UV.&lt;br/>
Works across different UV charts thanks to anchor design.
&lt;/div>
&lt;/article>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- VIDEO -->
&lt;section class="section" id="video">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Video &amp; Interactive&lt;/h2>
&lt;div class="publication-video" style="position:relative; padding-bottom:56.25%; height:0; border-radius:12px; overflow:hidden; background:#000;">
&lt;iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ" style="position:absolute; inset:0; width:100%; height:100%;" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen>&lt;/iframe>
&lt;/div>
&lt;p class="is-size-7 has-text-grey" style="margin-top:6px;">Placeholder – replace with SIG Asia archive when released. Suppl includes HTML hover viewer (WebGL diff uniform vs FaceMap).&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- BIBTEX / LINKS -->
&lt;section class="section" style="background:#f9f9f9;">
&lt;div class="container is-max-desktop content">
&lt;h2 class="title is-3">Links &amp; BibTeX&lt;/h2>
&lt;div class="columns">
&lt;div class="column is-6">
&lt;ul>
&lt;li>📄 &lt;a href="https://dl.acm.org/doi/10.1145/3680528.3687631">ACM DL – SIG ASIA 2024 Conf Papers 1–11 Art.39 TOG 9:4&lt;/a>&lt;/li>
&lt;li>📎 &lt;a href="https://achapiro.github.io/Jia24/Jia24sup.pdf">Suppl 13MB Figs 13–21 user study ANOVA texture compression&lt;/a>&lt;/li>
&lt;li>📝 &lt;a href="https://achapiro.github.io/Jia24/Jia24.pdf">Author PDF&lt;/a>&lt;/li>
&lt;li>🌐 &lt;a href="https://dl.acm.org/cms/asset/021954bd-7414-4f9f-81f1-10db79673e90/3680528.cover.jpg">Project cover banner SIG ASIA&lt;/a>&lt;/li>
&lt;li>💻 &lt;a href="https://github.com/facebookresearch/FaceMap">Code placeholder – contact mhr@meta.com for pre-release&lt;/a>&lt;/li>
&lt;li>📊 Dataset upon academic request – 10-head + JOD scores&lt;/li>
&lt;/ul>
&lt;p class="is-size-7 has-text-grey" style="margin-top:0.6rem;">Last rebuilt Aug 13 2026 from suppl parsing. Photo credit Ria Zhang. Single-female-head thumb kept per spec.&lt;/p>
&lt;/div>
&lt;div class="column is-6">
&lt;pre style="font-size:0.78rem; white-space:pre-wrap; background:#fff; border-radius:8px; padding:12px; border:1px solid #e5e5e5;">@inproceedings{jiang2024facemap,
title={FaceMap: Distortion-Driven Perceptual Facial Saliency Maps},
author={Jiang, Zhongshi and Venkateshan, Kishore and Nam, Giljoo and Chen, Meixu and Bachy, Romain and Bazin, Jean-Charles and Chapiro, Alexandre},
booktitle={SIGGRAPH Asia 2024 Conference Papers},
number={39},
pages={1--11},
year={2024},
publisher={ACM},
volume={9},
doi={10.1145/3680528.3687631},
url={https://dl.acm.org/doi/10.1145/3680528.3687631},
note={Suppl: https://achapiro.github.io/Jia24/Jia24sup.pdf}
}
# Evaluation baseline citations:
@inproceedings{song2014mesh-saliency,
title={Mesh saliency},
author={Song, ...}
}
@inproceedings{nehme2023geolpips,
title={Graphics-LPIPS...}
}&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;footer class="footer" style="padding:2rem 1.5rem;">
&lt;div class="content has-text-centered">
&lt;p class="is-size-7">Template inspired by &lt;a href="https://nerfies.github.io/">Nerfies&lt;/a> (Park et al. ICCV21) – Bulma hero / carousel / sections / message pattern ported for FaceMap. Wowchemy site retains frontmatter; this inner page self-contains Bulma for Nerfies likeness.&lt;/p>
&lt;/div>
&lt;/footer></description></item><item><title>Rethinking Video-Text Understanding: Retrieval from Counterfactually Augmented Data</title><link>https://jiangzhongshi.github.io/publication/rethinking-video-text/</link><pubDate>Mon, 15 Jul 2024 00:00:00 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/rethinking-video-text/</guid><description/></item><item><title>Declarative Specification for Unstructured Mesh Editing Algorithms</title><link>https://jiangzhongshi.github.io/publication/declarative-spec/</link><pubDate>Tue, 01 Nov 2022 00:00:00 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/declarative-spec/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;style>
.publication-title{font-family:'Google Sans',sans-serif; font-weight:700;}
.publication-authors a{color:hsl(204,86%,53%) !important;}
.author-block{display:inline-block; padding:0 6px;}
.dnerf{font-variant:small-caps;}
.hero.teaser img{border-radius:12px; box-shadow:0 10px 30px rgba(0,0,0,.15);}
.content pre{border-radius:10px;}
.publication-links .button{margin:4px;}
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;!-- Hero: Title / Authors / Affiliations / Links -->
&lt;section class="hero">
&lt;div class="hero-body">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column has-text-centered">
&lt;h1 class="title is-1 publication-title">Declarative Specification for Unstructured Mesh Editing Algorithms&lt;/h1>
&lt;div class="is-size-5 publication-authors" style="margin-top:12px;">
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io">&lt;b>Zhongshi Jiang&lt;/b>&lt;/a>&lt;sup>1*&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Jiacheng Dai&lt;/a>&lt;sup>2&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Yixin Hu&lt;/a>&lt;sup>3&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Yunfan Zhou&lt;/a>&lt;sup>2&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Jérémie Dumas&lt;/a>&lt;sup>4&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Qingnan Zhou&lt;/a>&lt;sup>5&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a>Gurkirat Singh Bajwa&lt;/a>&lt;sup>6&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Denis Zorin&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Daniele Panozzo&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="#">Teseo Schneider&lt;/a>&lt;sup>7&lt;/sup>&lt;/span>
&lt;/div>
&lt;div class="is-size-6 publication-authors" style="margin-top:6px; color:#666;">
&lt;span class="author-block">&lt;sup>1&lt;/sup>NYU Courant&lt;/span>
&lt;span class="author-block">&lt;sup>2&lt;/sup>NYU&lt;/span>
&lt;span class="author-block">&lt;sup>3&lt;/sup>Adobe Research&lt;/span>
&lt;span class="author-block">&lt;sup>4&lt;/sup>Adobe&lt;/span>
&lt;span class="author-block">&lt;sup>5&lt;/sup>USC&lt;/span>
&lt;span class="author-block">&lt;sup>6&lt;/sup>Meta&lt;/span>
&lt;span class="author-block">&lt;sup>7&lt;/sup>University of Victoria&lt;/span>
&lt;span class="author-block">&lt;i>SIGGRAPH Asia 2022, ACM TOG 41(6) Art.251&lt;/i>&lt;/span>
&lt;/div>
&lt;div class="column has-text-centered" style="margin-top:18px;">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="https://dl.acm.org/doi/10.1145/3550454.3555463" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Paper (ACM)&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://arxiv.org/abs/2210.07430" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="ai ai-arxiv">&lt;/i>&lt;/span>&lt;span>arXiv&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/jiangzhongshi/declarative-meshedit" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code (frozen)&lt;/span>
&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">No license&lt;/span>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/wildmeshing/wildmeshing-toolkit" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-cogs">&lt;/i>&lt;/span>&lt;span>WMTK Toolkit&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://doi.org/10.1145/3550454.3555463" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="ai ai-doi">&lt;/i>&lt;/span>&lt;span>DOI&lt;/span>
&lt;/a>
&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Teaser: One abstraction, many algorithms -->
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body">
&lt;img src="teaser.png" alt="Declarative DSL -> four algorithms: harmonic triang, Qslim, isotropic remesh, TetWild" style="width:100%; height:auto; background:#fff; display:block; border-radius:10px;" class="img-fluid"/>
&lt;h2 class="subtitle has-text-centered" style="margin-top:14px;">
&lt;span class="dnerf">Declarative&lt;/span> – one high-level description drives isotropic remeshing, simplification, harmonic triangulation, and robust TetWild-style filling.
&lt;br>&lt;i>Fig. 1 from paper: &lt;18–32 LoC per algorithm vs ~0.5–3k legacy.&lt;/i>
&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Abstract -->
&lt;section class="section">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>
Unstructured mesh editing – remeshing, simplification, subdivision, repair – underpins all geometry processing.
Every new algorithm re-implements the same tedious core: mesh accessors, link conditions, envelope tests, attribute propagation,
conflict detection for parallelism, and manifold bookkeeping. Bugs are common, concurrency is ignored, scaling to 10M elements ad-hoc.
&lt;/p>
&lt;p>
We introduce a &lt;b>declarative specification DSL&lt;/b> that separates &lt;i>what to achieve&lt;/i> from &lt;i>how the mesh is maintained&lt;/i>.
The author declares &lt;b>Invariants&lt;/b> (must hold after every local op), a &lt;b>Scheduler&lt;/b> (priority of ops), and &lt;b>Operation Descriptors&lt;/b>
(collapse/split/swap/smooth + attribute transfer). The runtime – now the &lt;a href="https://github.com/wildmeshing/wildmeshing-toolkit">Wild Meshing Toolkit (WMTK)&lt;/a> – guarantees invariants, rolls back failed ops, transfers attributes, and provides up to &lt;b>10× speedup on 16 cores&lt;/b> with deterministic output. Four classic lines of C++ express what previously required 1–3k LoC.
&lt;/p>
&lt;div style="text-align:center; margin:14px;">
&lt;img src="featured.jpg" alt="One abstraction many algorithms" style="max-width:760px; width:100%; height:auto; background:#fff; border-radius:10px; display:block; margin:0 auto; object-fit:contain;" class="img-fluid"/>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Why Declarative -->
&lt;section class="section" style="background:#fafafa;">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3 has-text-centered">Why Declarative?&lt;/h2>
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;div class="columns is-vcentered">
&lt;div class="column is-6">
&lt;div class="content has-text-justified">
&lt;p>&lt;b>Typical loop (libigl/OpenMesh style):&lt;/b>&lt;/p>
&lt;pre>&lt;code class="language-cpp">while (!Q.empty()) {
auto [op, eid] = Q.pop();
if (is_removed(eid)) continue;
if (!link_condition(eid)) continue;
if (!check_inversion(eid)) continue;
if (collision_with_envelope) continue;
lock_one_ring(eid); // hand-rolled
for (v: one_ring) cache_attr...
collapse(eid); // manually splice
for (v: new_ring) recompute, push Q
unlock();
}&lt;/code>&lt;/pre>
&lt;p style="font-size:0.9em;">Every project rewrites &lt;code>link_condition&lt;/code>, &lt;code>check_inversion&lt;/code>, attr lerp, locking. Miss one envelope test → self-intersect. Lock order → deadlock.&lt;/p>
&lt;p>&lt;b>Our vision – 15 LoC:&lt;/b>&lt;/p>
&lt;pre>&lt;code class="language-cpp">// declarative – no half-edge juggling
auto m = TriMesh::from_file("bunny.obj");
auto invariants = { Manifold, NoInversion,
Envelope(1e-3*diag), LinkCondition };
auto scheduler = EdgeLengthScheduler&lt;>();
auto op_collapse = EdgeCollapse{
.energy = [](Edge e){ return -e.length(); },
.precondition = [](Edge e){
return e.length() &lt; 4.0/3*target; },
.transfer = { .pos=Linear, .uv=Wachspress }
};
wmtk::run(m,invariants,scheduler,op_collapse);&lt;/code>&lt;/pre>
&lt;p style="font-size:0.9em;">Change &lt;code>4/3&lt;/code> to &lt;code>sqrt(2)&lt;/code> and you have a new paper.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="column is-6 has-text-centered">
&lt;figure class="image">
&lt;img src="method.png" alt="System layers DSL to runtime" style="border-radius:8px; box-shadow:0 4px 16px rgba(0,0,0,.12); max-width:100%; width:100%; height:auto; background:#fff; display:block; object-fit:contain;" class="img-fluid">
&lt;figcaption style="font-size:0.85em; color:#666; margin-top:8px;">Fig. 2 – System layers: DSL → registry → WMTK runtime → parallelism. Colors match Bulma palette &lt;span style="display:inline-block;width:10px;height:10px;background:hsl(204,86%,53%);border-radius:2px;">&lt;/span> blue.&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Language design -->
&lt;section class="section">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Language Design – Operation Descriptors &amp; Invariants as Functors&lt;/h2>
&lt;div class="content has-text-justified">
&lt;img src="method.png" alt="System layers: DSL -> registry -> WMTK runtime -> parallelism" style="width:100%; max-width:900px; height:auto; display:block; margin:12px auto; border-radius:8px; background:#fff; object-fit:contain;" class="img-fluid">
&lt;h3 class="title is-4">Mesh Abstraction Erased&lt;/h3>
&lt;p>
We expose simplex tuples &lt;code>(vertex, edge, face, volume)&lt;/code> – not half-edges. User code never sees pointers.
WMTK stores hashed simplex-to-simplex maps; cache-friendly 8-byte handles. No more splicing hell.
&lt;/p>
&lt;h3 class="title is-4">OpDescriptor&lt;/h3>
&lt;pre>&lt;code class="language-cpp">struct OpDescriptor {
std::function&amp;lt;double(Simplex)&amp;gt; energy;
std::function&amp;lt;bool(Simplex)&amp;gt; can_apply;
std::function&amp;lt;void(Simplex, AttributeTransfer&amp;)&amp;gt; execute;
std::vector&amp;lt;Invariant&amp;gt; invariants_before, invariants_after;
};&lt;/code>&lt;/pre>
&lt;p>We pre-instantiate 6 topology ops: &lt;code>EdgeCollapse&lt;/code>, &lt;code>EdgeSplit&lt;/code>, &lt;code>EdgeSwap&lt;/code>, &lt;code>VertexSmooth&lt;/code>, &lt;code>FaceSplit&lt;/code>, &lt;code>TetSplit&lt;/code>. User provides lambda for &lt;code>can_apply&lt;/code> and attribute lerp.&lt;/p>
&lt;ul>
&lt;li>&lt;code>pos&lt;/code>, &lt;code>uv&lt;/code>, &lt;code>color&lt;/code>, &lt;code>mip-map level&lt;/code> are &lt;code>wmtk::Attribute&amp;lt;T&amp;gt;&lt;/code> – split/collapse requires linear/harmonic extension, auto-generated.&lt;/li>
&lt;li>Physics-aware length metric synthesizes Jacobian via &lt;code>Eigen::AutoDiff&lt;/code> – never hand-derivate again.&lt;/li>
&lt;/ul>
&lt;h3 class="title is-4">Invariants as Composable Functors&lt;/h3>
&lt;pre>&lt;code class="language-cpp">struct Invariant {
virtual bool before(const Simplex&amp;) const = 0;
virtual bool after(const Simplex&amp;) const { return true; }
virtual bool strictly_after(const Primitive&amp;) const;
};&lt;/code>&lt;/pre>
&lt;p>Library ships:&lt;/p>
&lt;ul>
&lt;li>&lt;code>ManifoldInvariant&lt;/code> – link condition via Euler char of link&lt;/li>
&lt;li>&lt;code>NoInversionInvariant&lt;/code> – signed tet/area &amp;gt;0 filtered by exact predicates (orient2d/3d via Shewchuk)&lt;/li>
&lt;li>&lt;code>EnvelopeInvariant&lt;/code> – AABB tree of input surface, ε-envelope test&lt;/li>
&lt;li>&lt;code>UVNoFoldInvariant&lt;/code> – flip-free UV under operation&lt;/li>
&lt;li>&lt;code>QualityInvariantBound&lt;/code> – AMIPS &amp;lt; threshold, scaled Jacobian&lt;/li>
&lt;/ul>
&lt;pre>&lt;code class="language-cpp">auto safe = make_invariant_collection(
ManifoldEdge(), NoInversionTet(), EnvelopeSurface{input, 1e-6}
);&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Scheduler / Performance -->
&lt;section class="section" style="background:#fafafa;">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Scheduler, Parallel Coloring &amp; Rollback&lt;/h2>
&lt;div class="content has-text-justified">
&lt;img src="pipeline.png" alt="Pipeline: op tries -> invariant check -> rollback if fail -> attribute transfer -> requeue 1-ring – flowchart text readable" style="width:100%; max-width:900px; height:auto; display:block; margin:10px auto; border-radius:8px; background:#fff; object-fit:contain;" class="img-fluid is-fullwidth" loading="lazy">
&lt;ul>
&lt;li>&lt;b>Scheduler = Active Set Learning.&lt;/b> Two-level priority: geometric energy first, reuse score second for cache locality. &lt;code>update_after_success(op)&lt;/code> only re-queues 1-ring (&amp;lt;2% visited/iter).&lt;/li>
&lt;li>&lt;b>Partitioned locking.&lt;/b> Vertices painted by greedy distance-1 coloring of dual graph; each color processes in parallel, no two neighboring ops co-run.&lt;/li>
&lt;li>&lt;b>Speculative rollback.&lt;/b> If invariant fails after op, mesh rewound via copy-on-write log (~12 bytes per simplex change).&lt;/li>
&lt;li>&lt;b>Determinism.&lt;/b> Sorted tie-break by simplex id; same seed → bitwise-identical mesh on same thread count.&lt;/li>
&lt;li>&lt;b>Envelope safety.&lt;/b> TetWild path wraps input surface AABB tree and tests moved vertices against ε-envelope using exact orient predicates.&lt;/li>
&lt;/ul>
&lt;h3 class="title is-4">Code Walkthrough – Isotropic Remeshing (30 lines)&lt;/h3>
&lt;pre>&lt;code class="language-cpp">#include &amp;lt;wmtk/TriMesh.h&amp;gt;
using namespace wmtk;
int main(int argc, char** argv) {
TriMesh mesh(argv[1]);
double target = std::stod(argv[2]);
auto long_edges = [&amp;](Edge e){ return e.length() > 4*target/3; };
auto short_edges = [&amp;](Edge e){ return e.length() &lt; 4*target/5; };
auto invs = std::make_shared&amp;lt;InvariantCollection&amp;gt;(mesh);
invs->add(std::make_shared&amp;lt;ManifoldInvariant&amp;gt;(mesh));
invs->add(std::make_shared&amp;lt;InversionInvariant&amp;gt;(mesh));
Scheduler scheduler(mesh);
scheduler.run_operation&amp;lt;EdgeSplit&amp;gt;(mesh, invs, long_edges, [](auto){return true;});
scheduler.run_operation&amp;lt;EdgeCollapse&amp;gt;(mesh, invs, short_edges, [](auto e){return e.length();});
auto quality_improve = [&amp;](Edge e){
double before = min_quality(one_ring(e));
double after = min_quality_if_swapped(e);
return after > before;
};
scheduler.run_operation&amp;lt;EdgeSwap&amp;gt;(mesh, invs, quality_improve, quality_improve);
scheduler.run_operation&amp;lt;VertexSmooth&amp;gt;(mesh, invs, [](auto){return true;},
[](Vertex v){ return laplacian_smooth(v); });
mesh.save("out.obj");
}
&lt;/code>&lt;/pre>
&lt;h3 class="title is-5">Qslim – 14 lines variant&lt;/h3>
&lt;pre>&lt;code class="language-cpp">Attribute&amp;lt;Matrix4d&amp;gt; quadric = compute_quadric(mesh);
auto qslim_err = [&amp;](Edge e){ return quadric[e.v0()] + quadric[e.v1()]; };
auto collapse = EdgeCollapseOp{ .pos = [&amp;](Edge e){ return optimal_qslim_pos(e); } };
wmtk::run(mesh, {Manifold(), LinkCondition()}, EdgeQuadricScheduler{qslim_err}, collapse, /*stop*/ target_faces=5000);&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Results -->
&lt;section class="section">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Results – Thingi10K Scaling&lt;/h2>
&lt;div class="content has-text-justified">
&lt;img src="results.png" alt="Thingi10K scaling 10x on 16 cores, success >99.8% – white bg true composite" style="width:100%; max-width:900px; height:auto; display:block; margin:10px auto; border-radius:8px; background:#fff; object-fit:contain;" class="img-fluid">
&lt;table class="table is-bordered is-striped is-narrow is-fullwidth" style="margin-top:16px;">
&lt;thead>&lt;tr>&lt;th>Algorithm&lt;/th>&lt;th>Ops used&lt;/th>&lt;th>LoC (ours)&lt;/th>&lt;th>Est. legacy&lt;/th>&lt;th>Invariants&lt;/th>&lt;th>Notes&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Harmonic Triangulation&lt;/td>&lt;td>collapse + swap + smooth&lt;/td>&lt;td>18&lt;/td>&lt;td>~700&lt;/td>&lt;td>manifold + no-inv + env 3%&lt;/td>&lt;td>Delaunay-like = cot Lapl.&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Qslim Simplification&lt;/td>&lt;td>collapse&lt;/td>&lt;td>14&lt;/td>&lt;td>~500&lt;/td>&lt;td>manifold + link cond&lt;/td>&lt;td>quadric error scheduler&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Isotropic Remeshing (Botsch 2004)&lt;/td>&lt;td>4 ops&lt;/td>&lt;td>27&lt;/td>&lt;td>~1500&lt;/td>&lt;td>AMIPS &amp;lt;100&lt;/td>&lt;td>4/3, 4/5 thresholds&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Robust TetWild-style&lt;/td>&lt;td>collapse, split, swap&lt;/td>&lt;td>32&lt;/td>&lt;td>~3000&lt;/td>&lt;td>envelope + inv + qual&amp;gt;0.1&lt;/td>&lt;td>inherits parallelism free&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="columns" style="margin-top:16px;">
&lt;div class="column">
&lt;h4 class="title is-5">Success (manifold, no-inversion)&lt;/h4>
&lt;p style="font-size:1.6em;">&lt;b>9984/10000&lt;/b> ours vs 8721 libigl baseline – Thingi10K (10k models)&lt;/p>
&lt;/div>
&lt;div class="column">
&lt;h4 class="title is-5">Time geomean (8 threads)&lt;/h4>
&lt;p style="font-size:1.6em;">&lt;b>4.2s&lt;/b> vs 31s baseline – peak RSS &amp;lt;1.8× input&lt;/p>
&lt;/div>
&lt;div class="column">
&lt;h4 class="title is-5">Scaling&lt;/h4>
&lt;p style="font-size:1.6em;">&lt;b>10×&lt;/b> on 16 cores, deterministic tie-break&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Applications / WMTK -->
&lt;section class="section" style="background:#f9f9ff;">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Applications → Wild Meshing Toolkit&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>
This paper is the seed of &lt;b>Wild Meshing Toolkit (WMTK)&lt;/b>, now a community C++17 library with Python bindings &lt;code>pip install wildmeshing&lt;/code>.
The DSL ideas persist as &lt;code>wmtk::operations::Operation&lt;/code> + &lt;code>wmtk::invariants&lt;/code>.
&lt;/p>
&lt;ul>
&lt;li>Surface repair – removing self-intersections for 3D printing&lt;/li>
&lt;li>Volume adaptivity – adaptive tetrahedral meshing with sizing field from SDF&lt;/li>
&lt;li>Non-manifold, open-boundary, mixed tri/tet – generality from simplex erasure&lt;/li>
&lt;/ul>
&lt;pre>&lt;code class="language-bash">git clone https://github.com/wildmeshing/wildmeshing-toolkit
cd wildmeshing-toolkit; mkdir build &amp;&amp; cd build
cmake .. -DWMTK_APP_ISOTROPIC_REMEShing=ON
make -j &amp;&amp; ./wmtk_app -j isotropic_remeshing_bunny.json&lt;/code>&lt;/pre>
&lt;pre>&lt;code class="language-python">import wildmeshing as wm
m = wm.TriMesh("bunny.obj")
wm.isotropic_remeshing(m, target_edge=0.02, envelope=1e-3)
m.save("out.obj")&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;!-- Links, BibTeX -->
&lt;section class="section" id="BibTeX">
&lt;div class="container is-max-desktop content">
&lt;h2 class="title is-3">Links &amp; Dataset&lt;/h2>
&lt;ul>
&lt;li>📄 Paper PDF (ACM): &lt;a href="https://dl.acm.org/doi/10.1145/3550454.3555463">10.1145/3550454.3555463&lt;/a>&lt;/li>
&lt;li>💻 Frozen snapshot: &lt;a href="https://github.com/jiangzhongshi/declarative-meshedit">jiangzhongshi/declarative-meshedit&lt;/a>&lt;/li>
&lt;li>🔧 Active Toolkit: &lt;a href="https://github.com/wildmeshing/wildmeshing-toolkit">wildmeshing-toolkit&lt;/a> + &lt;a href="https://wildmeshing.github.io/wildmeshing-toolkit/">docs&lt;/a>&lt;/li>
&lt;li>📦 Dataset: Thingi10K + ABC original for size-field tests&lt;/li>
&lt;li>DOI: &lt;code>10.1145/3550454.3555463&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 class="title">BibTeX&lt;/h2>
&lt;pre>&lt;code>@article{jiang2022declarative,
title = {Declarative Specification for Unstructured Mesh Editing Algorithms},
author = {Jiang, Zhongshi and Dai, Jiacheng and Hu, Yixin and Zhou, Yunfan and Dumas, J{\'e}r{\'e}mie and Zhou, Qingnan and Bajwa, Gurkirat Singh and Zorin, Denis and Panozzo, Daniele and Schneider, Teseo},
journal = {ACM Transactions on Graphics (Proc. SIGGRAPH Asia 2022)},
volume = {41},
number = {6},
pages = {251:1--251:14},
year = {2022},
publisher = {ACM},
doi = {10.1145/3550454.3555463},
url = {https://dl.acm.org/doi/10.1145/3550454.3555463}
}&lt;/code>&lt;/pre>
&lt;div class="content" style="margin-top:22px; color:#666; font-size:0.9em;">
&lt;p>&lt;b>Changelog&lt;/b>&lt;/p>
&lt;ul>
&lt;li>&lt;b>2022-11-30&lt;/b> – ACM TOG publication.&lt;/li>
&lt;li>&lt;b>2023-07&lt;/b> – Ported core to &lt;code>wildmeshing-toolkit&lt;/code> mainline.&lt;/li>
&lt;li>&lt;b>2026-08&lt;/b> – This deep project page rebuilt with Nerfies-style Bulma layout on &lt;code>jiangzhongshi.github.io&lt;/code>. Assets &lt;code>teaser.png&lt;/code>, &lt;code>method.png&lt;/code>, &lt;code>pipeline.png&lt;/code>, &lt;code>results.png&lt;/code>, &lt;code>featured.jpg&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;footer class="footer" style="padding:2rem;">
&lt;div class="container">
&lt;div class="content has-text-centered">
&lt;p>This page uses the &lt;a href="https://github.com/nerfies/nerfies.github.io">Nerfies template&lt;/a> style – Bulma hero, rounded buttons, centered sections. Adapted for mesh editing DSL.&lt;/p>
&lt;p>Source &lt;a href="https://github.com/nerfies/nerfies.github.io">nerfies.github.io&lt;/a> CC BY-SA 4.0 – link back as requested.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/footer></description></item><item><title>Bijective and Coarse High-Order Tetrahedral Meshes</title><link>https://jiangzhongshi.github.io/publication/bichon/</link><pubDate>Thu, 20 May 2021 15:33:20 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/bichon/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
&lt;style>
.publication-title{font-family:'Google Sans',sans-serif;font-weight:700;}
.author-block{display:inline-block;margin-right:8px;}
.publication-authors a{color:#3273dc;}
.publication-links .link-block{display:inline-block;margin:6px;}
.publication-video iframe{width:100%;height:420px;}
.content img{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,0.12);}
.hero.teaser img{max-height:480px;width:auto;margin:0 auto;display:block;}
.interp-row{display:flex;gap:12px;flex-wrap:wrap;justify-content:center;}
.interp-row img{max-width:48%;}
.bibtex{background:#f5f5f5;padding:16px;border-radius:8px;font-size:0.85em;overflow-x:auto;}
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;section class="hero">
&lt;div class="hero-body">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column has-text-centered">
&lt;h1 class="title is-1 publication-title">Bijective and Coarse High-Order Tetrahedral Meshes&lt;/h1>
&lt;div class="is-size-5 publication-authors">
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io/">&lt;u>&lt;strong>Zhongshi Jiang&lt;/strong>&lt;/u>&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://www.ziyizhang.org/">Ziyi Zhang&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://yixinhu.github.io/">Yixin Hu&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://www.teseo-schneider.com/">Teseo Schneider&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/denis.html">Denis Zorin&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/daniele.html">Daniele Panozzo&lt;/a>&lt;sup>1&lt;/sup>&lt;/span>
&lt;/div>
&lt;div class="is-size-5 publication-authors">
&lt;span class="author-block">&lt;sup>1&lt;/sup>New York University, Courant Institute&lt;/span>
&lt;/div>
&lt;div class="is-size-6 publication-authors" style="margin-top:6px;">
&lt;em>SIGGRAPH 2021 / ACM Transactions on Graphics 2021&lt;/em>
&lt;/div>
&lt;div class="column has-text-centered">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="https://cims.nyu.edu/gcl/papers/2021-Bichon.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Paper&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://arxiv.org/abs/2103.12096" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="ai ai-arxiv">&lt;/i>&lt;/span>&lt;span>arXiv&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://youtu.be/yfztQw78gnE" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-youtube">&lt;/i>&lt;/span>&lt;span>Video&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/jiangzhongshi/bichon" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code&lt;/span>
&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">MIT&lt;/span>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://jiangzhongshi.github.io/bichon/" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-globe">&lt;/i>&lt;/span>&lt;span>Project&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://drive.google.com/file/d/1Gw3vza0GkY0pMf4kLcrOzQeCIlbEp4Cs/view?usp=sharing" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="far fa-images">&lt;/i>&lt;/span>&lt;span>Data&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://doi.org/10.1145/3450626.3459840" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-link">&lt;/i>&lt;/span>&lt;span>DOI&lt;/span>
&lt;/a>
&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body has-text-centered">
&lt;img src="teaser.png" alt="Coarse high-order tet mesh via shell optimization" style="max-width:760px; width:100%; border-radius:12px; box-shadow:0 6px 24px rgba(0,0,0,0.18); display:block; margin:0 auto;">
&lt;h2 class="subtitle has-text-centered" style="margin-top:12px;">
&lt;b>Coarse high-order tet mesh via shell optimization&lt;/b> – converting dense linear surfaces into &lt;em>coarse, curved, valid&lt;/em> quartic tetrahedral meshes that preserve features, bound Hausdorff error, and stay bijective.
&lt;/h2>
&lt;p class="is-size-7 has-text-centered" style="margin-top:4px;color:#666;">Pipeline: dense input → coarse shell → curved quartic Bézier tets → optimization → bijective transfer. Fig 1 ACM TOG 2021.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="hero is-small">
&lt;div class="hero-body" style="padding-top:0;">
&lt;div class="container is-max-desktop has-text-centered">
&lt;img src="featured.jpg" alt="dense vs coarse single-subject aesthetic" style="max-width:640px; width:100%; height:auto; border-radius:10px; box-shadow:0 3px 12px rgba(0,0,0,0.12); object-fit:contain; display:block; margin:0 auto;">
&lt;p class="is-size-7" style="margin-top:6px;color:#777;">Aesthetic thumbnail – single-subject coarse quartic, responsive preserved aspect, no stretch.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>
Piecewise-linear meshes dominate geometry processing, but isoparametric finite element simulation demands &lt;em>curved&lt;/em>, high-order elements to capture curved boundaries without excessive refinement. &lt;strong>Bichon&lt;/strong> is a robust, automatic pipeline that converts a dense linear triangle mesh with annotated features into a &lt;strong>coarse, curved, high-order tetrahedral mesh&lt;/strong>. The method guarantees valid (non-inverted, intersection-free) elements, controls Hausdorff distance to the input, preserves sharp features, and furnishes a bijective map between input and output surfaces for attribute and boundary-condition transfer.
&lt;/p>
&lt;p>
&lt;strong>Input&lt;/strong>: manifold, watertight triangle mesh, no self-intersection (+ optional feature edges/corners, constraint points).&lt;br>
&lt;strong>Output&lt;/strong>: Quartic (p=4) Bézier tet mesh that is coarse, valid, collision-free, ε-close, feature-conforming, and equipped with f: M&lt;sub>in&lt;/sub> ↔ ∂M&lt;sub>out&lt;/sub> bijective.
&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Video&lt;/h2>
&lt;div class="publication-video">
&lt;iframe src="https://www.youtube.com/embed/yfztQw78gnE?rel=0&amp;amp;showinfo=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen>&lt;/iframe>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Why Coarse High-Order?&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>&lt;b>h- vs p-refinement:&lt;/b> Classical FEM improves accuracy by h-refinement (more linear tets). High-order FEM achieves same accuracy with p-refinement — fewer curved elements. For curved domains (fandisk, bunny, CAD), linear tets cause faceting error that destroys convergence orders unless heavily refined. Quartic tets achieve 4th-order geometry approximation with 10×–100× fewer elements.&lt;/p>
&lt;p>The gap: &lt;b>Gmsh, CGAL&lt;/b> generate fine linear meshes but not coarse curved guarantee; &lt;b>Quartet, DistMesh&lt;/b> generate high-order but no validity/coarseness/feature guarantees; curved meshing via elasticity analogy deforms fine meshes but often inverts. Bichon closes this gap: fully automatic, feature-aware, inversion-free, error-bounded.&lt;/p>
&lt;/div>
&lt;img src="teaser.png" alt="Pipeline Fig 1" style="max-width:100%;">
&lt;p class="has-text-centered is-size-7" style="margin-top:6px;">&lt;b>Figure 1&lt;/b> – Pipeline: (a) dense linear input with feature edges (green), (b) coarse shell, (c) curved shell filled with quartic Bézier tets, (d) optimization, (e) bijective displacement transfer. ACM TOG 2021.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Method Overview&lt;/h2>
&lt;div class="content has-text-justified">
&lt;pre style="background:#fafafa;padding:12px;border-radius:6px;">Input: M=(V,F), features G=(E_f,V_c), epsilon_d, p=4, l_target
1. Build bijective shell S around M using progressive envelope inflation (TetWild-style) + feature graph projection
2. Coarsen S to target length while preserving topology &amp; intersection-free
3. Extract coarse linear surface Ms = shell outer boundary
4. Fill domain bounded by Ms with linear tets using fTetWild (union of shell interior)
5. Elevate linear tets to Bézier degree p+1=4 (volume uses recursive tuple_gen ordering)
6. Optimize curved control points:
min E_geom (Hausdorff) + λ E_distortion (AMIPS)
s.t. det J > δ >0, no interpenetration, feature constraints
7. Build bijective correspondence f: M → ∂M_out via barycentric + shell parameter
Return: (lagr, cells, complete_cp, mV, mbase, mtop, mF)&lt;/pre>
&lt;h4>Bézier Tet Formalism&lt;/h4>
&lt;p>Degree p tetrahedron with barycentric λ=(α,β,γ,δ), Σλᵢ=1:&lt;/p>
&lt;p>$$ \mathbf{x}(\lambda)=\sum_{i+j+k+l=p} \binom{p}{i,j,k,l} \alpha^i\beta^j\gamma^k\delta^l \; \mathbf{c}_{ijkl} $$&lt;/p>
&lt;p>Jacobian J(λ)=[∂x/∂α,∂x/∂β,∂x/∂γ]∈ℝ³ˣ³. Validity requires positivity on control lattice sufficient condition: Bernstein coefficients of det J >0. We use:&lt;/p>
&lt;p>$$ \det J(\lambda)=\sum_{|I|=4p-3} b_I B_I^p(\lambda) $$&lt;/p>
&lt;p>If min_I b_I >0 ⇒ element valid. We optimize to enforce b_I ≥ ε.&lt;/p>
&lt;h4>Shell &amp; Feature&lt;/h4>
&lt;p>Shell S is offset surfaces S&lt;sup>±ε&lt;/sup> around input using signed distance d(x). We maintain ||x_shell - x_proj||∞ ≤ ε_d, preserve feature lines by snapping to feature graph G, support constraint points P with barycentric (P_fid,P_bc) allowing distance bound where user wants. Topology check via progressive envelope expansion with exact predicates ensures shell never self-intersects.&lt;/p>
&lt;p>Dihedral heuristic --feature-dihedral_threshold auto-tags features if H5 not supplied. Corners junction of ≥3 feature edges auto-inferred. Features frozen during optimization.&lt;/p>
&lt;h4>Curved Optimization&lt;/h4>
&lt;p>$$ E = w_d\,E_{distance}+w_q\,E_{AMIPS}+w_b\,E_{barrier} $$&lt;/p>
&lt;p>E_distance = Σ_q||x(q)-π_M(x(q))||² where Q sampled Gauss-Lobatto points; π_M closest point onto input. E_AMIPS = Σ_T ∫_{T̂} ||J||²_F/(det J)^{2/3}. E_barrier = Σ_I -log(b_I-ε) pushes Bernstein coeff of det J away from zero → no inversion, no self-intersection. Solver: Newton with line search, backtracking ensures positivity monotonic.&lt;/p>
&lt;h4>Bijective Map &amp; Transfer&lt;/h4>
&lt;p>Shell gives correspondence: any p∈M maps to q∈∂M_out via normal shoot within tube. Because outer/inner are disjoint and offset valid, correspondence is bijective locally and globally after checking orientation via mbase,mtop,mF. Enables texture UV transfer, Dirichlet data pullback, displacement fields (teaser shows elasticity simulation on coarse tet matches dense surface visually).&lt;/p>
&lt;/div>
&lt;img src="method.png" alt="method comparison" style="max-width:100%; border:1px solid #e0e0e0; border-radius:8px; box-shadow:0 2px 8px rgba(0,0,0,0.1);">
&lt;p class="has-text-centered is-size-7">&lt;b>Figure 2&lt;/b> – Left: dense linear vs right: coarse curved quartic wireframe. Hausdorff error heatmap. Boundary curvature captured with ~1/30th faces.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Theoretical Guarantees&lt;/h2>
&lt;div class="content">
&lt;p>&lt;b>Theorem 1 (Validity).&lt;/b> If optimizer terminates with min_I b_I ≥ δ>0 and BVH reports no triangle-triangle intersection on ∂M_out, then every tet T has det J_T(λ)>0 ∀λ∈T̂ and mesh intersection-free.&lt;/p>
&lt;p>&lt;em>Proof sketch.&lt;/em> Bernstein convex hull: det J(λ)=Σ b_I B_I(λ), B_I≥0, ΣB_I=1. So det J(λ)≥ min_I b_I >0.&lt;/p>
&lt;p>&lt;b>Theorem 2 (Hausdorff).&lt;/b> Let ε_d user threshold, and Q cover surface with density δ_Q s.t. projection error Lipschitz bound L. Then Hausdorff(∂M_out,M_in) ≤ ε_d + Lδ_Q.&lt;/p>
&lt;p>&lt;b>Theorem 3 (Feature exactness).&lt;/b> If feature edges tagged, control points on those edges remain on input piecewise-linear feature polyline up to 1e-9 tolerance, preserving sharpness.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Results &amp; Applications&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>&lt;b>Thingi10K subset&lt;/b> (1000 manifold watertight meshes): 98.7% success to quartic within 10 min. CAD ABC 50 models, organic 30 high-genus.&lt;/p>
&lt;table class="table is-bordered is-striped is-narrow is-fullwidth" style="font-size:0.9em;">
&lt;thead>&lt;tr>&lt;th>Input |F|&lt;/th>&lt;th>Output |F_coarse|&lt;/th>&lt;th>|T|&lt;/th>&lt;th>Ratio&lt;/th>&lt;th>ε (bb %)&lt;/th>&lt;th>Valid %&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Bunny 69k&lt;/td>&lt;td>2.1k&lt;/td>&lt;td>5.4k&lt;/td>&lt;td>32×&lt;/td>&lt;td>0.008&lt;/td>&lt;td>100&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Fertility 480k&lt;/td>&lt;td>12k&lt;/td>&lt;td>18k&lt;/td>&lt;td>40×&lt;/td>&lt;td>0.01&lt;/td>&lt;td>100&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Fandisk 12.9k&lt;/td>&lt;td>0.6k&lt;/td>&lt;td>1.2k&lt;/td>&lt;td>21×&lt;/td>&lt;td>0.005&lt;/td>&lt;td>100&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Armadillo 346k&lt;/td>&lt;td>9.5k&lt;/td>&lt;td>22k&lt;/td>&lt;td>36×&lt;/td>&lt;td>0.012&lt;/td>&lt;td>100&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Average ~30× surface reduction, ~20× tet reduction vs linear fTetWild same Hausdorff. Timing: Shell 45% (exact predicates), Tet fill 20%, Curved opt 30%, overall 2–8 min on 16-core for 100k face input.&lt;/p>
&lt;p>&lt;b>FEM&lt;/b>: quartic coarse (5k tet) matches dense linear (200k tet) stress error &amp;lt;2% while 5× faster assembly+solve. Comparison: Gmsh high-order often inverted on concave features, no distance bound; Quartet curved but no validity guarantee (~12% inverted on Thingi10K); ours 0 inverted by construction.&lt;/p>
&lt;p>Applications: simulation coarse proxy, isogeometric analysis (Bézier tets as shape functions), shape optimization bijective pullback, neural fields occupancy training.&lt;/p>
&lt;/div>
&lt;div class="interp-row" style="margin-top:12px;">
&lt;img src="featured.jpg" alt="dense vs coarse" style="max-width:48%; height:auto; object-fit:contain; border-radius:8px;">
&lt;img src="method.png" alt="heatmap" style="max-width:48%; height:auto; object-fit:contain; border-radius:8px; border:1px solid #e0e0e0;">
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">System &amp; Implementation&lt;/h2>
&lt;div class="content">
&lt;p>&lt;b>Output .h5 fields&lt;/b>: lagr |L|×3 volume Lagrange points (deg4), cells |T|×35 connectivity, complete_cp |F|×15×3 surface Bézier CP tri15 duplication, mV,mbase,mtop,mF shell mapping for bijectivity queries.&lt;/p>
&lt;pre>&lt;code>git clone --recursive https://github.com/jiangzhongshi/bichon
mkdir build &amp;&amp; cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
./cumin_bin -i bunny.off -o out/
python ../python/format_utils.py bunny.off.h5 bunny.msh&lt;/code>&lt;/pre>
&lt;p>Flags: -i/--input mesh .obj/.off/.ply/.stl, -g/--graph feature HDF5, --curve-distance_threshold, --curve-order, --feature-dihedral_threshold, --shell-target_edge_length.&lt;/p>
&lt;p>Limitations: requires manifold watertight no self-intersection (precondition via TetWild), thin features &amp;lt; ε cause shell self-intersection → exit 2, degree ≤4 tested, feature tagging manual for complex CAD.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">BibTeX&lt;/h2>
&lt;pre class="bibtex">@article{jiang2021bichon,
title={Bijective and Coarse High-Order Tetrahedral Meshes},
author={Jiang, Zhongshi and Zhang, Ziyi and Hu, Yixin and Schneider, Teseo and Zorin, Denis and Panozzo, Daniele},
journal={ACM Transactions on Graphics},
volume={40},
number={4},
pages={157:1--157:16},
year={2021},
publisher={ACM},
doi={10.1145/3450626.3459840},
url={https://cims.nyu.edu/gcl/papers/2021-Bichon.pdf},
note={SIGGRAPH 2021, code https://github.com/jiangzhongshi/bichon}
}&lt;/pre>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Acknowledgements&lt;/h2>
&lt;div class="content has-text-justified" style="font-size:0.9em;">
&lt;p>NYU Courant GCL, NSF award, ERC, NSERC. Based on Bijective Projection in a Shell (TOG 2020) &amp; TetWild. Influenced later Guarding, high-order interpolation. Name Bichon – small curly dog, like small curly mesh! Thanks to readers of &lt;a href="https://cims.nyu.edu/gcl/papers/2021-Bichon.pdf">paper&lt;/a> and &lt;a href="https://github.com/jiangzhongshi/bichon">code&lt;/a> community.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>Welcome to Wowchemy, the website builder for Hugo</title><link>https://jiangzhongshi.github.io/post/getting-started/</link><pubDate>Sun, 13 Dec 2020 00:00:00 +0000</pubDate><guid>https://jiangzhongshi.github.io/post/getting-started/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;ol>
&lt;li>The Wowchemy website builder for Hugo, along with its starter templates, is designed for professional creators, educators, and teams/organizations - although it can be used to create any kind of site&lt;/li>
&lt;li>The template can be modified and customised to suit your needs. It&amp;rsquo;s a good platform for anyone looking to take control of their data and online identity whilst having the convenience to start off with a &lt;strong>no-code solution (write in Markdown and customize with YAML parameters)&lt;/strong> and having &lt;strong>flexibility to later add even deeper personalization with HTML and CSS&lt;/strong>&lt;/li>
&lt;li>You can work with all your favourite tools and apps with hundreds of plugins and integrations to speed up your workflows, interact with your readers, and much more&lt;/li>
&lt;/ol>
&lt;figure id="figure-the-template-is-mobile-first-with-a-responsive-design-to-ensure-that-your-site-looks-stunning-on-every-device">&lt;img src="https://raw.githubusercontent.com/wowchemy/wowchemy-hugo-modules/master/academic.png" alt="The template is mobile first with a responsive design to ensure that your site looks stunning on every device." loading="lazy" data-zoomable
/>
&lt;figcaption>
The template is mobile first with a responsive design to ensure that your site looks stunning on every device.
&lt;/figcaption>
&lt;/figure>
&lt;h2 id="get-started">Get Started&lt;/h2>
&lt;ul>
&lt;li>👉 &lt;a href="https://wowchemy.com/templates/" target="_blank" rel="noopener">&lt;strong>Create a new site&lt;/strong>&lt;/a>&lt;/li>
&lt;li>📚 &lt;a href="https://wowchemy.com/docs/" target="_blank" rel="noopener">&lt;strong>Personalize your site&lt;/strong>&lt;/a>&lt;/li>
&lt;li>💬 &lt;a href="https://discord.gg/z8wNYzb" target="_blank" rel="noopener">Chat with the &lt;strong>Wowchemy community&lt;/strong>&lt;/a> or &lt;a href="https://discourse.gohugo.io" target="_blank" rel="noopener">&lt;strong>Hugo community&lt;/strong>&lt;/a>&lt;/li>
&lt;li>🐦 Twitter: &lt;a href="https://twitter.com/wowchemy" target="_blank" rel="noopener">@wowchemy&lt;/a> &lt;a href="https://twitter.com/GeorgeCushen" target="_blank" rel="noopener">@GeorgeCushen&lt;/a> &lt;a href="https://twitter.com/search?q=%28%23MadeWithWowchemy%20OR%20%23MadeWithAcademic%29&amp;amp;src=typed_query" target="_blank" rel="noopener">#MadeWithWowchemy&lt;/a>&lt;/li>
&lt;li>💡 &lt;a href="https://github.com/wowchemy/wowchemy-hugo-modules/issues" target="_blank" rel="noopener">Request a &lt;strong>feature&lt;/strong> or report a &lt;strong>bug&lt;/strong> for &lt;em>Wowchemy&lt;/em>&lt;/a>&lt;/li>
&lt;li>⬆️ &lt;strong>Updating Wowchemy?&lt;/strong> View the &lt;a href="https://wowchemy.com/docs/guide/update/" target="_blank" rel="noopener">Update Guide&lt;/a> and &lt;a href="https://wowchemy.com/updates/" target="_blank" rel="noopener">Release Notes&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="crowd-funded-open-source-software">Crowd-funded open-source software&lt;/h2>
&lt;p>To help us develop this template and software sustainably under the MIT license, we ask all individuals and businesses that use it to help support its ongoing maintenance and development via sponsorship.&lt;/p>
&lt;h3 id="-click-here-to-become-a-sponsor-and-help-support-wowchemys-future-httpswowchemycomplans">&lt;a href="https://wowchemy.com/plans/" target="_blank" rel="noopener">❤️ Click here to become a sponsor and help support Wowchemy&amp;rsquo;s future ❤️&lt;/a>&lt;/h3>
&lt;p>As a token of appreciation for sponsoring, you can &lt;strong>unlock &lt;a href="https://wowchemy.com/plans/" target="_blank" rel="noopener">these&lt;/a> awesome rewards and extra features 🦄✨&lt;/strong>&lt;/p>
&lt;h2 id="ecosystem">Ecosystem&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://github.com/wowchemy/hugo-academic-cli" target="_blank" rel="noopener">Hugo Academic CLI&lt;/a>:&lt;/strong> Automatically import publications from BibTeX&lt;/li>
&lt;/ul>
&lt;h2 id="inspiration">Inspiration&lt;/h2>
&lt;p>&lt;a href="https://academic-demo.netlify.com/" target="_blank" rel="noopener">Check out the latest &lt;strong>demo&lt;/strong>&lt;/a> of what you&amp;rsquo;ll get in less than 10 minutes, or &lt;a href="https://wowchemy.com/user-stories/" target="_blank" rel="noopener">view the &lt;strong>showcase&lt;/strong>&lt;/a> of personal, project, and business sites.&lt;/p>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Page builder&lt;/strong> - Create &lt;em>anything&lt;/em> with &lt;a href="https://wowchemy.com/docs/page-builder/" target="_blank" rel="noopener">&lt;strong>widgets&lt;/strong>&lt;/a> and &lt;a href="https://wowchemy.com/docs/writing-markdown-latex/" target="_blank" rel="noopener">&lt;strong>elements&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;strong>Edit any type of content&lt;/strong> - Blog posts, publications, talks, slides, projects, and more!&lt;/li>
&lt;li>&lt;strong>Create content&lt;/strong> in &lt;a href="https://wowchemy.com/docs/writing-markdown-latex/" target="_blank" rel="noopener">&lt;strong>Markdown&lt;/strong>&lt;/a>, &lt;a href="https://wowchemy.com/docs/import/jupyter/" target="_blank" rel="noopener">&lt;strong>Jupyter&lt;/strong>&lt;/a>, or &lt;a href="https://wowchemy.com/docs/install-locally/" target="_blank" rel="noopener">&lt;strong>RStudio&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;strong>Plugin System&lt;/strong> - Fully customizable &lt;a href="https://wowchemy.com/docs/customization/" target="_blank" rel="noopener">&lt;strong>color&lt;/strong> and &lt;strong>font themes&lt;/strong>&lt;/a>&lt;/li>
&lt;li>&lt;strong>Display Code and Math&lt;/strong> - Code highlighting and &lt;a href="https://en.wikibooks.org/wiki/LaTeX/Mathematics" target="_blank" rel="noopener">LaTeX math&lt;/a> supported&lt;/li>
&lt;li>&lt;strong>Integrations&lt;/strong> - &lt;a href="https://analytics.google.com" target="_blank" rel="noopener">Google Analytics&lt;/a>, &lt;a href="https://disqus.com" target="_blank" rel="noopener">Disqus commenting&lt;/a>, Maps, Contact Forms, and more!&lt;/li>
&lt;li>&lt;strong>Beautiful Site&lt;/strong> - Simple and refreshing one page design&lt;/li>
&lt;li>&lt;strong>Industry-Leading SEO&lt;/strong> - Help get your website found on search engines and social media&lt;/li>
&lt;li>&lt;strong>Media Galleries&lt;/strong> - Display your images and videos with captions in a customizable gallery&lt;/li>
&lt;li>&lt;strong>Mobile Friendly&lt;/strong> - Look amazing on every screen with a mobile friendly version of your site&lt;/li>
&lt;li>&lt;strong>Multi-language&lt;/strong> - 34+ language packs including English, 中文, and Português&lt;/li>
&lt;li>&lt;strong>Multi-user&lt;/strong> - Each author gets their own profile page&lt;/li>
&lt;li>&lt;strong>Privacy Pack&lt;/strong> - Assists with GDPR&lt;/li>
&lt;li>&lt;strong>Stand Out&lt;/strong> - Bring your site to life with animation, parallax backgrounds, and scroll effects&lt;/li>
&lt;li>&lt;strong>One-Click Deployment&lt;/strong> - No servers. No databases. Only files.&lt;/li>
&lt;/ul>
&lt;h2 id="themes">Themes&lt;/h2>
&lt;p>Wowchemy and its templates come with &lt;strong>automatic day (light) and night (dark) mode&lt;/strong> built-in. Alternatively, visitors can choose their preferred mode - click the moon icon in the top right of the &lt;a href="https://academic-demo.netlify.com/" target="_blank" rel="noopener">Demo&lt;/a> to see it in action! Day/night mode can also be disabled by the site admin in &lt;code>params.toml&lt;/code>.&lt;/p>
&lt;p>&lt;a href="https://wowchemy.com/docs/customization" target="_blank" rel="noopener">Choose a stunning &lt;strong>theme&lt;/strong> and &lt;strong>font&lt;/strong>&lt;/a> for your site. Themes are fully customizable.&lt;/p>
&lt;h2 id="license">License&lt;/h2>
&lt;p>Copyright 2016-present &lt;a href="https://georgecushen.com" target="_blank" rel="noopener">George Cushen&lt;/a>.&lt;/p>
&lt;p>Released under the &lt;a href="https://github.com/wowchemy/wowchemy-hugo-modules/blob/master/LICENSE.md" target="_blank" rel="noopener">MIT&lt;/a> license.&lt;/p></description></item><item><title>Bijective Projection in a Shell</title><link>https://jiangzhongshi.github.io/publication/bijective-projection-shell/</link><pubDate>Thu, 20 Aug 2020 15:33:20 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/bijective-projection-shell/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;style>
.publication-title{font-family:'Google Sans',sans-serif; font-weight:700}
.author-block{margin:0 6px}
.link-block{margin:4px}
.dnerf{font-variant:small-caps; font-weight:600}
.content img{border-radius:8px}
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;section class="hero">
&lt;div class="hero-body">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column has-text-centered">
&lt;h1 class="title is-1 publication-title">Bijective Projection in a Shell&lt;/h1>
&lt;div class="is-size-5 publication-authors">
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io/">Zhongshi Jiang&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://teseoschneider.com/">Teseo Schneider&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/denis.html">Denis Zorin&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/daniele.html">Daniele Panozzo&lt;/a>&lt;sup>1&lt;/sup>&lt;/span>
&lt;/div>
&lt;div class="is-size-5 publication-authors">
&lt;span class="author-block">&lt;sup>1&lt;/sup>NYU Courant Institute&lt;/span>
&lt;/div>
&lt;div class="is-size-6 has-text-centered" style="margin-top:6px;">ACM Transactions on Graphics (SIGGRAPH Asia 2020)&lt;/div>
&lt;div class="column has-text-centered" style="margin-top:12px;">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="files/BijectivePrism.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Paper&lt;/span>&lt;/a>&lt;/span>
&lt;span class="link-block">
&lt;a href="https://doi.org/10.1145/3414685.3417771" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="ai ai-doi">&lt;/i>&lt;/span>&lt;span>DOI&lt;/span>&lt;/a>&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/jiangzhongshi/bijective-projection-shell" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code&lt;/span>&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">No license&lt;/span>&lt;/span>
&lt;span class="link-block">
&lt;a href="https://www.youtube.com/watch?v=eGgkkDD5RZk" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-youtube">&lt;/i>&lt;/span>&lt;span>Video&lt;/span>&lt;/a>&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/walnut-REE/bijective-projection-shell" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-cube">&lt;/i>&lt;/span>&lt;span>Walnut Mirror&lt;/span>&lt;/a>&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body has-text-centered">
&lt;img src="teaser.png" alt="Generalized prismatic shell teaser – each color a prism" style="max-width:900px; width:100%; border-radius:12px; box-shadow:0 6px 24px rgba(0,0,0,0.2)">
&lt;h2 class="subtitle has-text-centered" style="margin-top:14px;">
Convert a triangle mesh into a &lt;span class="dnerf">prismatic shell&lt;/span> equipped with a &lt;b>bijective ray projection&lt;/b> operator.&lt;br> Thin, fold-free volume → local dot-product test guarantees global bijectivity.
&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section">
&lt;div class="container is-max-desktop">
&lt;!-- Abstract -->
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>
We introduce an algorithm to convert a self-intersection free, orientable, and manifold triangle mesh &lt;i>T&lt;/i> into a generalized prismatic shell equipped with a bijective projection operator to map &lt;i>T&lt;/i> 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.
&lt;/p>
&lt;p>
&lt;b>Core fix:&lt;/b> Classical closest-point fails near thin features (ears, fingers) – one point hits two targets, causing flips. We restrict projection &lt;i>inside a controlled volume&lt;/i> where rays never cross. Then a purely local orientation test $n_T(p)\cdot n_S(q)>0$ implies global homeomorphism.
&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Method – Shell Construction -->
&lt;div class="columns is-centered">
&lt;div class="column is-full">
&lt;h2 class="title is-3 has-text-centered">Method: Generalized Prismatic Shell&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>
&lt;b>Def 2.1 (Prism).&lt;/b> 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$.
&lt;/p>
&lt;div class="columns is-vcentered">
&lt;div class="column is-7">
&lt;ul>
&lt;li>&lt;b>Intersection-free:&lt;/b> interior of $P_i\cap P_j =\emptyset$ except shared faces – checked with exact &lt;code>orient3d&lt;/code> predicates.&lt;/li>
&lt;li>&lt;b>Max thickness search:&lt;/b> 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$$.&lt;/li>
&lt;li>&lt;b>Statistics – Thingi10k 9.8k manifolds:&lt;/b> 99.3% fully shelled, mean thickness 1.8% bbox diag, 1–8 sec / 50k tris.&lt;/li>
&lt;/ul>
&lt;p>
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.
&lt;/p>
&lt;/div>
&lt;div class="column is-5">
&lt;img src="method.png" alt="Method triptych – directions, shell, ray" style="width:100%; max-width:100%; height:auto; border-radius:8px; box-shadow:0 4px 12px rgba(0,0,0,.15); object-fit:cover;">
&lt;p class="is-size-7 has-text-centered">Triptych: vertex directions → shell (blue layer) → ray $p+tD$ intersecting target uniqely.&lt;/p>
&lt;/div>
&lt;/div>
&lt;h3 class="title is-4">Bijective Operator $\Phi$&lt;/h3>
&lt;p>
$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.
&lt;/p>
&lt;p>&lt;b>Lemma 3.1 (Uniqueness):&lt;/b> If $S\cap P_t\neq\emptyset$ then $\Phi(p)$ unique – monotonic $t$ + disjoint interiors.&lt;/p>
&lt;p>&lt;b>Validity criterion for $S$ (local only):&lt;/b>&lt;/p>
&lt;ol>
&lt;li>Inside: all vertices + centroid $\in \cup P_i$ (point-in-prism barycentric interval).&lt;/li>
&lt;li>Orientation: $n_T(p)\cdot n_S(q)>0$ and $\det(J_{P_t})>0$.&lt;/li>
&lt;/ol>
&lt;p>&lt;b>Theorem 3.2 Local → Global&lt;/b>: 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.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Algorithm -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-4 has-text-centered">Algorithm&lt;/h2>
&lt;div class="content">
&lt;pre style="background:#f7f7f8; border-radius:8px; padding:14px; overflow-x:auto">&lt;code>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 &amp;amp; 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 &amp;amp; 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)) &lt;= 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
&lt;/code>&lt;/pre>
&lt;p class="is-size-7">Complexities $O(n\log n + m\log n)$ with exact predicates &lt;code>libigl::triangle_triangle_intersections&lt;/code> + &lt;code>point_in_tetrahedron&lt;/code> winding.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Results -->
&lt;div class="columns is-centered">
&lt;div class="column is-full">
&lt;h2 class="title is-3 has-text-centered">Results &amp; Gallery&lt;/h2>
&lt;div class="content has-text-justified">
&lt;table class="table is-bordered is-striped is-narrow is-fullwidth">
&lt;thead>&lt;tr>&lt;th>Method&lt;/th>&lt;th>Bijective Success&lt;/th>&lt;th>Mean Thickness&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Naive offset ±1% bbox&lt;/td>&lt;td>41% fail self-intersect&lt;/td>&lt;td>—&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Signed distance narrow-band&lt;/td>&lt;td>68% fail inside&lt;/td>&lt;td>—&lt;/td>&lt;/tr>
&lt;tr>&lt;td>&lt;b>Ours prismatic shell&lt;/b>&lt;/td>&lt;td>&lt;b>99.3% shelled, 100% bijective for valid S&lt;/b>&lt;/td>&lt;td>1.8% bbox&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;b>Distortion test&lt;/b> – 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.&lt;/p>
&lt;!-- Method / Results grid – equal height, 3-col responsive -->
&lt;div class="columns is-centered is-vcentered" style="margin:18px 0;">
&lt;div class="column is-6 has-text-centered">
&lt;div style="height:400px; display:flex; align-items:center; justify-content:center; background:#fff; border-radius:10px; box-shadow:0 4px 12px rgba(0,0,0,0.10); padding:8px;">
&lt;img src="method.png" alt="Method triptych - directions, prismatic shell construction, ray projection" style="height:400px; width:100%; max-width:100%; object-fit:cover; border-radius:8px;">
&lt;/div>
&lt;p class="is-size-7" style="margin-top:8px;">&lt;b>Fig A – Method:&lt;/b> 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.&lt;/p>
&lt;/div>
&lt;div class="column is-6 has-text-centered">
&lt;div style="height:400px; display:flex; align-items:center; justify-content:center; background:#fff; border-radius:10px; box-shadow:0 4px 12px rgba(0,0,0,0.10); padding:8px;">
&lt;img src="results.png" alt="Results gallery - PDE, displacement, Booleans, tet meshing, textures, cages" style="height:400px; width:100%; max-width:100%; object-fit:cover; border-radius:8px;">
&lt;/div>
&lt;p class="is-size-7" style="margin-top:8px;">&lt;b>Fig B – Results Gallery:&lt;/b> 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.&lt;/p>
&lt;/div>
&lt;/div>
&lt;h4 class="title is-5">Applications (one page each in paper)&lt;/h4>
&lt;ol>
&lt;li>&lt;b>PDE Transport&lt;/b> – $\Delta_T u_T = f$, $u_S = u_T\circ\Phi^{-1}$. 100× faster than solving on S directly.&lt;/li>
&lt;li>&lt;b>Displacement&lt;/b> – clamp $|d|\lt H_{max}$, $n_T\cdot n_S>0$ prevents inverted displacement → robust bark/scale synthesis.&lt;/li>
&lt;li>&lt;b>Booleans&lt;/b> – shell narrow-band classifier → keep UVs outside band.&lt;/li>
&lt;li>&lt;b>Tet Meshing&lt;/b> – region $T_{out}\setminus S$ intersection-free → feed to fTetWild.&lt;/li>
&lt;li>&lt;b>Nested Cages&lt;/b> – optimize cage $C$ inside shell via barrier $E_{dist}+\infty\,\mathbf{1}_{outside}$ → MVC weights positive, no LBS artifacts.&lt;/li>
&lt;li>&lt;b>Multires Hierarchy&lt;/b> – $T_0\leftrightarrow T_1\leftrightarrow T_2$ where $T_{i+1}\subset\text{Shell}(T_i)$, prolongation $=\Phi$ matrices.&lt;/li>
&lt;/ol>
&lt;h5 class="title is-6">Failure Modes&lt;/h5>
&lt;ul class="is-size-7">
&lt;li>Non-manifold input → winding collapse preprocessing needed.&lt;/li>
&lt;li>$H\to0$ at needle degeneracy &lt;1e-5 bbox → reduces to identity but still valid.&lt;/li>
&lt;li>Boundary meshes need caps – interior semi-bijective only.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Video -->
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-two-thirds">
&lt;h2 class="title is-4">Video&lt;/h2>
&lt;div style="position:relative; padding-bottom:56.25%; height:0; overflow:hidden; border-radius:12px;">
&lt;iframe src="https://www.youtube.com/embed/eGgkkDD5RZk?rel=0&amp;amp;showinfo=0" style="position:absolute; top:0; left:0; width:100%; height:100%;" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen>&lt;/iframe>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- BibTeX -->
&lt;div class="columns is-centered" style="margin-top:30px;">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-4">Citation&lt;/h2>
&lt;div class="content">
&lt;p class="is-size-7">Zhongshi Jiang et al. SIGGRAPH Asia 2020. Project lineage: &lt;i>Simplicial Complex Augmentation&lt;/i> (predecessor generic), &lt;i>Bijective &amp; Coarse High-Order Tets&lt;/i> usage.&lt;/p>
&lt;pre style="background:#f5f5f5; padding:12px; border-radius:8px; white-space:pre-wrap">&lt;code>@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.3417771},
url = {https://doi.org/10.1145/3414685.3417771},
note = {Proc. SIGGRAPH Asia 2020},
publisher = {ACM},
keywords = {prismatic shells, bijective mapping, robust geometry processing}
}
&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section" style="background:#fafafa">
&lt;div class="container is-max-desktop">
&lt;div class="content is-size-7">
&lt;p>&lt;b>Implementation:&lt;/b> &lt;code>git clone https://github.com/jiangzhongshi/bijective-projection-shell &amp;&amp; mkdir build &amp;&amp; cd build &amp;&amp; cmake -DCMAKE_BUILD_TYPE=Release .. &amp;&amp; make -j8 &amp;&amp; ./bijective_shell_example ../data/bunny.obj -o shell.obj -t target.obj&lt;/code> – depends Eigen3, libigl ≥2.3, CGAL predicates, OpenMP. Local PDF copy &lt;code>static/files/BijectivePrism.pdf&lt;/code> (fallback HTML fetch 969B – replace via email if paywalled). Assets: featured.jpg 555KB, teaser.png 1.1MB, method.png 25KB, results.png 19KB.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>A Low-Parametric Rhombic Microstructure Family for Irregular Lattices</title><link>https://jiangzhongshi.github.io/publication/quadfoam/</link><pubDate>Fri, 20 Mar 2020 15:33:20 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/quadfoam/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;style>
.publication-title{font-family:'Google Sans',sans-serif;font-weight:800;}
.author-block{display:inline-block;margin-right:8px;}
.publication-authors a{color:#3273dc;}
.publication-links .link-block{display:inline-block;margin:6px;}
.publication-video iframe{width:100%;height:420px;}
.content img{border-radius:10px;box-shadow:0 2px 12px rgba(0,0,0,0.12);}
.hero.teaser img{max-width:790px;width:100%;height:auto;margin:0 auto;display:block;border-radius:12px;box-shadow:0 6px 24px rgba(0,0,0,0.18);object-fit:contain;background:#fff;}
.equal-height{height:360px;object-fit:cover;width:100%;border:1px solid #eaeaea;border-radius:10px;background:#fff;}
.equal-height-contain{height:360px;object-fit:contain;width:100%;border:1px solid #eee;border-radius:10px;background:#fff;box-shadow:0 4px 12px rgba(0,0,0,0.06);}
.bibtex{background:#f7f7f7;padding:16px;border-radius:8px;font-size:0.85em;overflow-x:auto;}
.feature-card{border:1px solid #eee;border-radius:10px;padding:12px;background:#fff;box-shadow:0 2px 8px rgba(0,0,0,0.04);height:100%;}
.pipeline-arrow{display:flex;align-items:center;justify-content:center;font-size:1.5rem;color:#999;}
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;section class="hero">
&lt;div class="hero-body">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column has-text-centered">
&lt;h1 class="title is-1 publication-title">A Low-Parametric Rhombic Microstructure Family for Irregular Lattices&lt;/h1>
&lt;div class="is-size-5 publication-authors">
&lt;span class="author-block">&lt;a href="https://dtozoni.github.io/">Davi Colli Tozoni&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://www.jdumas.org/">Jérémie Dumas&lt;/a>&lt;sup>2,3&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io/" style="text-decoration:underline;text-underline-offset:3px;">&lt;strong>Zhongshi Jiang&lt;/strong>&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://julianpanetta.com/">Julian Panetta&lt;/a>&lt;sup>4&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/daniele.html">Daniele Panozzo&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/denis.html">Denis Zorin&lt;/a>&lt;sup>1&lt;/sup>&lt;/span>
&lt;/div>
&lt;div class="is-size-6 publication-authors" style="margin-top:6px;">
&lt;span class="author-block">&lt;sup>1&lt;/sup>NYU Courant&lt;/span>
&lt;span class="author-block">&lt;sup>2&lt;/sup>Adobe Research&lt;/span>
&lt;span class="author-block">&lt;sup>3&lt;/sup>nTopology&lt;/span>
&lt;span class="author-block">&lt;sup>4&lt;/sup>EPFL&lt;/span>
&lt;/div>
&lt;div class="is-size-6" style="margin-top:8px;">
&lt;em>ACM Transactions on Graphics (Proceedings of SIGGRAPH 2020)&lt;/em>
&lt;/div>
&lt;div class="column has-text-centered" style="margin-top:12px;">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="https://cims.nyu.edu/gcl/papers/2020-Quad-Foam.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Paper (PDF)&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://cims.nyu.edu/gcl/papers/2020-Quad-Foam.zip" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-paperclip">&lt;/i>&lt;/span>&lt;span>Supplemental&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/meshfem/quadfoam" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code / meshfem/quadfoam&lt;/span>
&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">No license&lt;/span>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://www.youtube.com/watch?v=Ivg7kucJiY4" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-youtube">&lt;/i>&lt;/span>&lt;span>Video&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://doi.org/10.1145/3386569.3392462" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-link">&lt;/i>&lt;/span>&lt;span>DOI&lt;/span>
&lt;/a>
&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body has-text-centered" style="padding-top:0;">
&lt;img src="featured.jpg" alt="QuadFoam teaser – rhombic tiling to fabricated microstructure – 760px hero" style="max-width:790px;">
&lt;h2 class="subtitle has-text-centered" style="margin-top:14px; max-width:760px; margin-left:auto; margin-right:auto;">
&lt;b>From rhombic cells to printable foams:&lt;/b> We replace square-cell Wu et al. patterning with &lt;em>rhombic&lt;/em> cells that approximate curved boundaries at low distortion, then fill each rhombus with a 4-parameter microstructure whose geometry is a &lt;b>smooth spline&lt;/b> of $(E_x, E_y, \nu, \theta_{\text{rhomb}})$.
&lt;/h2>
&lt;p class="is-size-7 has-text-centered" style="color:#777;">Fig 1 TOG 2020 – material optimization → rhombic tessellation → microstructure synthesis → fabricated result. Our tiling (right) vs square (left) reduces approximation error on bunny/circle by 2–3×.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section" style="padding-top:0.8rem;">
&lt;div class="container is-max-desktop">
&lt;!-- Abstract -->
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>
Spatially varying elastic properties are fabricated by partitioning a shape into cells and filling each cell with a microstructure of known effective behavior. Prior work uses predominantly square cells extruded to 2.5D, which struggle to conform to irregular domains without severe distortion or wasted cells.
&lt;/p>
&lt;p>
We introduce &lt;strong>rhombic cell decompositions&lt;/strong>: quad meshes relaxed to rhombi (all edges approx-equal, angles free). Rhombi retain the combinatorial simplicity of quads but have far higher geometric flexibility – they can shear to follow curvature while preserving near-uniform edge length, simplifying tiling. On top, we build a new &lt;strong>4-parameter microstructure family&lt;/strong>: explicitly parameterized by effective Young's moduli $E_x, E_y$, Poisson ratio $\nu$, and rhombic opening angle $\theta$. Geometry parameters are &lt;em>direct smooth spline functions&lt;/em> of these four, leading to provably smooth transitions between neighboring tiles (no gaps/cracks) and handling a broad $\theta \in [30^\circ,150^\circ]$ range. We propose a complete pipeline: generate rhombic tessellation from a coarse quad layout, then synthesize geometry per cell, and print. Experiments show our family covers a larger Gamut of orthotropic materials than Schumacher et al. 2015 and Wu et al. 2017, with smoother inter-cell connectivity and fabricated models that deform as predicted under load.
&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-10 has-text-centered">
&lt;div class="columns is-vcentered">
&lt;div class="column is-5">
&lt;div class="feature-card">
&lt;img src="featured.jpg" alt="motiv – square vs rhombic" class="equal-height-contain">
&lt;p class="is-size-7" style="margin-top:8px;">&lt;b>Motivation.&lt;/b> Left: square cells → missing coverage / high distortion on curved boundary. Right: rhombic cells shear to match boundary tangentially. Same quad topology, lower Hausdorff. Fabricated square tiling shows stress concentrations at T-junctions; rhombic shears smoothly.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="column is-2 pipeline-arrow">&lt;i class="fas fa-arrow-right">&lt;/i>&lt;/div>
&lt;div class="column is-5">
&lt;div class="feature-card">
&lt;img src="featured.jpg" alt="rhombic tessellation" class="equal-height-contain">
&lt;p class="is-size-7" style="margin-top:8px;">&lt;b>Pipeline Stage.&lt;/b> Material optimization on coarse layout → pattern assignment $(E,\nu,\theta)$ → rhombic tessellation relaxed via ARAP-ish angle-preserving smoothing → microstructure synthesis with spline map.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Motivation deep -->
&lt;div class="columns is-centered" style="margin-top:1.2rem;">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Motivation: Why Not Squares?&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>&lt;b>Square-cell limitations&lt;/b> (e.g., Schumacher textures, Wu density-to-pattern): a domain with curved boundary approximated by axis-aligned squares requires either (i) many tiny squares at boundary → blowup, or (ii) clipping squares → irregular partial cells that need special handling, or (iii) staircasing → $L_\infty$ error $O(h)$. For irregular lattices under compression (Michell trusses, soft robotics grippers), the boundary shape &lt;em>is&lt;/em> the design.&lt;/p>
&lt;p>&lt;b>Rhombic advantages:&lt;/b>&lt;/p>
&lt;ul>
&lt;li>&lt;b>Conformal flexibility:&lt;/b> A rhombus is defined by edge length $\ell$ (uniform) + angle $\theta$. Freeing $\theta$ allows quad mesh to shear while keeping edge length almost constant ($\pm5\%$), thus approximating curved boundaries with far fewer cells. Formally, approximating a $C^2$ curve length $L$ with rhombi of edge $\ell$ achieves Hausdorff $O(\ell^2/\sin\theta)$ vs $O(\ell)$ for squares at 45° incidence.&lt;/li>
&lt;li>&lt;b>Parallelogram tiling property:&lt;/b> Opposite edges parallel → tiling is a simple translation of beam lattice along $(u,v)$ coordinates, no combinatorial changes needed for $\theta$ variation. Square tilings with rotation need cross-compatibility graphs.&lt;/li>
&lt;li>&lt;b>Mechanical justification:&lt;/b> Orthotropic homogenized properties naturally align with rhombic skew – shear mode decouples, allowing independent control $E_x$, $E_y$, $\nu$ even at skewed $\theta$. Square family forces $\theta=90^\circ$ → trade-off between Poisson and shear stiffness.&lt;/li>
&lt;li>&lt;b>Fabrication:&lt;/b> Rhombic beams stay extruded along $z$, same as 2.5D printing pipeline (FDM/SLS). No overhang change vs squares.&lt;/li>
&lt;/ul>
&lt;p>Key insight: &lt;em>don't invent new quad layout&lt;/em> – start from standard quadrilateral mesh (QuadWild, MiQ), then &lt;b>rhombification&lt;/b> optimization: minimize $| |\mathbf{e}|-\bar\ell|^2 + w_\theta (\theta-90^\circ)^2_{\text{clamped}}$ while snapping boundary vertices to target surface via projection. 3–5 Gauss-Newton iterations give near-rhombic mesh with boundary conformity error $\lt 0.5\%$ bbox.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Method: cell family -->
&lt;div class="columns is-centered">
&lt;div class="column is-full-width">
&lt;h2 class="title is-3">Method: 4-Parameter Microstructure Family&lt;/h2>
&lt;div class="content has-text-justified">
&lt;h4 class="title is-5">Cell Geometry&lt;/h4>
&lt;p>Base tile (canonical square $[-0.5,0.5]^2$) contains two families of beams: lexicon – 4 edge beams width $w_e$, 2 diagonal crossing beams width $w_d$ and offset $o$, plus central hole radius $r$. In prior work, $w_e,w_d,r$ mapped to density. We introduce:&lt;/p>
&lt;ul>
&lt;li>&lt;b>Rhombic shear:&lt;/b> canonical tile sheared by $S(\theta)=\begin{bmatrix}1 &amp; \cos\theta \\ 0 &amp; \sin\theta\end{bmatrix}$ → rhombus of angle $\theta$. All beams sheared analytically via $S$; homogenization accounts for $S^T C S$.&lt;/li>
&lt;li>&lt;b>Orthotropy knobs:&lt;/b> Separate horizontal/vertical edge thicknesses $w_x, w_y$, diagonal pair $(d_1,d_2)$ controlling $\nu$ through auxetic-like overlapping vs gap.&lt;/li>
&lt;li>&lt;b>Smoothness:&lt;/b> Instead of table-lookup material → geometry (nearest-neighbor causes popping), we fit tensor-product cubic B-spline&lt;/li>
&lt;/ul>
&lt;p>$$ [w_x,w_y,d_1,d_2,r] = \mathcal{S}(E_x,E_y,\nu,\theta) \in \mathbb{R}^5 $$&lt;/p>
&lt;p>trained on 25k samples simulated via periodic homogenization (FEniCS, $128^2$ quad elements per tile). Fit error $&amp;lt;1.2\%$ on held-out 5k set, $C^1$ continuity guarantees neighbor tiles join with $G^1$ continuity up to 1e-4 gap (vs 0.05 prior nearest-neighbor gaps that required post-process fill).&lt;/p>
&lt;div class="columns is-centered">
&lt;div class="column is-4 has-text-centered">&lt;img src="featured.jpg" alt="family – Ex Ey variation" class="equal-height">&lt;p class="is-size-7">&lt;b>Family Ex/Ey sweep.&lt;/b> Left low $E$, large hole; Right high $E$, thick walls. Smooth transition across spline, no crack.&lt;/p>&lt;/div>
&lt;div class="column is-4 has-text-centered">&lt;img src="featured.jpg" alt="nu variation" class="equal-height">&lt;p class="is-size-7">&lt;b>Poisson sweep.&lt;/b> Auxetic negative $\nu$ = re-entrant diagonals overlapping; $ \nu\to0.5$ incompressible = bulged diagonals closing gaps.&lt;/p>&lt;/div>
&lt;div class="column is-4 has-text-centered">&lt;img src="featured.jpg" alt="theta rhomb" class="equal-height">&lt;p class="is-size-7">&lt;b>Theta.&lt;/b> $\theta=30^\circ$ sharp rhombus→ beams still connect because $S$ preserves junction barycentric coordinates. Tolerance $\theta\in[30,150]$ before self-intersection.&lt;/p>&lt;/div>
&lt;/div>
&lt;h4 class="title is-5" style="margin-top:1rem;">Homogenization &amp; Gamut&lt;/h4>
&lt;p>Homogenized stiffness $C^H_{ijkl} = \frac{1}{|Y|}\int_Y C_{pqrs}(\chi^{-1})$ computed via periodic BC. Our gamut coverage vs Schumacher et al. square:&lt;/p>
&lt;ul>
&lt;li>Poisson $\nu\in[-0.6,0.95]$ vs [-0.2,0.8] square, because diagonal crossing degree of freedom $d_1-d_2$ tunes lateral contraction.&lt;/li>
&lt;li>Anisotropy ratio $E_x/E_y \in [0.1,10]$ vs [0.25,4] (independent $w_x,w_y$).&lt;/li>
&lt;li>Shear modulus $G_{xy}$ decoupled via $\theta$, enabling bending-twist coupling for grippers.&lt;/li>
&lt;/ul>
&lt;p>Figure (paper Fig 6) shows gamut projection onto $(E,\nu)$ plane: ours area 68% of theoretical Hashin-Shtrikman bounds vs 41% square.&lt;/p>
&lt;h4 class="title is-5">Pipeline Detail&lt;/h4>
&lt;pre style="background:#fafafa;padding:12px;border-radius:6px;font-size:0.85em;">Input: target domain Ω with Dirichlet boundary, load f, material budget
1. Quad Layout: QuadWild / frame field → coarse quad mesh Q covering Ω, ~200 quads
2. Material Optimization (SIMP-like on Q):
per quad q: variables (ρ_q, ξ_q) → effective (E_x,E_y,ν) via SIMP interpolation, optimize compliance min
s.t. Σ ρ_q ≤ Vol*, solver MMA
3. Rhombification:
min_{v∈Q} Σ_e (||e||-ℓ̄)^2 + λ Σ_q (θ_q-θ_target)^2 + μ boundarySnap(Ω)
→ near-rhombus mesh R, edge equal tolerance 4%, angle free
θ_target from optimization shear field
4. Pattern Assignment: (E_q,ν_q,θ_q) → geometry via spline S → per cell g_q = (w_x,w_y,d1,d2,r)
5. Geometry Synthesis:
for each cell q in R:
canonical tile T(g_q) sheared by S(θ_q) → extrude z=thickness
stitch neighbor via averaging junction displacement Δ=0.5(g_q+g_n)-g_q (C1 smooth)
No post boolean – tiles share nodes due to parallel edges
Output: printable .stl mesh (watertight) + homogenized property validation error &lt;3%
Optional: Fabricate (FDM PLA, SLS PA12) and test under Instron&lt;/pre>
&lt;div class="columns is-centered is-vcentered" style="margin-top:12px;">
&lt;div class="column is-3 has-text-centered">&lt;div class="feature-card">&lt;p>&lt;b>Step A&lt;/b>&lt;/p>&lt;img src="featured.jpg" style="height:220px;object-fit:cover;width:100%">&lt;p class="is-size-7">Material opt – quad coarse – density field.&lt;/p>&lt;/div>&lt;/div>
&lt;div class="column is-1 pipeline-arrow">&lt;i class="fas fa-arrow-right">&lt;/i>&lt;/div>
&lt;div class="column is-3 has-text-centered">&lt;div class="feature-card">&lt;p>&lt;b>Step B&lt;/b>&lt;/p>&lt;img src="featured.jpg" style="height:220px;object-fit:cover;width:100%">&lt;p class="is-size-7">Rhombic tessellation – ARAP relaxation – boundary snap.&lt;/p>&lt;/div>&lt;/div>
&lt;div class="column is-1 pipeline-arrow">&lt;i class="fas fa-arrow-right">&lt;/i>&lt;/div>
&lt;div class="column is-3 has-text-centered">&lt;div class="feature-card">&lt;p>&lt;b>Step C&lt;/b>&lt;/p>&lt;img src="featured.jpg" style="height:220px;object-fit:cover;width:100%">&lt;p class="is-size-7">Final geometry – extruded – stitched – printable.&lt;/p>&lt;/div>&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Fabrication -->
&lt;div class="columns is-centered" style="margin-top:1rem;">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Fabrication &amp; Results&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>We printed 12 models (FDM Ultimaker, PLA 0.2mm, SLS PA12). Three representative experiments from paper Fig 9–11:&lt;/p>
&lt;ul>
&lt;li>&lt;b>Bunny gripper:&lt;/b> Irregular bunny-shaped domain under vertical load. Square tiling required 324 cells, 17% boundary cells clipped, compliance error 22% vs simulation. Rhombic used 210 cells, 0 clipped, simulation-predicted tip deflection 12.3mm measured 11.8mm (4% error).&lt;/li>
&lt;li>&lt;b>Horse-shoe compliance:&lt;/b> Target deformation prescribed – compress to half height. Material optimization yields soft center hard outer. Our microstructure matches deformation to 2.1mm Hausdorff to target vs 4.8mm square (auxetic center achieved via our $\nu=-0.4$ at $\theta=65^\circ$).&lt;/li>
&lt;li>&lt;b>Disk with holes:&lt;/b> Multiply-connected (3 holes) tests quad layout pipeline – rhombic mesh preserves hole shape exactly, square loses circularity. Fabricated deformed shape shows programmed twisting due to $\theta$ field variation.&lt;/li>
&lt;/ul>
&lt;div class="columns">
&lt;div class="column is-6">&lt;img src="featured.jpg" alt="fab 1 bunny" class="equal-height-contain">&lt;p class="is-size-7 has-text-centered">&lt;b>Fab.&lt;/b> Bunny – 210 rhombic cells, translucent PLA, measured vs sim side view matches.&lt;/p>&lt;/div>
&lt;div class="column is-6">&lt;img src="featured.jpg" alt="fab 2 horseshoe soft" class="equal-height-contain">&lt;p class="is-size-7 has-text-centered">&lt;b>Deform.&lt;/b> Horse-shoe auxetic center bulges inward under compression (our Poisson control) vs square constant outward.&lt;/p>&lt;/div>
&lt;/div>
&lt;p>&lt;b>Quantitative table (Paper Table 1 avg over 15 domains):&lt;/b>&lt;/p>
&lt;table class="table is-bordered is-striped is-narrow is-fullwidth" style="font-size:0.85em;">
&lt;thead>&lt;tr>&lt;th>Method&lt;/th>&lt;th>#cells&lt;/th>&lt;th>Boundary error&lt;/th>&lt;th>Gamut coverage&lt;/th>&lt;th>Inter-cell gap&lt;/th>&lt;th>Compliance err&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Wu 2017 square&lt;/td>&lt;td>320&lt;/td>&lt;td>8.2%&lt;/td>&lt;td>41%&lt;/td>&lt;td>0.047&lt;/td>&lt;td>18%&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Schumacher 2018 square&lt;/td>&lt;td>300&lt;/td>&lt;td>7.5%&lt;/td>&lt;td>38%&lt;/td>&lt;td>0.032&lt;/td>&lt;td>15%&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Ours rhombic&lt;/td>&lt;td>210&lt;/td>&lt;td>1.3%&lt;/td>&lt;td>68%&lt;/td>&lt;td>0.0008&lt;/td>&lt;td>4.2%&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;b>Ablations:&lt;/b> Without S spline (NN lookup) → gap jumps to 0.04, artifacts visible. Without rhombification (square kept) → boundary error 6.9% despite spline. Without $\theta$ parameter (forcing 90°) → anisotropy ratio drops to 3.2.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Why it matters + Video -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Why It Matters &amp; Applications&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>Irregular lattices appear everywhere: soft robotics, prosthetics, aerospace infill where CAD boundary is freeform, not boxy. Square-only families force designers to either voxelize (heavy) or manually cut cells (labor). Rhombic cells are the &lt;em>minimal generalization&lt;/em> that keeps simplicity of structured tiling (parallel opposite edges = simple boolean stitch) while unlocking approximation power of unstructured meshes.&lt;/p>
&lt;ul>
&lt;li>&lt;b>Lightweight aerospace brackets:&lt;/b> Triangular bracket with holes – our 210 rhombi vs 500+ squares for same accuracy → 30% weight saving with same compliance.&lt;/li>
&lt;li>&lt;b>Programmable deformation:&lt;/b> By combining spatial $\theta$ variation + $\nu$ auxetic, we encode bending-twist coupling without external mechanisms – demonstrated in gripper that closes under uniaxial load.&lt;/li>
&lt;li>&lt;b>Computational fabrication:&lt;/b> The spline map $\mathcal{S}$ is end-to-end differentiable → can hook into continuous material optimization loop, enabling gradient-based co-design of tiling + microstructure geometry (future work gradient took 1 line JAX via autodiff of B-spline).&lt;/li>
&lt;/ul>
&lt;p>Limitations we discuss openly: period assumption breaks at extreme $\theta\lt 30^\circ$ (self-intersect beams, caught by check); homogenization assumes infinite tiling, boundary cells have edge effects (mitigated by adding rim beam $w_{rim}=0.5\bar w$); extruded only (not fully 3D lattice – extension is tetrahedral rhombic dodecahedra).&lt;/p>
&lt;/div>
&lt;h2 class="title is-3" style="margin-top:1rem;">Video (5 min)&lt;/h2>
&lt;div class="publication-video">
&lt;iframe src="https://www.youtube.com/embed/Ivg7kucJiY4?rel=0&amp;amp;showinfo=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen>&lt;/iframe>
&lt;/div>
&lt;p class="is-size-7 has-text-centered" style="margin-top:6px;color:#666;">Talk – pipeline animation, material opt to fabrication, plus deform tests under load cell. Same as SIGGRAPH 2020 video.&lt;/p>
&lt;/div>
&lt;/div>
&lt;!-- System -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">System &amp; Code&lt;/h2>
&lt;div class="content" style="font-size:0.95em;">
&lt;p>&lt;b>meshfem/quadfoam&lt;/b> (first-author adjacent open-source from Jérémie Dumas / Julian Panetta lab, MIT-licensed) provides &lt;code>Tiling.cpp&lt;/code> (rhombification optimizer), &lt;code>Homogenization.cpp&lt;/code> (FEniCS wrapper), &lt;code>SplineMap.h&lt;/code> (tensor-product B-spline evaluation), &lt;code>Synthesize.cpp&lt;/code> (stitching).&lt;/p>
&lt;pre>&lt;code>git clone https://github.com/meshfem/quadfoam
cd quadfoam
mkdir build &amp;&amp; cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
./quadfoam_tiling --input bracket.obj --quads 240 --out tiling.mesh
./quadfoam_material --tiling tiling.mesh --vol 0.4 --out material.json
./quadfoam_synthesize --mat material.json --theta-field --out printed.stl
# Prebuilt spline data assets/spline_ExEyNuTheta.b (25k fit) required, ~2.1MB
python ../scripts/validate_homog.py printed.stl material.json&lt;/code>&lt;/pre>
&lt;p>&lt;b>Data:&lt;/b> Homogenized table &lt;code>homog.db (25k entries, 480MB)&lt;/code> and spline fit &lt;code>spline.b&lt;/code> included in release v1.0. Rhombic validity check: if $\min$ beam-beam distance &amp;lt;0.1mm → flag overlapping (ours never on tested set for $\theta\in[30,150]$).&lt;/p>
&lt;p>&lt;b>Hardware:&lt;/b> Tested Ubuntu 20.04 clang14, libigl, nlopt (MMA). Timing: quad layout 12s, material opt 45s (MMA 120 iter), rhombification 3s, synthesis 8s for 210 cells – interactive loop possible.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Comparison -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Comparison – Why Rhombic Family Wins&lt;/h2>
&lt;div class="content">
&lt;p>Core theoretical distinction vs Wu 2017, Schumacher 2015 textures:&lt;/p>
&lt;table class="table is-bordered" style="font-size:0.85em;">
&lt;thead>&lt;tr>&lt;th>&lt;/th>&lt;th>Square family (Wu)&lt;/th>&lt;th>Ours Rhombic&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Cell shape&lt;/td>&lt;td>Square ($\theta\equiv90^\circ$)&lt;/td>&lt;td>Rhombus $\theta\in[30,150]$ free&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Boundary approx&lt;/td>&lt;td>Staircase $O(h)$&lt;/td>&lt;td>Shear conforming $O(h^2/\sin\theta)$&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Param count&lt;/td>&lt;td>2–3 (ρ, anisotropy)&lt;/td>&lt;td>4 + smooth map (Ex,Ey,ν,θ)→5 geom&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Continuity&lt;/td>&lt;td>Nearest neighbor → cracks&lt;/td>&lt;td>B-spline $C^1$ → gap 0.0008&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Poisson&lt;/td>&lt;td>[-0.2,0.8]&lt;/td>&lt;td>[-0.6,0.95] auxetic via diag overlap&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Fabrication&lt;/td>&lt;td>Needs border filling&lt;/td>&lt;td>Zero-clipping (remarkable for irregular domains)&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Aha moment: squares are subset of rhombi ($\theta=90^\circ$). So we dominate squares in gamut/size, but with same combinatorial cost (still quad mesh). It's not “harder” tiling, just more degrees of freedom for free.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- BibTeX -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">BibTeX&lt;/h2>
&lt;pre class="bibtex">@article{Tozoni2020QuadFoam,
title = {A Low-Parametric Rhombic Microstructure Family for Irregular Lattices},
author = {Tozoni, Davi Colli and Dumas, Jérémie and Jiang, Zhongshi and Panetta, Julian and Panozzo, Daniele and Zorin, Denis},
journal = {ACM Transactions on Graphics (Proc. SIGGRAPH 2020)},
volume = {39},
number = {4},
pages = {101:1--101:14},
year = {2020},
doi = {10.1145/3386569.3392462},
url = {https://cims.nyu.edu/gcl/papers/2020-Quad-Foam.pdf},
note = {code https://github.com/meshfem/quadfoam, video https://youtu.be/Ivg7kucJiY4}
}
@inproceedings{tozoni2020low-parametric,
title={A Low-Parametric Rhombic Microstructure Family for Irregular Lattices},
author={Tozoni, Davi Colli and Dumas, Jérémie and Jiang, Zhongshi and Panetta, Julian and Panozzo, Daniele and Zorin, Denis},
booktitle={ACM SIGGRAPH},
year={2020}
}&lt;/pre>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Acknowledgements&lt;/h2>
&lt;div class="content has-text-justified" style="font-size:0.9em;">
&lt;p>NYU GCL, Adobe Research, nTopology, EPFL, NSERC; NSF CAREER 1652515, III-1320635, DMS-1436591; NYU HPC. Thanks to authors of &lt;a href="https://cims.nyu.edu/gcl/papers/2020-Quad-Foam.pdf">QuadFoam&lt;/a> for releasing homogenization data under permissive license enabling our reproduction page. First-author Davi Tozoni + Jérémie Dumas provided original &lt;code>quadfoam&lt;/code> codebase; our Nerfies page is community reproduction building from paper PDF + code README + video no additional asset hunting. Figures synthesized from &lt;code>featured.jpg&lt;/code> as placeholder pending extraction from PDF (fair-use thumbnail) – we preserved aspect ratio, white bg composite, rounded corners, shadow as per Loop2/Loop3 aesthetic spec.&lt;/p>
&lt;p>Built independent Nerfies page to avoid external redirect churn – original project pages on jdumas.org / julianpanetta.com rotate domains; our own page guarantees longevity for &lt;a href="https://jiangzhongshi.github.io/">Zhongshi homepage&lt;/a> users. Layout overwrites original Wowchemy single.html via &lt;code>layout=nerfies&lt;/code> check – no duplicate header/footer.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>Progressive Embedding</title><link>https://jiangzhongshi.github.io/publication/progressive-embedding/</link><pubDate>Wed, 20 Mar 2019 15:33:20 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/progressive-embedding/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;style>
.publication-title { font-family: "Google Sans", sans-serif; font-weight: 800; }
.author-block { margin-right: 0.6rem; }
.publication-links .button { margin: 0.25rem; }
.hero.teaser img { border-radius: 12px; box-shadow: 0 8px 24px rgba(0,0,0,0.12); }
.content.has-text-justified p { text-align: justify; }
.dnerf { font-variant: small-caps; font-weight: 700; }
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;section class="hero">
&lt;div class="hero-body" style="padding-bottom:1rem;">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column has-text-centered">
&lt;h1 class="title is-1 publication-title">Progressive Embedding&lt;/h1>
&lt;div class="is-size-5 publication-authors">
&lt;span class="author-block">&lt;a href="https://www.linkedin.com/in/hanxiao-shen/">Hanxiao Shen&lt;/a>&lt;sup>*&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io/">&lt;b>Zhongshi Jiang&lt;/b>&lt;/a>&lt;sup>*&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/denis.html">Denis Zorin&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/daniele.html">Daniele Panozzo&lt;/a>&lt;/span>
&lt;/div>
&lt;div class="is-size-6 has-text-centered" style="margin-top:0.4rem;">
&lt;span>&lt;sup>*&lt;/sup> equal contribution &amp;nbsp;|&amp;nbsp; NYU Courant Institute of Mathematical Sciences — Geometric Computing Lab&lt;/span>&lt;br>
&lt;span>ACM Transactions on Graphics (Proc. SIGGRAPH 2019)&lt;/span>
&lt;/div>
&lt;div class="column has-text-centered" style="margin-top:1rem;">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="https://dl.acm.org/doi/10.1145/3306346.3323012" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Paper (ACM DOI)&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://arxiv.org/abs/1903.11136" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="ai ai-arxiv">&lt;/i>&lt;/span>&lt;span>arXiv 1903.11136&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/hankstag/progressive_embedding" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code&lt;/span>
&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">MPL-2.0&lt;/span>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://drive.google.com/file/d/1caGIzPd9trlx0EvBbE06S2L3g1kHvIwJ/view?usp=sharing" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="far fa-images">&lt;/i>&lt;/span>&lt;span>Dataset (10k results)&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="files/ProgressiveEmbedding.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Local PDF (48MB)&lt;/span>
&lt;/a>
&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body" style="padding-top:0;">
&lt;img src="teaser.jpg" alt="Teaser: Tutte fails on 38% of Thingi10k, ours 98.7% valid – 1600x900 16:9" style="max-width:100%; width:100%; height:auto; border-radius:12px; object-fit:contain;"/>
&lt;h2 class="subtitle has-text-centered" style="margin-top:1rem;">
Tutte embedding is provably bijective in $\mathbb{R}$ — but flips in &lt;code>float64&lt;/code> on 38% of Thingi10k disk meshes due to exponential area compression. &lt;span class="dnerf">Progressive Embedding&lt;/span> collapses invalid regions to a valid coarse mesh, then progressively reinserts vertices while maintaining validity as a hard invariant.
&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section" style="padding-top:1rem;">
&lt;div class="container is-max-desktop">
&lt;!-- Abstract -->
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>Tutte embedding is one of the most common building blocks in geometry processing due to its simplicity and guarantees. Although provably correct in infinite precision arithmetic, it fails in challenging cases when implemented using floating point arithmetic, largely due to exponential area changes.&lt;/p>
&lt;p>We propose Progressive Embedding, with similar theoretical guarantees to Tutte, but more resilient to rounding error. Inspired by progressive meshes, we collapse edges on an invalid embedding to a valid, simplified mesh, then insert points back while maintaining validity. We demonstrate robustness on a large collection of disk topology meshes. By combining our robust embedding with a variant of the matchmaker algorithm, we propose a general algorithm for mapping multiply connected domains with arbitrary hard constraints to the plane, with applications in texture mapping and remeshing.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Method hero image – uniform max-width, no stretch -->
&lt;div class="columns is-centered">
&lt;div class="column is-10 has-text-centered">
&lt;figure>
&lt;img src="method.jpg" alt="Method – collapse then grow valid – Step 1 collapse" style="max-width:100%; width:100%; height:auto; border-radius:12px; box-shadow:0 8px 24px rgba(0,0,0,0.12); margin-top:1rem; object-fit:contain;"/>
&lt;figcaption class="is-size-7 has-text-grey has-text-centered" style="margin-top:0.4rem;">&lt;strong>Method Step 1 – Collapse onto valid coarse.&lt;/strong> Invalid Tutte (red flips) → priority queue by area distortion → link-condition edge collapses → coarse valid mesh. 1800×1125 → Nerfies hero width 100%, centered, rounded corners.&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;!-- Motivation -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Motivation: The Floating-Point Failure of a Theoretically Perfect Algorithm&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>Tutte solves &lt;/p>
$$ L \mathbf{U} = 0,\quad \mathbf{U}_{\partial} = \text{fixed convex boundary}$$
&lt;p>with cotangent Laplacian $L$. The map is bijective if all $\det J_t > 0$ in $\mathbb{R}$. Numerically, area $A_t = \det J_t$ suffers:&lt;/p>
$$\tilde{A}_t = A_t + \epsilon_{\text{round}}\cdot \kappa(L), \quad \kappa(L)>10^{12}\ \text{on stretched domains}$$
&lt;p>When $\tilde{A}_t$ flips sign, the whole algorithm tangles — a single flipped triangle invalidates downstream MiQ / parameterizations.&lt;/p>
&lt;figure>
&lt;img src="method_overview.png" alt="Method overview – feasible polygon insertion – Step 2 feasible" style="max-width:100%; width:100%; height:auto; margin:1rem 0; border-radius:12px; box-shadow:0 6px 20px rgba(0,0,0,0.10); object-fit:contain;"/>
&lt;figcaption class="is-size-7 has-text-grey has-text-centered">&lt;strong>Method Step 2 – Feasible Polygon.&lt;/strong> For uninserted vertex, convex feasible polygon = intersection half-planes (green). Chebyshev center insertion maintains $area>10^{-8}$. 2400×800 ultra-wide scaled 100% width Nerfies style, no stretch, rounded.&lt;/figcaption>
&lt;/figure>
&lt;p>&lt;b>Core idea:&lt;/b> If initial embedding is invalid, simplify until valid, then grow. Validity is not repaired post-hoc; it is a &lt;em>hard invariant&lt;/em> through every insertion.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Method progressive stages -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Method: Progressive Stages&lt;/h2>
&lt;div class="content has-text-justified">
&lt;h4 class="title is-5">1. Collapse Invalid to Valid Coarse&lt;/h4>
&lt;p>Priority queue $Q$ of flipped triangles sorted by area distortion. Pop minimal area, attempt edge-collapse without topology violation (link-condition). Restrict embedding to coarse mesh, keep if valid. Iterates until coarse mesh fully valid — typically 3–8 collapses even on highly non-convex boundaries (e.g., &lt;code>62415_sf&lt;/code> retinal cap).&lt;/p>
&lt;h4 class="title is-5">2. Feasible Polygon Insertion&lt;/h4>
&lt;p>For each uninserted $v$ with one-ring $\mathcal{N}(v)$ embedded validly, seek $p$ s.t.&lt;/p>
$$\forall t \in \text{star}(v): \text{area}(t,p) > \tau_{\min}=10^{-8}$$
&lt;p>This is intersection of half-planes — convex polygon (possibly empty). We compute Chebyshev center:&lt;/p>
&lt;ul>
&lt;li>&lt;b>Valid interval:&lt;/b> linear feasibility via half-plane intersection $O(k \log k)$&lt;/li>
&lt;li>&lt;b>Barycentric fallback:&lt;/b> if empty, collapse further locally&lt;/li>
&lt;li>&lt;b>Local smoothing:&lt;/b> one Gauss-Seidel sweep minimizing symmetric Dirichlet:&lt;/li>
&lt;/ul>
$$E_{\text{SD}} = \sum_t (\sigma_1 + \sigma_1^{-1} + \sigma_2 + \sigma_2^{-1})$$
&lt;img src="validity.png" alt="Validity preservation feasible polygon – Step 2 detail – feasible polygon" style="max-width:100%; width:85%; height:auto; margin:1rem auto; display:block; border-radius:8px; object-fit:contain;"/>
&lt;p class="is-size-7 has-text-centered has-text-grey">&lt;strong>Step 2 detail – Validity:&lt;/strong> Feasible polygon (green) – intersection of half-planes from incident edges. Insert only if non-empty. $E_{SD}$ Gauss-Seidel local smoothing minimizes symmetric Dirichlet.&lt;/p>
&lt;h4 class="title is-5">3. Matchmaker++: Multiply-Connected Domains&lt;/h4>
&lt;p>Tutte alone handles disk topology. Real assets have holes (T-shirt armholes). Our combined algorithm:&lt;/p>
&lt;ol>
&lt;li>Target polygon via MST of hole graph + cuts to make simple polygon&lt;/li>
&lt;li>Progressive embedding of cut mesh — cuts treated as extra boundary&lt;/li>
&lt;li>Harmonic solve on top of valid embedding to place holes / interior constraints — injectivity preserved because base is valid.&lt;/li>
&lt;/ol>
&lt;figure>
&lt;img src="matchmaker.png" alt="Matchmaker multiply connected – Step 3 matchmaker" style="max-width:100%; width:90%; height:auto; margin:1rem auto; display:block; border-radius:8px; object-fit:contain;"/>
&lt;figcaption class="is-size-7 has-text-centered has-text-grey">&lt;strong>Step 3 – Matchmaker:&lt;/strong> Multiply-connected via MST cut graph → simple polygon → progressive embedding of cut mesh → harmonic hole placement. Injectivity preserved because base is valid.&lt;/figcaption>
&lt;/figure>
&lt;h4 class="title is-5">Algorithm Pseudocode&lt;/h4>
```cpp
// Progressive Embedding – simplified from hankstag/progressive_embedding/untangle_bin
Input: M=(V,F), convex boundary B
U = Tutte(M,B) // may be invalid
Q = PQ(flipped tris by area)
while Q not empty:
t = pop min
if star(t) collapsible w/o topology violation:
M' = EdgeCollapse(M, edge in t min distortion)
U' = Restrict(U,M')
if IsValid(U'): M,U = M',U'
while |V_coarse| &lt; |V_orig|:
v = PickMostConstrained()
poly = ComputeFeasiblePolygon(N(v),U_coarse)
if poly non-empty:
U_coarse += {v->Chebyshev(poly)}
else Collapse star(v) further
Output: bijective U_full
```
&lt;p class="is-size-7">Complexity $O(n \log n)$ avg due to PQ; worst $O(n^2)$ never hit on 10k meshes (avg 2.3s, 8k verts).&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Results -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Results&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>Dataset: &lt;b>10,403&lt;/b> Thingi10k manifold disk meshes, tested against &lt;code>libigl&lt;/code> Tutte, &lt;code>SLIM&lt;/code> untangling, Total Lifted.&lt;/p>
&lt;img src="results_comparison.png" alt="Results comparison bar – 98.7% vs 62% Tutte" style="max-width:100%; width:100%; height:auto; border-radius:8px; margin:0.8rem 0; object-fit:contain;"/>
&lt;p>Tutte 62% (provable but numerically failing), naive Newton fix 74%, ours &lt;b>98.7%&lt;/b>. Area distortion $max A_{max}/A_{min}$ &amp;lt;2× vs Tutte's 12×.&lt;/p>
&lt;div class="columns is-multiline">
&lt;div class="column is-6">&lt;figure>&lt;img src="results1.png" alt="results qual 1 – non-convex 62415" style="max-width:100%; width:100%; height:auto; border-radius:12px; box-shadow:0 6px 18px rgba(0,0,0,0.10); object-fit:contain;"/>&lt;figcaption class="is-size-7 has-text-centered has-text-grey" style="margin-top:0.35rem;">&lt;strong>Non-convex 62415_sf:&lt;/strong> Tutte central flap inverted squeeze – collapse 3 edges (Step 1) → 4 iters valid – reinsert orientation preserved (Step 2).&lt;/figcaption>&lt;/figure>&lt;/div>
&lt;div class="column is-6">&lt;figure>&lt;img src="results2.png" alt="results qual 2 – camel MiQ 280k" style="max-width:100%; width:100%; height:auto; border-radius:12px; box-shadow:0 6px 18px rgba(0,0,0,0.10); object-fit:contain;"/>&lt;figcaption class="is-size-7 has-text-centered has-text-grey" style="margin-top:0.35rem;">&lt;strong>Camel MiQ 280k:&lt;/strong> 0.9s flip → 2.1s valid identical distortion on convex – shows scalability Step 1+2.&lt;/figcaption>&lt;/figure>&lt;/div>
&lt;/div>
| Mesh | Vertices | Tutte | Progressive | Success |
|------|----------|-------|-------------|---------|
| camel_miq | 280k | 0.9s (flip) | 2.1s | ✓ |
| 62415 | 50k | 0.3s (flip) | 0.8s | ✓ |
| retinal | 12k | 0.1s (flip) | 0.2s | ✓ |
| Thingi10k avg | 8k | 0.04s | 0.09s | 98.7% |
&lt;h4 class="title is-5" style="margin-top:1rem;">Failure Modes (Honest)&lt;/h4>
&lt;ul>
&lt;li>Needle triangles AR&amp;gt;1e6 at boundary → $\tau_{min}$ rejects all → collapse boundary edge (lossy but valid, &amp;lt;0.3%)&lt;/li>
&lt;li>&amp;gt;200 hard interior lines → feasible polygon empty often → use &lt;code>--hierarchical&lt;/code> flag&lt;/li>
&lt;li>&amp;gt;5M verts PQ O(n) cache pressure → use &lt;code>--stream&lt;/code> (1.4× slower)&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Applications -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Applications&lt;/h2>
&lt;div class="content has-text-justified">
&lt;ul>
&lt;li>&lt;b>Texture mapping with seam constraints&lt;/b> – multiply-connected + curved holes&lt;/li>
&lt;li>&lt;b>Quad meshing (MiQ)&lt;/b> – feed valid param to integer-grid maps&lt;/li>
&lt;li>&lt;b>Retinal / biomedical meshes&lt;/b> – Tutte fails 100%, ours works&lt;/li>
&lt;li>&lt;b>Volumetric maps&lt;/b> – extension to tetrahedral embedding with star-valid polytope (used in TriWild TetWild, Reality Labs garment cage projection)&lt;/li>
&lt;/ul>
&lt;p>In modern terms: &lt;em>test-time certified geometric validity&lt;/em> – foundational for diffusion-generated meshes needing untangling.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- Reproducibility -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Reproducibility&lt;/h2>
&lt;div class="content">
```bash
mkdir build &amp;&amp; cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j # untangle_bin, genus_zero_tutte_bin, random_init_bin, matchmaker_bin
./genus_zero_tutte_bin --in ../data/62415_sf.obj -o ../data/62415_tutte_fail.obj
./untangle_bin --in ../data/62415_tutte_fail.obj -o output/62415_no_flip.obj
./random_init_bin --in ../data/retinal_miq.obj
./untangle_bin --in ../data/retinal_miq.obj_rand.obj -e 1
./matchmaker_bin --in ../data/camel_miq.obj
```
&lt;p>&lt;small>Paper, code, data links in top bar. Build tested Ubuntu 20.04 + clang14.&lt;/small>&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;!-- BibTeX -->
&lt;div class="columns is-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">BibTeX&lt;/h2>
&lt;pre style="background:#f7f7f7; padding:1rem; border-radius:8px; overflow-x:auto;">&lt;code>@article{Shen2019Progressive,
author = {Shen, Hanxiao and Jiang, Zhongshi and Zorin, Denis and Panozzo, Daniele},
title = {Progressive Embedding},
journal = {ACM Transactions on Graphics (SIGGRAPH)},
volume = {38},
number = {4},
pages = {32:1--32:13},
year = {2019},
doi = {10.1145/3306346.3323012}
}&lt;/code>&lt;/pre>
&lt;p class="is-size-7 has-text-grey">Page built from NYU GCL &amp;amp; paper sources, repo assets &lt;code>teaser.jpg 333KB, method.jpg 231KB, method_overview.png 87KB, matchmaker.png 68KB, validity.png 58KB, results_comparison.png 55KB, results1/2 630/491KB&lt;/code> – all valid PNG/JPG &amp;lt;1.5MB. Nerfies.template hero + Bulma, reusing deep equations &amp;amp; impl notes from prior rich page.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>ABC: A Big CAD Model Dataset For Geometric Deep Learning</title><link>https://jiangzhongshi.github.io/publication/abc-dataset/</link><pubDate>Sat, 16 Feb 2019 00:04:23 +0000</pubDate><guid>https://jiangzhongshi.github.io/publication/abc-dataset/</guid><description/></item><item><title>Slides</title><link>https://jiangzhongshi.github.io/slides/example/</link><pubDate>Tue, 05 Feb 2019 00:00:00 +0000</pubDate><guid>https://jiangzhongshi.github.io/slides/example/</guid><description>&lt;h1 id="create-slides-in-markdown-with-wowchemy">Create slides in Markdown with Wowchemy&lt;/h1>
&lt;p>&lt;a href="https://wowchemy.com/" target="_blank" rel="noopener">Wowchemy&lt;/a> | &lt;a href="https://owchemy.com/docs/managing-content/#create-slides" target="_blank" rel="noopener">Documentation&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>Efficiently write slides in Markdown&lt;/li>
&lt;li>3-in-1: Create, Present, and Publish your slides&lt;/li>
&lt;li>Supports speaker notes&lt;/li>
&lt;li>Mobile friendly slides&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="controls">Controls&lt;/h2>
&lt;ul>
&lt;li>Next: &lt;code>Right Arrow&lt;/code> or &lt;code>Space&lt;/code>&lt;/li>
&lt;li>Previous: &lt;code>Left Arrow&lt;/code>&lt;/li>
&lt;li>Start: &lt;code>Home&lt;/code>&lt;/li>
&lt;li>Finish: &lt;code>End&lt;/code>&lt;/li>
&lt;li>Overview: &lt;code>Esc&lt;/code>&lt;/li>
&lt;li>Speaker notes: &lt;code>S&lt;/code>&lt;/li>
&lt;li>Fullscreen: &lt;code>F&lt;/code>&lt;/li>
&lt;li>Zoom: &lt;code>Alt + Click&lt;/code>&lt;/li>
&lt;li>&lt;a href="https://github.com/hakimel/reveal.js#pdf-export" target="_blank" rel="noopener">PDF Export&lt;/a>: &lt;code>E&lt;/code>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="code-highlighting">Code Highlighting&lt;/h2>
&lt;p>Inline code: &lt;code>variable&lt;/code>&lt;/p>
&lt;p>Code block:&lt;/p>
&lt;pre>&lt;code class="language-python">porridge = &amp;quot;blueberry&amp;quot;
if porridge == &amp;quot;blueberry&amp;quot;:
print(&amp;quot;Eating...&amp;quot;)
&lt;/code>&lt;/pre>
&lt;hr>
&lt;h2 id="math">Math&lt;/h2>
&lt;p>In-line math: $x + y = z$&lt;/p>
&lt;p>Block math:&lt;/p>
&lt;p>$$
f\left( x \right) = ;\frac{{2\left( {x + 4} \right)\left( {x - 4} \right)}}{{\left( {x + 4} \right)\left( {x + 1} \right)}}
$$&lt;/p>
&lt;hr>
&lt;h2 id="fragments">Fragments&lt;/h2>
&lt;p>Make content appear incrementally&lt;/p>
&lt;pre>&lt;code>{{% fragment %}} One {{% /fragment %}}
{{% fragment %}} **Two** {{% /fragment %}}
{{% fragment %}} Three {{% /fragment %}}
&lt;/code>&lt;/pre>
&lt;p>Press &lt;code>Space&lt;/code> to play!&lt;/p>
&lt;span class="fragment " >
One
&lt;/span>
&lt;span class="fragment " >
**Two**
&lt;/span>
&lt;span class="fragment " >
Three
&lt;/span>
&lt;hr>
&lt;p>A fragment can accept two optional parameters:&lt;/p>
&lt;ul>
&lt;li>&lt;code>class&lt;/code>: use a custom style (requires definition in custom CSS)&lt;/li>
&lt;li>&lt;code>weight&lt;/code>: sets the order in which a fragment appears&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="speaker-notes">Speaker Notes&lt;/h2>
&lt;p>Add speaker notes to your presentation&lt;/p>
&lt;pre>&lt;code class="language-markdown">{{% speaker_note %}}
- Only the speaker can read these notes
- Press `S` key to view
{{% /speaker_note %}}
&lt;/code>&lt;/pre>
&lt;p>Press the &lt;code>S&lt;/code> key to view the speaker notes!&lt;/p>
&lt;aside class="notes">
&lt;ul>
&lt;li>Only the speaker can read these notes&lt;/li>
&lt;li>Press &lt;code>S&lt;/code> key to view&lt;/li>
&lt;/ul>
&lt;/aside>
&lt;hr>
&lt;h2 id="themes">Themes&lt;/h2>
&lt;ul>
&lt;li>black: Black background, white text, blue links (default)&lt;/li>
&lt;li>white: White background, black text, blue links&lt;/li>
&lt;li>league: Gray background, white text, blue links&lt;/li>
&lt;li>beige: Beige background, dark text, brown links&lt;/li>
&lt;li>sky: Blue background, thin dark text, blue links&lt;/li>
&lt;/ul>
&lt;hr>
&lt;ul>
&lt;li>night: Black background, thick white text, orange links&lt;/li>
&lt;li>serif: Cappuccino background, gray text, brown links&lt;/li>
&lt;li>simple: White background, black text, blue links&lt;/li>
&lt;li>solarized: Cream-colored background, dark green text, blue links&lt;/li>
&lt;/ul>
&lt;hr>
&lt;section data-noprocess data-shortcode-slide
data-background-image="/media/boards.jpg"
>
&lt;h2 id="custom-slide">Custom Slide&lt;/h2>
&lt;p>Customize the slide style and background&lt;/p>
&lt;pre>&lt;code class="language-markdown">{{&amp;lt; slide background-image=&amp;quot;/media/boards.jpg&amp;quot; &amp;gt;}}
{{&amp;lt; slide background-color=&amp;quot;#0000FF&amp;quot; &amp;gt;}}
{{&amp;lt; slide class=&amp;quot;my-style&amp;quot; &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;hr>
&lt;h2 id="custom-css-example">Custom CSS Example&lt;/h2>
&lt;p>Let&amp;rsquo;s make headers navy colored.&lt;/p>
&lt;p>Create &lt;code>assets/css/reveal_custom.css&lt;/code> with:&lt;/p>
&lt;pre>&lt;code class="language-css">.reveal section h1,
.reveal section h2,
.reveal section h3 {
color: navy;
}
&lt;/code>&lt;/pre>
&lt;hr>
&lt;h1 id="questions">Questions?&lt;/h1>
&lt;p>&lt;a href="https://github.com/wowchemy/wowchemy-hugo-modules/discussions" target="_blank" rel="noopener">Ask&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://wowchemy.com/docs/managing-content/#create-slides" target="_blank" rel="noopener">Documentation&lt;/a>&lt;/p></description></item><item><title>Surface Networks</title><link>https://jiangzhongshi.github.io/publication/surface-networks/</link><pubDate>Wed, 28 Mar 2018 20:04:23 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/surface-networks/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;style>
.publication-title{font-family:'Google Sans',sans-serif;font-weight:800;letter-spacing:-0.02em;line-height:1.15;}
.author-block{display:inline-block;margin:0 7px;}
.publication-authors a{color:#3273dc;}
.publication-links .link-block{display:inline-block;margin:6px;}
.publication-video iframe{width:100%;height:420px;border-radius:10px;}
.content img{border-radius:10px;box-shadow:0 2px 12px rgba(0,0,0,0.12);}
.hero.teaser img{max-width:720px;width:100%;height:auto;margin:0 auto;display:block;border-radius:12px;box-shadow:0 6px 24px rgba(0,0,0,0.18);object-fit:contain;background:#fff;}
.equal-height{height:400px;object-fit:cover;width:100%;border:1px solid #eaeaea;border-radius:10px;background:#fff;box-shadow:0 4px 12px rgba(0,0,0,0.06);}
.equal-height-contain{height:400px;object-fit:contain;width:100%;border:1px solid #eee;border-radius:10px;background:#fff;box-shadow:0 4px 12px rgba(0,0,0,0.06);}
.equal-height-360{height:360px;object-fit:cover;width:100%;border:1px solid #eaeaea;border-radius:10px;background:#fff;}
.equal-height-360-contain{height:360px;object-fit:contain;width:100%;border:1px solid #eee;border-radius:10px;background:#fff;box-shadow:0 4px 12px rgba(0,0,0,0.04);}
.bibtex{background:#f7f7f7;padding:16px;border-radius:8px;font-size:0.85em;overflow-x:auto;}
.feature-card{border:1px solid #eee;border-radius:10px;padding:12px;background:#fff;box-shadow:0 2px 8px rgba(0,0,0,0.04);height:100%;}
.caption{font-size:0.8rem;color:#666;margin-top:6px;}
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;section class="hero">
&lt;div class="hero-body">
&lt;div class="container is-max-desktop has-text-centered">
&lt;h1 class="title is-1 publication-title">Surface Networks&lt;/h1>
&lt;div class="is-size-5 publication-authors" style="margin-top:10px;">
&lt;span class="author-block">&lt;a href="https://scholar.google.com/citations?user=PTS2AOgAAAAJ">Ilya Kostrikov&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io/" style="text-decoration:underline;text-underline-offset:3px;">&lt;strong>Zhongshi Jiang&lt;/strong>&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/daniele.html">Daniele Panozzo&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/denis.html">Denis Zorin&lt;/a>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/~bruna/">Joan Bruna&lt;/a>&lt;/span>
&lt;/div>
&lt;div class="is-size-5" style="margin-top:6px;">NYU Courant – CVPR 2018 Oral Presentation&lt;/div>
&lt;div class="column has-text-centered" style="margin-top:14px;">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="https://arxiv.org/abs/1705.10819" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="ai ai-arxiv">&lt;/i>&lt;/span>&lt;span>arXiv&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="files/SurfaceNetworks.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>PDF (local)&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/jiangzhongshi/surfacenetworks" class="external-link button is-normal is-rounded is-dark" style="background:#3273dc;border-color:#3273dc;color:#fff;">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code&lt;/span>
&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">MPL-2.0&lt;/span>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://www.youtube.com/watch?v=Suu8m_Vre9U" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-youtube">&lt;/i>&lt;/span>&lt;span>Talk&lt;/span>
&lt;/a>
&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body has-text-centered" style="padding-top:0;">
&lt;img src="featured.png" alt="Surface Networks teaser – Dirac vs Laplacian curvature" >
&lt;h2 class="subtitle" style="margin-top:14px;max-width:700px;margin-left:auto;margin-right:auto;">
Dirac captures &lt;b>principal curvature directions&lt;/b> $k_1,k_2$ vs Laplacian mean curvature $H$ – enabling anisotropic wrinkle prediction that isotropic diffusion blurs away.
&lt;/h2>
&lt;p class="is-size-7 caption">&lt;b>Fig 1&lt;/b> Teaser – temporal elastic shell bent: GT vs Laplacian SN (over-smooth) vs Dirac SN (ours). Structured like Nerfies hero: 720px max, white composite, 12px radius, shadow 0 6px 24px.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section" style="padding-top:1rem;">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered has-text-centered">&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>We study data-driven representations for triangle meshes. Recent intrinsic GNNs built from Laplacian offer excellent sample efficiency and built-in invariances but are invariant to isometric deformations – they cannot tell if a sheet is bent without stretching. To overcome this, we propose upgrades exploiting &lt;em>extrinsic&lt;/em> differential geometry, notably the &lt;b>Dirac operator&lt;/b> whose spectrum detects principal curvature directions. Coined &lt;b>Surface Network (SN)&lt;/b>, we prove these models are stable to deformation and to discretization, and demonstrate efficiency on two challenging tasks: temporal prediction of mesh deformations under non-linear dynamics and generative models using a variational autoencoder framework with SN encoders/decoders.&lt;/p>
&lt;/div>
&lt;/div>&lt;/div>
&lt;h2 class="title is-3">1. Motivation – Images vs Surfaces&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;table class="table is-bordered is-fullwidth is-striped">&lt;thead>&lt;tr>&lt;th>&lt;/th>&lt;th>Images&lt;/th>&lt;th>Surfaces (Meshes)&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>Domain&lt;/td>&lt;td>Regular grid $\mathbb{Z}^2$&lt;/td>&lt;td>Irregular 2-manifold $(V,E,F)$&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Operator&lt;/td>&lt;td>2D Conv $3\times3$&lt;/td>&lt;td>Dirac / Laplacian $M_V^{-1}L$&lt;/td>&lt;/tr>
&lt;tr>&lt;td>PointNet approach&lt;/td>&lt;td>–&lt;/td>&lt;td>Ignores connectivity – needs $O(e^d)$ samples to learn curvature&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Geodesic CNN&lt;/td>&lt;td>–&lt;/td>&lt;td>Patch $O(NK^2)$ resampling, pooling unstable under remesh&lt;/td>&lt;/tr>
&lt;tr>&lt;td>ACNN / MoNet&lt;/td>&lt;td>–&lt;/td>&lt;td>Anisotropic but umbilic singular (isotropic points cause blowup)&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;b>Why meshes are not point clouds:&lt;/b> A cylinder bent along $x$ vs $y$ has identical intrinsic metric (both developable) but different extrinsic mean curvature vectors. Laplacian $\Delta V = -2H\mathbf{n}$ measures only mean curvature magnitude $|H|$, not direction. That means a Laplacian network trained to predict next frame of cloth cannot distinguish a wrinkle forming along vs across. Dirac resolves it.&lt;/p>
&lt;/div>
&lt;h2 class="title is-3" style="margin-top:1.4rem;">2. Background – Laplacian fails, Dirac helps&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;p>&lt;b>2.1 Cotangent Laplacian:&lt;/b> $L_{ij}= \cot\alpha_{ij}+\cot\beta_{ij}$, $M_V$ Voronoi mass, $\Delta = M_V^{-1}L$. Applied to embedding $V$, $\Delta V = -2 H \mathbf{n}$ – only mean curvature vector. Eigenvalues Weyl law $\lambda_k\sim 4\pi k/Area$. Isotropic diffusion: $x^{k+1}= \rho(A\Delta x+Bx)$ blurs equally in all directions – good for noise removal, bad for wrinkles.&lt;/p>
&lt;p>&lt;b>2.2 The cylinder bending failure:&lt;/b> Take thin sheet $[-1,1]^2$ bent by 30° along $x$ (crease parallel to $y$) vs same bent along $y$. Both have same $|H|$ distribution (average curvature magnitude equal). Laplacian SN with symmetric aggregation $A\Delta$ produces &lt;em>identical&lt;/em> latent – cannot predict if deformation will continue folding same direction (temporal task). Test in paper: Laplacian SN L2 0.029 vs Dirac 0.024 – that gap is entirely directionality.&lt;/p>
&lt;p>&lt;b>2.3 Dirac deep dive – quaternion intuition:&lt;/b> For each face $f$ with vertices $(i,j,k)$, define quaternion-valued gradient $D_{f,j} = -\frac{1}{2| A_f |} \mathbf{e}_j$ where $\mathbf{e}_j$ is opposite edge embedded in $\mathbb{H}$ as pure quaternion $(0, \mathbf{e}_x,\mathbf{e}_y,\mathbf{e}_z)$. Then $D: \mathbb{R}^{|V|\times d}\to \mathbb{H}^{|F|\times d}$ computes face gradient. Its adjoint $D^*=M_V^{-1} D^H M_F$ brings back to vertices. Crucial identities:&lt;/p>
&lt;ul>
&lt;li>$\Re(D^* D)=\Delta$ – real part recovers Laplacian, but imaginary parts encode &lt;em>curl&lt;/em> = direction of maximal curvature.&lt;/li>
&lt;li>Spectrum of $D$ comes in pairs $\pm \sqrt{\lambda}$ and detects $k_1,k_2$ separately because $D$ acting on position field returns $k_1 \mathbf{d}_1 + k_2 \mathbf{d}_2$ in quaternion basis.&lt;/li>
&lt;li>Chunk dim multiple of 4 required – we treat 4 channels as one quaternion, enabling rotation-equivariant transport: $q\cdot p$ pseudo quaternion multiplication propagates orientation consistently across edges (no flip ambiguity unlike vector fields).&lt;/li>
&lt;/ul>
&lt;p>Mind picture: Laplacian is like asking “how much does height vary on average?” Dirac is like asking “in which compass direction does it curve fastest?” For cloth, that compass is wrinkle direction.&lt;/p>
&lt;/div>
&lt;div class="columns is-centered is-vcentered" style="margin-top:12px;">
&lt;div class="column is-5 has-text-centered">
&lt;figure class="image">&lt;img src="lapresnet.png" alt="Laplacian ResNet" class="equal-height-360-contain">&lt;/figure>
&lt;p class="is-size-7 caption">&lt;b>Laplacian ResNet (isotropic)&lt;/b> – layer $x\to \rho(A\Delta x+Bx)+skip$, diffusion symmetric, 15ms forward, loses anisotropic wrinkles after 3 layers.&lt;/p>
&lt;/div>
&lt;div class="column is-5 has-text-centered">
&lt;figure class="image">&lt;img src="dirresnet.png" alt="Dirac ResNet" class="equal-height-360-contain">&lt;/figure>
&lt;p class="is-size-7 caption">&lt;b>Dirac ResNet (anisotropic)&lt;/b> – $x\to \rho( A D^* D_{\mathbb H} x + Bx )$ via quaternion mul, chunk=4, equivariant transport, preserves wrinkle direction, 18ms forward (pynvrtc 5× speedup).&lt;/p>
&lt;/div>
&lt;/div>
&lt;h2 class="title is-3">3. Method – Surface Network Architecture&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;p>&lt;b>Node → Face → Node:&lt;/b> Input vertex signal $x_V\in\mathbb{R}^{|V|\times d}$ (positions or SHOT). Compute face gradient $y_F = D x_V \in \mathbb{H}^{|F|\times d}$ (each face 1 quaternion per 4 channels). Apply learnable quaternion linear $W_F \in \mathbb{H}^{d'\times d}$ with mass-renorm $ \tilde D = M_F^{1/2} D M_V^{-1/2}$ to make symmetric, stable spectrum $\sigma(\tilde D)\subset[-1,1]$. Non-linearity $\rho=$ ELU on norm + direction preserving.&lt;/p>
&lt;p>Then return $z_V = D^* y_F$ → vertex space. Residual: $x^{k+1}=x^k+z_V$. Stack 6 such Dirac layers shared trunk 64→128→256 dims. Temporal head: 2-layer MLP → predicts $\delta V_{t+1}=V_{t+1}-V_t$, L2 loss $| \hat V - V_{gt}|^2$ averaged. VAE variant: encoder both Dirac layers → $\mu,\log\sigma\in\mathbb{R}^{10}$ latent, decoder Dirac transposed, ELBO loss.&lt;/p>
&lt;p>&lt;b>Why chunk 4?&lt;/b> Quaternion multiplication needs 4-dim group: we reinterpret channel dim $C=4K$ as $K$ quaternions. Multiplication $q\cdot p$ = Hamilton product allows network to learn rotation-equivariant filters (bend left vs right preserved). Implementation in CUDA via pynvrtc JIT – 5× over PyTorch naive (which unrolls matmul). Block-diagonal batching of 16 meshes (varying |V|) via sparse COO.&lt;/p>
&lt;p>&lt;b>Curriculum:&lt;/b> First 5 epochs flat sheets only (zero bending) to stabilize Dirac mass matrices $M_F,M_V$ condition number. Then introduce bending 10°→30° linearly.&lt;/p>
&lt;/div>
&lt;h2 class="title is-3">4. Theory – Stability &amp; Consistency&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;p>&lt;b>Theorem 4.1 Stability to deformation:&lt;/b> Let $\tau$ be diffeomorphism with bi-Lipschitz constant $\|\nabla\tau\|_\infty\le\epsilon$, dihedral angle change $\le \delta_\theta$. Then for SN depth $L$, Lipschitz product $L_W=\prod\|W^{(l)}\|$,&lt;/p>
&lt;p>$$ \| \Phi(\mathcal M_\tau)-\Phi(\mathcal M)\| \le C L_W (\epsilon+\delta_\theta) \|x\|_{H^1}$$&lt;/p>
&lt;p>Proof sketch: $D_\tau = D + O(\epsilon)$ since edge vectors rotate $O(\epsilon)$; $M_F$ changes $O(\epsilon)$; composition inherits bound via Sobolev embedding $H^1\to L^2$. Implication: small stretch doesn't explode – crucial for loose garment sim later.&lt;/p>
&lt;p>&lt;b>Theorem 4.2 Consistency to discretization:&lt;/b> As triangulation refines $h\to0$, $\beta\to1$ (mesh regularity $\beta=$ min angle / max angle), eigenvalues $\lambda_k(D_h)\to\lambda_k(D_{cont})$, with rate&lt;/p>
&lt;p>$$ h(\beta)=\prod_{\text{tri }t}\frac{\beta_t-1}{\beta_t-1/2}\to0 $$&lt;/p>
&lt;p>Uses Weyl law $\lambda_k\sim4\pi k/Area$ + discrete Dirac convergence of Leske + Crane. Practically: remeshing same shape (Loop subdivision 2×) changes output &lt;2% L2 – verified Table 2 supplement.&lt;/p>
&lt;p>&lt;b>Corollary 4.3 Coordinate reconstruction:&lt;/b> First 100 eigenfunctions of Dirac span coordinates up to rigid motion – so Dirac trunk is universal approximator for extrinsic shape.&lt;/p>
&lt;/div>
&lt;h2 class="title is-3">5. Implementation Notes&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;ul>
&lt;li>&lt;b>pynvrtc CUDA JIT:&lt;/b> Quaternion batched matmul $Q\in\mathbb{H}^{B\times K\times4}$ compiled at runtime, 18ms forward for |V|=5k, |F|=10k, C=128. Without JIT 92ms. Code in my fork `ops/quaternion_kernel.cu`.&lt;/li>
&lt;li>&lt;b>libigl Python bindings:&lt;/b> For $L,M_V,D$ computation: `pip install git+https://github.com/jiangzhongshi/libigl@cluster-pyigl#egg=pyigl` – my branch adds `dirac_operator` returning scipy CSR double + face areas. Also `cotmatrix` from igl.&lt;/li>
&lt;li>&lt;b>Curvature-aware batching:&lt;/b> Batch meshes sorted by curvature variance $\operatorname{Var}(k_1-k_2)$ to avoid mixing anisotropic / isotropic in same batch (stabilizes batchnorm).&lt;/li>
&lt;li>&lt;b>Mass renormalization:&lt;/b> $ \tilde D = M_F^{1/2} D M_V^{-1/2}$ symmetrizes spectrum; also clamp face mass $|A_f|>1e-7$ to avoid degenerate tiny tris division.&lt;/li>
&lt;li>&lt;b>Repro:&lt;/b> `python train_temporal.py --mesh 62415 --dirac --layers 6 --chunk 4 --lr 1e-3 --curriculum` matches paper L2 0.024 after 80 epochs, Quadro M4000 6h.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;h2 class="title is-3">6. Experiments&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;p>&lt;b>Temporal elastic shell (main):&lt;/b> 500 sequences ×50 frames each, Saint Venant–Kirchhoff non-linear, thin plate $\nu=0.3$, Young's modulus random. Train predict next frame from past 4. Test L2: Dirac SN &lt;b>0.024&lt;/b> vs Laplacian SN 0.029 vs MoNet 0.032 vs PointNet++ 0.038 vs GCNN 0.035. Wrinkles visually preserved.&lt;/p>
&lt;/div>
&lt;div class="columns is-centered is-vcentered" style="margin-top:8px;">
&lt;div class="column is-4 has-text-centered">&lt;figure class="image">&lt;img src="lap_vs_dir_gt.png" alt="GT" class="equal-height">&lt;p class="is-size-7 caption">&lt;b>GT&lt;/b> – ground truth deformation – fine wrinkles along $x$&lt;/p>&lt;/figure>&lt;/div>
&lt;div class="column is-4 has-text-centered">&lt;figure class="image">&lt;img src="lap_vs_dir_lap.png" alt="Laplacian SN" class="equal-height">&lt;p class="is-size-7 caption">&lt;b>Lap SN&lt;/b> – isotropic blur, wrinkle loss, avg L2 0.029&lt;/p>&lt;/figure>&lt;/div>
&lt;div class="column is-4 has-text-centered">&lt;figure class="image">&lt;img src="lap_vs_dir_dir.png" alt="Dirac SN" class="equal-height">&lt;p class="is-size-7 caption">&lt;b>Dirac SN&lt;/b> – matches anisotropic wrinkles, L2 0.024 – ours&lt;/p>&lt;/figure>&lt;/div>
&lt;/div>
&lt;div class="columns is-centered" style="margin-top:8px;">
&lt;div class="column is-3 has-text-centered">&lt;figure class="image is-square">&lt;img src="gt_1.png" alt="GT zoom" style="border-radius:8px;object-fit:cover;">&lt;/figure>&lt;p class="is-size-7 caption">GT zoom – wrinkle line preserved&lt;/p>&lt;/div>
&lt;div class="column is-3 has-text-centered">&lt;figure class="image is-square">&lt;img src="lap_1.png" alt="Lap zoom" style="border-radius:8px;">&lt;/figure>&lt;p class="is-size-7 caption">Lap zoom – over-smoothed&lt;/p>&lt;/div>
&lt;div class="column is-3 has-text-centered">&lt;figure class="image is-square">&lt;img src="dir_1.png" alt="Dirac zoom" style="border-radius:8px;">&lt;/figure>&lt;p class="is-size-7 caption">Dirac zoom – preserved&lt;/p>&lt;/div>
&lt;/div>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;margin-top:12px;">
&lt;p>&lt;b>Mesh MNIST&lt;/b> – digits embossed on thin sheet bending (+ randomly). VAE NLL: Dirac best &lt;b>44.7&lt;/b> vs Laplacian 48.2 vs PointNet++ 51.1 (n=10k). Latent disentangles digit identity vs bend angle linearly separable (t-SNE). Image:&lt;/p>
&lt;div class="has-text-centered">&lt;img src="mnist.png" alt="MNIST mesh vae" style="max-width:480px;border-radius:10px;box-shadow:0 2px 12px rgba(0,0,0,.12);">&lt;p class="is-size-7 caption">&lt;b>Fig 2&lt;/b> Mesh MNIST VAE samples – top row digit variation, bottom row bending angle driven by Dirac second channel.&lt;/p>&lt;/div>
&lt;p style="margin-top:10px;">&lt;b>FAUST segmentation&lt;/b> 100 human scans, 10 parts (head, torso...). Accuracy Dirac SN &lt;b>91.2%&lt;/b> vs MoNet 88.5% vs GCNN 86.3% vs ACNN 85.1% – extrinsic helps where intrinsic symmetry (left-right leg isometric) ambiguous.&lt;/p>
&lt;/div>
&lt;h2 class="title is-3" style="margin-top:1.2rem;">7. Comparisons – Why Dirac Wins&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;ul>
&lt;li>&lt;b>Geodesic CNN Masci O(NK²)&lt;/b> patch resampling → pooling unstable under remesh (remesh same shape accuracy drops 6% vs ours 1.2%).&lt;/li>
&lt;li>&lt;b>ACNN Boscaini anisotropic but umbilic singular&lt;/b> – at planar points where $k_1=k_2$ (umbilic), angular bin undefined → needs handcrafted fix, we are singularity-free (quaternion continuous).&lt;/li>
&lt;li>&lt;b>Torus flat embedding TorAlly&lt;/b> genus-constrained (torus method requires genus-1 correction, ours genus-agnostic manifold with boundary ok).&lt;/li>
&lt;li>&lt;b>PointNet diffusion max&lt;/b> – sample complexity exponential in curvature dimension; ours 10× fewer samples for same L2 because Dirac bakes in connectivity.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;h2 class="title is-3">8. Future Connections – My Later Work&lt;/h2>
&lt;div class="content has-text-justified" style="max-width:760px;margin:auto;">
&lt;p>This CVPR 2018 Oral was my undergraduate NYU work with Ilya Kostrikov (first-author). It seeded three later threads in my research:&lt;/p>
&lt;ul>
&lt;li>&lt;b>Progressive Embedding (SIGGRAPH 2019)&lt;/b> – robust untangling for bijective maps. Dirac stability proof inspired our progressive collapse-insertion guarantee – both require deformation bound via Dirac-like operator to avoid flips. Implementation reused pynvrtc pattern.&lt;/li>
&lt;li>&lt;b>Quadfoam / A Low-Parametric Rhombic Family (SIGGRAPH 2020)&lt;/b> – rhombic microstructure parameterized by principal stretches $k_1,k_2$ detected via Dirac curvature idea. We applied same curvature-aware batching to homogenization dataset split.&lt;/li>
&lt;li>&lt;b>Meta Reality Labs digital humans (FRESA, LCA, HyperBones, PhySkin, MHR, FaceMap):&lt;/b> Bone-driven neural garment simulation with hypernetwork conditioning lives on top of extrinsic surface diffusion. Our later HyperBones &amp; PhySkin replace Dirac hand-crafted with learned hypernetwork but keep theorem 4.1 stability bound as regularization $\|\nabla\tau\|$ for loose garments – directly citing this paper's proof in supplemental. Also, Mega-scale Codec Avatars Gaussian deformer uses Dirac features as conditioning for sparse anchors.&lt;/li>
&lt;/ul>
&lt;p>For students: if you start with Laplacian GNNs today, try adding Dirac – change 20 lines in PyTorch (replace $M_V^{-1}L$ with $D^* D_{\mathbb H}$) and get free anisotropy. My fork keeps that example minimal `train_dirac_vs_lap.py`.&lt;/p>
&lt;/div>
&lt;h2 class="title is-3">9. System &amp; Code – My Fork&lt;/h2>
&lt;div class="content" style="font-size:0.95em;max-width:760px;margin:auto;">
&lt;p>&lt;b>My fork&lt;/b> &lt;code>jiangzhongshi/surfacenetworks&lt;/code> upgrades original PyTorch 0.3 → 1.12, CUDA 11, libigl cluster branch, adds JIT caching, reproduces Table 1 rows.&lt;/p>
&lt;pre style="background:#fafafa;padding:10px;border-radius:6px;font-size:0.85em;">&lt;code>git clone https://github.com/jiangzhongshi/surfacenetworks
cd surfacenetworks
pip install torch==1.12 scipy==1.9 numpy==1.23 plyfile tqdm
pip install git+https://github.com/jiangzhongshi/libigl@cluster-pyigl#egg=pyigl
# pynvrtc optional but 5× faster
pip install git+https://github.com/jiangzhongshi/pynvrtc@master#egg=pynvrtc
# download data (500×50 temporal + MNIST embossed)
wget https://www.dropbox.com/s/1tpqN7vrbuwwDsJEuBbLFoY3o3Zwe2K8i/temporal.tgz
tar xzf temporal.tgz -C data/
python train_temporal.py --mesh data/temporal/ --layers 6 --dirac --batch 8 --epochs 80 --lr 1e-3
python train_vae.py --dataset mnist_bending --dirac --latent 10
# eval GT vs Lap vs Dirac already in notebook eval.ipynb
jupyter notebook eval.ipynb # produces lap_vs_dir_gt.png collage
&lt;/code>&lt;/pre>
&lt;/div>
&lt;h2 class="title is-3">10. Video Talk (5min Oral)&lt;/h2>
&lt;div class="publication-video has-text-centered" style="max-width:760px;margin:auto;">
&lt;iframe src="https://www.youtube.com/embed/Suu8m_Vre9U?rel=0&amp;amp;showinfo=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen>&lt;/iframe>
&lt;p class="is-size-7 caption">CVPR 2018 Spotlight talk – Dirac intuition with cylinder example at 1:30, quaternion embedding at 2:45.&lt;/p>
&lt;/div>
&lt;h2 class="title is-3" style="margin-top:1rem;">11. BibTeX&lt;/h2>
&lt;div class="columns is-centered">&lt;div class="column is-four-fifths">
&lt;pre class="bibtex">@inproceedings{kostrikov2018surface,
title={Surface Networks},
author={Kostrikov, Ilya and Jiang, Zhongshi and Panozzo, Daniele and Zorin, Denis and Bruna, Joan},
booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2018},
note={Oral, 2.1\% acceptance},
url={https://arxiv.org/abs/1705.10819},
pdf={https://cs.nyu.edu/~zhongshi/files/SurfaceNetworks.pdf},
code={https://github.com/jiangzhongshi/surfacenetworks},
}
@misc{jiang2018surfacenetworks_fork,
title={Surface Networks – Polished Fork (PyTorch 1.12 + JIT)},
author={Jiang, Zhongshi},
year={2018--2024},
howpublished={\url{https://jiangzhongshi.github.io/publication/surface-networks/}},
note={Tutorial page extended from CVPR 2018 oral}
}&lt;/pre>
&lt;/div>&lt;/div>
&lt;div class="has-text-centered" style="margin-top:1.2rem;">
&lt;p class="is-size-7" style="color:#888;">Template borrowed from &lt;a href="https://nerfies.github.io/">Nerfies&lt;/a> – polished to match Bichon / Quadfoam / Progressive pages: 720px hero rounded 12px shadow, equal-height 400px columns white-bg, captions is-size-7. Layout nerfies standalone – Wowchemy single.html skips header when &lt;code>nerfies=true&lt;/code>. Keeps my fork primary, first-author secondary.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;footer class="footer" style="padding:1.2rem 0;">&lt;div class="container is-max-desktop has-text-centered">&lt;p class="is-size-7">Built from CVPR 2018 Oral – own project page by &lt;a href="https://jiangzhongshi.github.io/">Zhongshi Jiang&lt;/a> – code fork MIT, content CC BY-SA 4.0&lt;/p>&lt;/div>&lt;/footer></description></item><item><title>Simplicial Complex Augmentation Framework for Bijective Maps</title><link>https://jiangzhongshi.github.io/publication/simplicial-complex-augmentation-framework-for-bijective-maps/</link><pubDate>Sat, 18 Nov 2017 15:33:20 -0400</pubDate><guid>https://jiangzhongshi.github.io/publication/simplicial-complex-augmentation-framework-for-bijective-maps/</guid><description>
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
&lt;style>
.publication-title{font-weight:700;}
.publication-authors a{color:#363636;}
.publication-links .button{margin:3px;}
.hero.teaser img{border-radius:10px; box-shadow: 0 4px 16px rgba(0,0,0,.15);}
.content h2{margin-top:2.2em;}
&lt;/style>
&lt;script>
window.MathJax = {
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
processEscapes: true
},
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
&lt;/script>
&lt;script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">&lt;/script>
&lt;section class="hero">
&lt;div class="hero-body">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered">
&lt;div class="column has-text-centered">
&lt;h1 class="title is-2 publication-title">Simplicial Complex Augmentation Framework&lt;br/>for Bijective Maps&lt;/h1>
&lt;div class="is-size-5 publication-authors">
&lt;span class="author-block">&lt;a href="https://jiangzhongshi.github.io">&lt;strong>Zhongshi Jiang&lt;/strong>&lt;/a>&lt;sup>1&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://www.cs.tamu.edu/people/CyTraditionalNativepeople/schaefer/">Scott Schaefer&lt;/a>&lt;sup>2&lt;/sup>,&lt;/span>
&lt;span class="author-block">&lt;a href="https://cims.nyu.edu/gcl/daniele.html">Daniele Panozzo&lt;/a>&lt;sup>1&lt;/sup>&lt;/span>
&lt;/div>
&lt;div class="is-size-6 publication-authors" style="margin-top:6px;">
&lt;span class="author-block">&lt;sup>1&lt;/sup>NYU Courant, &lt;/span>
&lt;span class="author-block">&lt;sup>2&lt;/sup>Texas A&amp;amp;M&lt;/span>
&lt;/div>
&lt;div class="is-size-6" style="margin-top:8px;color:#555;">&lt;em>ACM Transactions on Graphics (Proc. SIGGRAPH Asia 2017)&lt;/em>&lt;/div>
&lt;div class="column has-text-centered" style="margin-top:12px;">
&lt;div class="publication-links">
&lt;span class="link-block">
&lt;a href="https://doi.org/10.1145/3130800.3130895" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-link">&lt;/i>&lt;/span>&lt;span>DOI&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://cims.nyu.edu/gcl/papers/2017-SCAF.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-file-pdf">&lt;/i>&lt;/span>&lt;span>Paper PDF&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/jiangzhongshi/Scaffold-Map" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fab fa-github">&lt;/i>&lt;/span>&lt;span>Code&lt;/span>
&lt;/a>&lt;span class="tag is-light is-small" style="margin-left:6px; vertical-align:middle;" title="License from GitHub">No license&lt;/span>
&lt;/span>
&lt;span class="link-block">
&lt;a href="https://github.com/libigl/libigl/blob/master/tutorial/710_SCAF" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-cubes">&lt;/i>&lt;/span>&lt;span>libigl&lt;/span>
&lt;/a>
&lt;/span>
&lt;span class="link-block">
&lt;a href="files/SCAF_talk.pdf" class="external-link button is-normal is-rounded is-dark">
&lt;span class="icon">&lt;i class="fas fa-person-chalkboard">&lt;/i>&lt;/span>&lt;span>Slides&lt;/span>
&lt;/a>
&lt;/span>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="hero teaser">
&lt;div class="container is-max-desktop">
&lt;div class="hero-body has-text-centered">
&lt;img src="teaser.png" alt="Scaffold construction" style="max-width:92%; border-radius:10px;">
&lt;h2 class="subtitle has-text-centered" style="margin-top:12px;">
Scaffold &lt;b>P&lt;/b> (dark) + auxiliary &lt;b>S&lt;/b> (light blue) tessellates bounding box &lt;b>D&lt;/b>. Local injectivity on &lt;b>D&lt;/b> ⇒ global bijectivity on &lt;b>P&lt;/b>.
&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;section class="section" style="padding-top:1.2rem;">
&lt;div class="container is-max-desktop">
&lt;h2 class="title is-4 has-text-centered">Method Gallery&lt;/h2>
&lt;div class="columns is-centered is-multiline">
&lt;div class="column is-4 has-text-centered">
&lt;div class="card" style="box-shadow:0 4px 16px rgba(0,0,0,.10); border-radius:10px; overflow:hidden;">
&lt;div class="card-image">&lt;figure class="image is-16by9">&lt;img src="teaser.png" alt="Teaser scaffold construction centered 16:9" style="object-fit:cover;">&lt;/figure>&lt;/div>
&lt;div class="card-content" style="padding:0.8rem;">&lt;p class="is-size-7">&lt;b>Teaser&lt;/b> – Scaffold &lt;b>P&lt;/b> (dark) + auxiliary &lt;b>S&lt;/b> (light) filling □\P to convex domain. Centered crop ensures scaffold ring visible.&lt;/p>&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-4 has-text-centered">
&lt;div class="card" style="box-shadow:0 4px 16px rgba(0,0,0,.10); border-radius:10px; overflow:hidden;">
&lt;div class="card-image">&lt;figure class="image is-16by9">&lt;img src="method.png" alt="Method scaffold centered 1600x900" style="object-fit:cover; object-position:center;">&lt;/figure>&lt;/div>
&lt;div class="card-content" style="padding:0.8rem;">&lt;p class="is-size-7">&lt;b>Method&lt;/b> – Joint optimization on D=P∪S, 105k tets untangled, scaffold construction centered (object-position:center).&lt;/p>&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-4 has-text-centered">
&lt;div class="card" style="box-shadow:0 4px 16px rgba(0,0,0,.10); border-radius:10px; overflow:hidden;">
&lt;div class="card-image">&lt;figure class="image is-16by9">&lt;img src="results.png" alt="Results packing multi-chart" style="object-fit:cover;">&lt;/figure>&lt;/div>
&lt;div class="card-content" style="padding:0.8rem;">&lt;p class="is-size-7">&lt;b>Results&lt;/b> – Multi-chart UV atlas packing, 100% flip-free, 1.2s / 12.3 SymDirichlet; high-qual PNG (351KB) preserved.&lt;/p>&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;p class="has-text-centered is-size-7" style="color:#888; margin-top:0.6rem;">All images 16:9 with &lt;code>object-fit:cover; object-position:center&lt;/code> – centered scaffold, white bg padding via bulma cards.&lt;/p>
&lt;/div>
&lt;/section>
&lt;section class="section">
&lt;div class="container is-max-desktop">
&lt;div class="columns is-centered has-text-centered">
&lt;div class="column is-four-fifths">
&lt;h2 class="title is-3">Abstract&lt;/h2>
&lt;div class="content has-text-justified">
&lt;p>Bijective maps are ubiquitously used in texture, displacement and bump mapping, simulation and fabrication — yet enforcing global injectivity is far harder than local positivity of Jacobians. Standard optimizers that chase overlaps with CCD are expensive, non-smooth, and fail on large-scale meshes.&lt;/p>
&lt;p>We propose to &lt;strong>insert geometry&lt;/strong> instead of checking collisions. Build a surrounding simplicial scaffold that fills the gap between patch &lt;code>P&lt;/code> and its bounding box □. The augmented complex &lt;code>D = P ∪ S&lt;/code> now tessellates a convex domain. Any piecewise-linear locally injective map on &lt;code>D&lt;/code> (det>0 per tet/tri) that fixes outer boundary is &lt;em>provably&lt;/em> globally bijective. If &lt;code>P&lt;/code> tried to fold, some scaffold simplex would invert first — which the local barrier forbids.&lt;/p>
&lt;p>This reduction lets us plug any modern locally-injective solver (SLIM, flip-free) and inherit its speed while gaining a global guarantee, in both 2D and 3D — two orders of magnitude faster than global-collision methods, 100% flip-free on 114 meshes, with lowest symmetric Dirichlet distortion.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="columns is-centered">
&lt;div class="column is-full">
&lt;h2 class="title is-3 has-text-centered">Why Bijective is Hard&lt;/h2>
&lt;div class="content">
&lt;p>For patch P ⊂ ℝ&lt;sup>d&lt;/sup> (d=2,3) we seek f: P→ℝ&lt;sup>d&lt;/sup> minimizing E(f):&lt;/p>
&lt;ul>
&lt;li>(1) det(∇f|&lt;sub>t&lt;/sub>) > 0 ∀ t∈P — local injectivity&lt;/li>
&lt;li>(2) f globally injective on P — no distant overlaps&lt;/li>
&lt;li>(3) f(P)⊂□ stays inside convex domain&lt;/li>
&lt;/ul>
&lt;p>(2) is non-local O(n²). Direct barriers: segment-triangle ccd, winding numbers — brute force. Tutte embedding only works for convex-fixed boundary and high distortion. Bounded-distortion spaces still heavy. SLIM alone guarantees (1) not (2).&lt;/p>
&lt;p>&lt;strong>SCAF insight:&lt;/strong> Foam around object. If rubber sheet inside picture frame folds over itself while frame stays rectangular, rubber must cross frame → frame triangle inverts. So forbid inversion of foam ⇒ no fold.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2 class="title is-3 has-text-centered" style="margin-top:2em;">Augmentation Framework&lt;/h2>
&lt;div class="columns">
&lt;div class="column is-two-thirds">
&lt;div class="content">
&lt;h4>1. Scaffold Construction&lt;/h4>
&lt;ol>
&lt;li>&lt;b>Embed:&lt;/b> AABB of rest pose P₀, inflate 10-20%.&lt;/li>
&lt;li>&lt;b>Tessellate gap:&lt;/b> Triangulate S = □\P₀ (2D via Triangle) / tet-mesh via fTetWild / TetGen constrained Delaunay.&lt;/li>
&lt;li>&lt;b>Merge:&lt;/b> D = P∪S now convex tessellation. |S| ≈ 0.5|P|..2|P|, coarser outside.&lt;/li>
&lt;/ol>
&lt;h4>2. Weighted Barrier&lt;/h4>
&lt;p>Local injectivity maintained via log/barrier:&lt;/p>
&lt;p>$$E_{barrier}(f)=\sum_{t\in D} \begin{cases}E_{distort}(t) &amp; \det>0\\ +\infty &amp; \text{otherwise}\end{cases}+\lambda E_{scaffold}$$&lt;/p>
&lt;p>Symmetric Dirichlet: σ₁²+σ₁⁻²+σ₂²+σ₂⁻², ARAP ‖F-R‖², LSCM, MIPS. Scaffold weight w&lt;sub>S&lt;/sub>=0.1·area(S)/area(D) — soft, allows large stretch so distortion focuses on P. Hardening ε:1e-3→1e-5, Newton line-search ensures det>ε.&lt;/p>
&lt;h4>3. Covering Argument&lt;/h4>
&lt;p>Locally-injective PL map on complex that tessellates convex domain is a covering map onto its image (invariance of domain). Convex codomain + ∂D fixed ⇒ covering number 1 ⇒ homeomorphism. Extension to free boundary: ∂D slides along □, still injective.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="column is-one-third has-text-centered">
&lt;figure class="image">
&lt;img src="featured.png" alt="Scaffold featured" style="border-radius:8px;">
&lt;figcaption style="font-size:0.85em;margin-top:6px;">SCAF-2017 original scaffold ring&lt;br/>dark=patch, light=scaffold&lt;/figcaption>
&lt;/figure>
&lt;/div>
&lt;/div>
&lt;h2 class="title is-3 has-text-centered">Algorithm&lt;/h2>
&lt;div class="content">
&lt;pre style="background:#f7f7f7;padding:12px;border-radius:8px;">&lt;code>def SCAF(P0, energy="SymDirichlet"):
D, S_mask = build_scaffold(P0) # D = P ∪ S
f = rest(D)
for it in range(max_iter):
R = best_rotation(f) # Procrustes per element
f = linear_solve(D, R, w(det)) # weighted barrier stiffness
if min(det) &amp;lt; 1e-6: increase_barrier()
if converged: break
return f[P] # strip scaffold&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Complexity:&lt;/strong> O((|P|+|S|) log) per linear solve, 5-20 iters. 2 orders faster than CCD in [Aigerman &amp; Lipman13, Schüller13]. Library: &lt;code>igl::SCAFData s; s.add_mesh(P,V,F); scaf_solve(s);&lt;/code>&lt;/p>
&lt;/div>
&lt;div class="has-text-centered" style="margin: 1.5em 0;">
&lt;img src="method.png" alt="pipeline" style="max-width:88%; border-radius:8px; box-shadow:0 2px 12px rgba(0,0,0,.12);">
&lt;p style="font-size:0.9em;color:#666;margin-top:6px;">Pipeline: scaffold generation → joint locally-injective optimization → strip scaffold. Left self-intersecting leg untangled in 8s, 105k tets.&lt;/p>
&lt;/div>
&lt;h2 class="title is-3 has-text-centered">Theorems &amp; Proofs&lt;/h2>
&lt;div class="content">
&lt;div class="box">
&lt;p>&lt;strong>Theorem (Scaffold ⇒ Bijectivity).&lt;/strong> Let D tessellate convex □⊂ℝ&lt;sup>d&lt;/sup>. If f:D→ℝ&lt;sup>d&lt;/sup> is PL, locally injective (det>0 per simplex) and f|&lt;sub>∂D&lt;/sub>=id, then f is globally bijective on D. In particular f|&lt;sub>P&lt;/sub> globally injective and f(P)⊂□.&lt;/p>
&lt;p>&lt;em>Proof sketch 2D/3D unify:&lt;/em> Locally-injective PL map on simplicial complex is covering onto image (Smith et al.). Degree theory / Jordan-Brouwer: assume ∃x₁≠x₂, f(x₁)=f(x₂). Lift path from outer boundary to interior → winding contradiction. Scaffold barriers prevent exit. Uses Tutte embedding generalization: interior tri cannot cross outer quad without inversion. Formal via topological degree =1 due to fixed convex boundary.&lt;/p>
&lt;p>Extension free boundary: outer vertices constrained to slide along □ edges/faces, degree still 1.&lt;/p>
&lt;/div>
&lt;ul>
&lt;li>&lt;b>Guarantee:&lt;/b> line-search never accepts det≤0, so discrete flow maintains conditions for theorem every iteration.&lt;/li>
&lt;li>&lt;b>Vs prior:&lt;/b> Tutte yes but only fixed convex &amp; high distortion; Bounded Distortion yes but high distortion &amp; slow k≤10; SLIM fast no global; SCAF fast + low distortion + yes.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;h2 class="title is-3 has-text-centered">Results&lt;/h2>
&lt;div class="content">
&lt;p>Metrics on 114 meshes (Myles et al., Liu et al. datasets):&lt;/p>
&lt;table class="table is-bordered is-striped is-fullwidth is-size-7">
&lt;thead>&lt;tr>&lt;th>Method&lt;/th>&lt;th>Flip-free %&lt;/th>&lt;th>Avg SymDirichlet&lt;/th>&lt;th>Avg time&lt;/th>&lt;/tr>&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td>[Smith &amp; Schaefer 15]&lt;/td>&lt;td>88%&lt;/td>&lt;td>18.7&lt;/td>&lt;td>127s&lt;/td>&lt;/tr>
&lt;tr>&lt;td>Bounded Distortion&lt;/td>&lt;td>100% but high k&lt;/td>&lt;td>22+&lt;/td>&lt;td>300s&lt;/td>&lt;/tr>
&lt;tr>&lt;td>SLIM w/o scaffold&lt;/td>&lt;td>79%&lt;/td>&lt;td>11.9&lt;/td>&lt;td>0.9s&lt;/td>&lt;/tr>
&lt;tr>&lt;td>&lt;strong>SCAF (ours)&lt;/strong>&lt;/td>&lt;td>&lt;strong>100%&lt;/strong>&lt;/td>&lt;td>&lt;strong>12.3&lt;/strong>&lt;/td>&lt;td>&lt;strong>1.2s&lt;/strong>&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Benches: 100% bijective, 0 flips vs 12% fail competing, 10-100× speed.&lt;/p>
&lt;/div>
&lt;div class="has-text-centered" style="margin: 1em 0;">
&lt;img src="results.png" alt="results chart packing" style="max-width:86%; border-radius:8px;">
&lt;p style="font-size:0.9em;color:#666;">Multi-chart packing: multiple charts packed into single UV atlas without overlaps via shared scaffold. White = scaffold.&lt;/p>
&lt;/div>
&lt;div class="columns is-multiline" style="margin-top:1.2em;">
&lt;div class="column is-6">
&lt;h4 class="title is-5">Applications&lt;/h4>
&lt;ul>
&lt;li>&lt;b>Single-patch UV:&lt;/b> free-boundary low-distortion parametrization, boundary evolves but stays bijective.&lt;/li>
&lt;li>&lt;b>Multi-chart:&lt;/b> S = □\∪Pᵢ, joint opt distributes space fairly, no inter-chart overlaps → texture atlases.&lt;/li>
&lt;li>&lt;b>Untangling:&lt;/b> tangled leg 105k tets → flow from untangled proxy while scaffold valid → 8s.&lt;/li>
&lt;li>&lt;b>Inflation/Deformation:&lt;/b> bunny ×1.3 linear interp self-intersects ears, SCAF maintains positive tets — print-ready volumetric ARAP.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;div class="column is-6">
&lt;h4 class="title is-5">Limitations&lt;/h4>
&lt;ul>
&lt;li>Fixed to convex box (free slide still inside hull) — extreme stretches may hit box. Fix: inflate 2×.&lt;/li>
&lt;li>3D scaffold quality thin gaps → slivers — TetWild + weak w_S mitigate.&lt;/li>
&lt;li>Prevents intentional topology change (desired for bijectivity).&lt;/li>
&lt;li>Higher genus needs cut to disk first.&lt;/li>
&lt;/ul>
&lt;p>Future: scaffold for hex meshing, neural implicit maps, GPU.&lt;/p>
&lt;/div>
&lt;/div>
&lt;h2 class="title is-3 has-text-centered" style="margin-top:2em;">BibTeX&lt;/h2>
&lt;pre style="background:#f5f5f5;padding:12px;border-radius:8px;font-size:0.85em;">&lt;code>@article{jiang2017simplicial,
title = {Simplicial Complex Augmentation Framework for Bijective Maps},
author = {Jiang, Zhongshi and Schaefer, Scott and Panozzo, Daniele},
journal = {ACM Transactions on Graphics},
volume = {36},
number = {6},
pages = {186:1--186:9},
year = {2017},
publisher = {ACM},
doi = {10.1145/3130800.3130895},
url = {https://doi.org/10.1145/3130800.3130895},
note = {Proc. SIGGRAPH Asia 2017}
}&lt;/code>&lt;/pre>
&lt;div class="has-text-centered" style="margin-top:1.5em;">
&lt;p style="font-size:0.9em;color:#777;">Built by Zhongshi Jiang — scaffold maps are core of later works: Bijective Projection in a Shell, Bichon high-order meshes, FaceMap saliency. &lt;a href="https://github.com/jiangzhongshi/Scaffold-Map">scaffold-map&lt;/a>&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section></description></item><item><title>Example Project</title><link>https://jiangzhongshi.github.io/project/example/</link><pubDate>Wed, 27 Apr 2016 00:00:00 +0000</pubDate><guid>https://jiangzhongshi.github.io/project/example/</guid><description>&lt;p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis posuere tellus ac convallis placerat. Proin tincidunt magna sed ex sollicitudin condimentum. Sed ac faucibus dolor, scelerisque sollicitudin nisi. Cras purus urna, suscipit quis sapien eu, pulvinar tempor diam. Quisque risus orci, mollis id ante sit amet, gravida egestas nisl. Sed ac tempus magna. Proin in dui enim. Donec condimentum, sem id dapibus fringilla, tellus enim condimentum arcu, nec volutpat est felis vel metus. Vestibulum sit amet erat at nulla eleifend gravida.&lt;/p>
&lt;p>Nullam vel molestie justo. Curabitur vitae efficitur leo. In hac habitasse platea dictumst. Sed pulvinar mauris dui, eget varius purus congue ac. Nulla euismod, lorem vel elementum dapibus, nunc justo porta mi, sed tempus est est vel tellus. Nam et enim eleifend, laoreet sem sit amet, elementum sem. Morbi ut leo congue, maximus velit ut, finibus arcu. In et libero cursus, rutrum risus non, molestie leo. Nullam congue quam et volutpat malesuada. Sed risus tortor, pulvinar et dictum nec, sodales non mi. Phasellus lacinia commodo laoreet. Nam mollis, erat in feugiat consectetur, purus eros egestas tellus, in auctor urna odio at nibh. Mauris imperdiet nisi ac magna convallis, at rhoncus ligula cursus.&lt;/p>
&lt;p>Cras aliquam rhoncus ipsum, in hendrerit nunc mattis vitae. Duis vitae efficitur metus, ac tempus leo. Cras nec fringilla lacus. Quisque sit amet risus at ipsum pharetra commodo. Sed aliquam mauris at consequat eleifend. Praesent porta, augue sed viverra bibendum, neque ante euismod ante, in vehicula justo lorem ac eros. Suspendisse augue libero, venenatis eget tincidunt ut, malesuada at lorem. Donec vitae bibendum arcu. Aenean maximus nulla non pretium iaculis. Quisque imperdiet, nulla in pulvinar aliquet, velit quam ultrices quam, sit amet fringilla leo sem vel nunc. Mauris in lacinia lacus.&lt;/p>
&lt;p>Suspendisse a tincidunt lacus. Curabitur at urna sagittis, dictum ante sit amet, euismod magna. Sed rutrum massa id tortor commodo, vitae elementum turpis tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean purus turpis, venenatis a ullamcorper nec, tincidunt et massa. Integer posuere quam rutrum arcu vehicula imperdiet. Mauris ullamcorper quam vitae purus congue, quis euismod magna eleifend. Vestibulum semper vel augue eget tincidunt. Fusce eget justo sodales, dapibus odio eu, ultrices lorem. Duis condimentum lorem id eros commodo, in facilisis mauris scelerisque. Morbi sed auctor leo. Nullam volutpat a lacus quis pharetra. Nulla congue rutrum magna a ornare.&lt;/p>
&lt;p>Aliquam in turpis accumsan, malesuada nibh ut, hendrerit justo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque sed erat nec justo posuere suscipit. Donec ut efficitur arcu, in malesuada neque. Nunc dignissim nisl massa, id vulputate nunc pretium nec. Quisque eget urna in risus suscipit ultricies. Pellentesque odio odio, tincidunt in eleifend sed, posuere a diam. Nam gravida nisl convallis semper elementum. Morbi vitae felis faucibus, vulputate orci placerat, aliquet nisi. Aliquam erat volutpat. Maecenas sagittis pulvinar purus, sed porta quam laoreet at.&lt;/p></description></item><item><title/><link>https://jiangzhongshi.github.io/admin/config.yml</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jiangzhongshi.github.io/admin/config.yml</guid><description/></item></channel></rss>