Portfolio


§ Automated Shape Modification to Support Filament Winding

  • GMP 2026
  • Computer Aided Geometric Design Vol. 127, Jun. 2026
  • Brandon G. Nguyen, Hang Li, Samraat Gupta, John Keyser

We introduced a method which automatically takes a designer surface and minimally modifies it to be suitable for fabrication via filament winding under a fixed set of winding parameters.

An overview of our iterative method to modify an existing surface in order to make it more suitable for filament winding.
Designer surface
(a) Designer's surface
Modified surface
(b) Modified surface
Hausdorff distance
(c) Hausdorff distance
(a) A surface might not be suitable for filament winding due to the fiber not staying in contact with the surface or from sparse coverage. (b) The surface is automatically modified to fix these issues while keeping the designer's intent. (c) A heatmap of the change in the input surface.

Both the physics-based geodesic solver for the winding paths and surface modification are implemented in C++ with Eigen. The surface modification works via optimization of the following objective to enforce convexity at certain points along the surface to influence the geodesic trajectory. (See §4 of the paper for more details.)

arg minΔC ΔCΔCsubject to MΔCB.\begin{split} \argmin_{\Delta\bm{C}}\ &\Delta\bm{C}^{\intercal} \Delta\bm{C}\\ \text{subject to}\ &\bm{M}\Delta\bm{C} \geq \bm{B}. \end{split}

[nC[pˉ1]JC[pˉ1]nC[pˉ2]JC[pˉ2]nC[pˉN]JC[pˉN]]MΔC[(p1sC[pˉ1])nC[pˉ1](p2sC[pˉ2])nC[pˉ2](pNsC[pˉN])nC[pˉN]]B.\begin{equation*} \underbrace{\begin{bmatrix} \bm{n}_{\bm{C}}[\bar{\bm{p}}_1]^{\intercal}\bm{J}_{\bm{C}}[\bar{\bm{p}}_1]\\[0.5em] \bm{n}_{\bm{C}}[\bar{\bm{p}}_2]^{\intercal}\bm{J}_{\bm{C}}[\bar{\bm{p}}_2]\\[0.5em] \vdots\\[0.5em] \bm{n}_{\bm{C}}[\bar{\bm{p}}_N]^{\intercal}\bm{J}_{\bm{C}}[\bar{\bm{p}}_N] \end{bmatrix}}_{\vec{M}} \Delta\bm{C} \geq \underbrace{\begin{bmatrix} (\vec{p}_1 - \bm{s}_{\bm{C}}[\bar{\bm{p}}_1]) \cdot \bm{n}_{\bm{C}}[\bar{\bm{p}}_1]\\[0.5em] (\vec{p}_2 - \bm{s}_{\bm{C}}[\bar{\bm{p}}_2]) \cdot \bm{n}_{\bm{C}}[\bar{\bm{p}}_2]\\[0.5em] \vdots\\[0.5em] (\vec{p}_N - \bm{s}_{\bm{C}}[\bar{\bm{p}}_N]) \cdot \bm{n}_{\bm{C}}[\bar{\bm{p}}_N] \end{bmatrix}}_{\vec{B}}. \end{equation*}

Designer surface
(a) Designer's surface
Modified surface
(b) Modified surface
Hausdorff distance
(c) Hausdorff distance
Additional example using a leg cast model to prevent slippage along the top of the ankle.

§ ReShader: View Dependent Highlights for Single Image View-Synthesis

  • SIGGRAPH Asia 2023
  • ACM Transactions on Graphics Vol. 42, Dec. 2023
  • Avinash Paliwal, Brandon G. Nguyen, Andrii Tsarov, Nima Kalantari

Existing single-image view synthesis pipelines often do not account for view-dependent lighting. We introduce a modular network to predict pixel-wise view-dependent shading to correct these artifacts in existing pipelines.

Example of a camera moving in a scene generated using 3D Moments [Wang22]. The left is the result generated by 3D Moments by itself, and the right is the result with our method applied.

Our method does not guarantee physically accurate shading, but instead provides more plausible lighting in view synthesis. Watch the accompanying video to see additional results.

The key insight is splitting view synthesis into pixel shading and relocation. For instance, a point can be visible from views c and c' yet have different shading because the same BRDF is sampled differently.
By modifying a C++ ray tracer to render a scene from view c but using the secondary rays from a novel view c', we generated a synthetic dataset used to train our reshading model.

