[{"content":"Digital garment modelling in VR (short dgmvr) is a cloth simulation tool in VR developed as a semester thesis at the Interactive Geometry Lab at ETH Zurich.\nShowcase with gravity and no regularization Method # Existing methods and VR implementations # There are many different approaches used to simulate fabrics (table links either to paper about method or an vr implementation if it exist)\nMethod Fast Precise Anisotropic deformations Mass spring systems (1) ✓ X X Finite element method (2) X ✓ ✓ Yarn level simulation (3) X ✓ ✓ Position based dynamics (4) ✓ ~ X Chebshev (5) ✓ ✓ ✓ Chebyshev deformation # The goal of the semester thesis was to implement the Chebyshev deformation (introduced by Annika Öehri here) in Unity. The goal of the method is to solve minimize following energy describing the stretching of our mesh along the yarn lines.\nEquation to minimize Here C is the set of jakobians for deformations we want to allow. To minimize the energy a local global approach can be used. The local step (1,2) are independent for each triangle and the global solve (3) corresponds to a sparse solve of a symmetric matrix. The pseudo code is as follows:\nforeach iteration step 1. Compute jakobian J_t 2. Solve local step c_t = min_{c ∈ 𝐶} ||J_t - c||_f 3. Minimize SUM_{t ∈ T} A_t c_t 4. Recompute velocity Position constraints can be enforced by clever substitution and we can add gravity by changing the free vertices before the solve (not constrained/pinned by user). One important thing if gravity is added, our cloth can collapse into a line (still in set C), thus regularizer\u0026rsquo;s are needed that slightly bias our c_t towards rotations only without deformations (method use ARAP for this).\nShowcase # Showcase without gravity or regularization Showcase with gravity and regularization Implementation # The project was made in Unity 5 and supports Meta\u0026rsquo;s headsets with the Meta Quest 3 being tested. It runs via the Link (due to how the simulation code is compiled currently). While C# has numerics libraries, they all have some drawbacks.\nLibrary Flaw Numerics.Net Not free Alglib BLAS level (no easy sparse x sparse mult.) Math.Net No sparse factorization Instead the project relies on Unity\u0026rsquo;s support for external C++ dll, handling the whole simulation in C++ with Eigen and Libigl while passing the mesh data between each other. The simulation supports grabbing handles and changing different parameters (stiffness, regularization strength, gravity strength) and does one iteration per frame.\nCode # The code of this project is hosted on Github.\nAcknowledgement # This project was developed as a semester thesis at IGL under the supervision of Annika Oehri\n","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/projects/dgmvr/","section":"Projects","summary":"summary","title":"Digital garment modelling in VR","type":"projects"},{"content":" A physically based pathtracer built in C++ as part of ETH Zürich\u0026rsquo;s computer graphics course, extended with advanced rendering features including volumetric media, Disney BRDF, and low-discrepancy sampling. The renderer is based on Nori, a minimal pathtracer framework providing model loading, ray-triangle intersection, and BVH acceleration. During the homeworks I implemented features such as diffuse, specular and dielectic materials (with multiple importance sampling), and photon mapping. he final project was done in a group of two with my friend contributed environment map and many-light sampling.\nFinal renderer I will now discuss the interesting features implemented by me.\nHalton Sampling # We replace Uniform sampling with Halton sampling due to its low discrepancy. Halton sampling is done using Halton Sequences. For a sample we compute the n-th number (index) in the halton sequence of base k. For the next sample we use the next prime as base. To avoid correlation we pick a random index depending on the pixel position and permute the sequence of prime bases.\nUniform (top) compared to Halton sampling (bottom; base 2 and 3)\nHere a comparison between uniform and halton sampling both with 16 sample per pixel (spp).\nWhile Halton sampling is more expensive it still performs better when compared to uniform sampling using the same render time of 1.2 min. The Independent sampler used 1412 spp and Halton 1024.\nDisney BRDF # I implemented the Disney BRDF with the parameters: Roughness, Metallic, Anisotropic, Sheen, Sheen Tint. To check the correctness I compared my rendering with Mitsuba using a mesh from here. Anistropic materials needed consistent tangent frames so I implemented Computing Tangent Space Basis Vectors for an Arbitrary Mesh.\nAlso important to add was texture support for the materials.\nHeterogeneous Participating Media # Heterogeneous participating media is rendered using delta tracking and supports isotropic and Henyey-Greenstein phase functions. The code uses nanovdb for loading the volume.\nVolume with Henyey-Greenstein phase function (g = 0.8)\n","date":"20 December 2024","externalUrl":null,"permalink":"/portfolio_hugo/projects/pathtracer_nori/","section":"Projects","summary":"","title":"Physically based Pathtracer","type":"projects"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/tags/c%23/","section":"Tags","summary":"","title":"C#","type":"tags"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/tags/c++/","section":"Tags","summary":"","title":"C++","type":"tags"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/","section":"Jan Grunder","summary":"","title":"Jan Grunder","type":"page"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/projects/","section":"Projects","summary":"","title":"Projects","type":"projects"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/tags/simulation/","section":"Tags","summary":"","title":"Simulation","type":"tags"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/tags/unity/","section":"Tags","summary":"","title":"Unity","type":"tags"},{"content":"","date":"28 January 2026","externalUrl":null,"permalink":"/portfolio_hugo/tags/vr/","section":"Tags","summary":"","title":"VR","type":"tags"},{"content":"","date":"20 December 2024","externalUrl":null,"permalink":"/portfolio_hugo/tags/pathtracing/","section":"Tags","summary":"","title":"Pathtracing","type":"tags"},{"content":"These are some small recordings of games I made before and during the first year of University using Godot and is mostly here for nostalgia. Two of the entries were game jam games while the other was a game I worked on for a few months during highschool. This first game was made all the way back in Godot 2 using GDScript (python like syntax) and was a platformer with multiple boss fights. This one read levels from image files as the Tile set editing in Godot 2.x wasn\u0026rsquo;t as well implemented as it is nowadays.\nThis game was done as a solo game jam project in LÖVE2D a game frame work, which along with raylib started my dive and interest into how game engines and rendering works\nThe second game was a puzzle platformer where one could always only activate one ability at a time. This game was made during 48 hours in a 2 person team.\nThis game was a local coop or single player party racer with the main gimmick being able to throw boomerangs to stop others in their track writen using Godot\u0026rsquo;s C# support. This game was made during 48 hours with 2 people writing the game and one person responsible for art.\n","date":"20 February 2022","externalUrl":null,"permalink":"/portfolio_hugo/projects/games/","section":"Projects","summary":"","title":"Game jams and early games","type":"projects"},{"content":"","date":"20 February 2022","externalUrl":null,"permalink":"/portfolio_hugo/tags/games/","section":"Tags","summary":"","title":"Games","type":"tags"},{"content":"","date":"20 February 2022","externalUrl":null,"permalink":"/portfolio_hugo/tags/godot/","section":"Tags","summary":"","title":"Godot","type":"tags"},{"content":"","date":"20 February 2022","externalUrl":null,"permalink":"/portfolio_hugo/tags/lua/","section":"Tags","summary":"","title":"Lua","type":"tags"},{"content":"","date":"20 February 2022","externalUrl":null,"permalink":"/portfolio_hugo/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"Hi there! I am currently a master student at ETH Zurich in my final year. I am currently working on my master thesis: \u0026ldquo;Real-time vegetation and forest rendering\u0026rdquo; at the Visualization and MultiMedia Lab UZH and Game Lab ETHZ. My main interest lie in real time rendering and other computer graphics topics.\n","externalUrl":null,"permalink":"/portfolio_hugo/about/","section":"Jan Grunder","summary":"","title":"About Me","type":"page"},{"content":"","externalUrl":null,"permalink":"/portfolio_hugo/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/portfolio_hugo/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/portfolio_hugo/series/","section":"Series","summary":"","title":"Series","type":"series"}]