§ Automated Shape Modification to Support Filament Winding

  • ICLR 2025
Brandon G. Nguyen, Chunkai Fu, Jung Hoon Seo, Ryan S. Zesch, Samson Zhou(† denotes equal contribution)

By using emergent query probability distributions from real-life data to inform the construction of two classical search data structures, skip-lists and kd-trees, we attain an upper-bound on the expected search time in O(min(H(f),logN))\mathcal{O}(\min(H(f), \log N)). Real world data queries often have skewed Zipfian distributions with entropy H(f)O(1)H(f) \in \mathcal{O}(1), meaning our augmented structures can be expected to have constant search time.

We prove for queries ii in the dataset [n][n] that the search time is bounded by O(H(fi))\mathcal{O}(H(f_i)) where fif_i is the predicted query probability for ii and H(fi)H(f_i) is the entropy; and for i∉[n]i \not\in [n] we have a worst-case O(logn)\mathcal{O}(\log n) search time. In datasets with highly skewed distributions, H(f)lognH(f) \ll \log n so we see meaningful speed-ups. Additionally, we guarantee robustness against (α,β)(\alpha, \beta)-noisy oracles that give imperfect predictions fiαpi+βf_i \triangleq \alpha\,p_i + \beta, with α\alpha being the multiplicative and β\beta the additive error on the true query probability pip_i for i[n]i \in [n].

Experimental results on a synthetic dataset using our kd-tree construction. Both plots show the average depth for search queries within our dataset, with increasing noise moving towards the bottom right. The left plot shows the search-time traditional kd-tree with constant depth regardless of data distribtion, whereas our kd-tree is able to terminate the search at much lower depths compared to the traditional kd-tree even with very noisy predictions.

§ Position Based Fluids

  • Coursework under Dr. Shinjiro Sueda, Nov. 2022

Implementation of Position Based Fluids [Macklin13] using C++/CUDA with spatial hashing to simulate hundreds of thousands of fluid particles in real-time (60+ FPS).

The left shows a splash example and the right shows a double dam break. Notice when the fluid particles collide that we see that the particles tend to stick togehter rather than exploding into many smaller pieces, this is due to the XSPH viscosity correction adding a surface tension effect. Additionally, the use of vorticity confinement prevents over dampening of the system due to numerical inaccuracies.
A quadruple dam break featuring hundreds of thousands of particles, running in real time.

§ Rigid Body Dynamics

  • Coursework under Dr. John Keyser, Oct. 2024
Implementation of rigid body dynamics and contact modelled as a BLCP with a projected Gauss-Seidel (PGS) solver, Coulomb friction, and SDF-SDF collision.
Example scene.

§ Single Image 3D View Synthesis with Triplane Denoising Diffusion GAN

  • Preliminary research under Dr. Nima Kalantari, Oct. 2023

We modify DiffusionGAN from NVIDIA [Xiao22] to synthesize consistent novel-views either from a single image or unconditionally. The model accepts a noised image with its camera pose and outputs a triplane. A feature decoder network predicts color and depth from accumulated features along rays from a novel camera pose. End-to-end training is done with an adversarial loss on the color and disparity triplane images from various poses.

(a) Color
(b) Disparity
We generate unconditional triplanes by passing pure Gaussian noise to the model. Above is a render of an unconditionally triplane generated from a model trained on ShapeNet Cars.

§ Walk on Stars & Walkin' Robin

  • Coursework under Dr. John Keyser, Dec. 2024

An interactive implementation of Walk on Stars [Sawhney23] and Walkin' Robin [Miller24] in the browser using WebGL2, solving a Laplace equation on an arbitrary 2D domain without meshing, computed in parallel with a compute shader.

Example of Walk on Stars on the Laplace equation Δu=0 on Ω,u=g on δΩD,un=0 on δΩN\Delta u = 0 \text{ on } \Omega, u = g \text{ on } \delta\Omega_D, \frac{\partial u}{\partial n} = 0 \text{ on } \delta\Omega_N with Dirichlet (ΩD\partial\Omega_D) boundaries on the top and bottom and Neumann (ΩN\partial\Omega_N) on the left and right.

(a) μ=0.0\mu = 0.0 (pure Neumann)

(b) μ<1.0\mu < 1.0 (Robin)

(c) μ=\mu = \infty (pure Dirichlet)

Example of Walkin' Robin with with varying Robin coefficents along the entire boundary, we can see as μ\mu \to \infty that the reflectivity of the boundary lessens.