<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jean Wentzel</title>
    <description>The latest articles on DEV Community by Jean Wentzel (@jean_wentzel_0b124632d9bd).</description>
    <link>https://dev.to/jean_wentzel_0b124632d9bd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4242551%2F22f41b3d-5af2-46e6-b66e-442779228890.jpg</url>
      <title>DEV Community: Jean Wentzel</title>
      <link>https://dev.to/jean_wentzel_0b124632d9bd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jean_wentzel_0b124632d9bd"/>
    <language>en</language>
    <item>
      <title>I put twelve 3D guests on our wedding website instead of writing "smart casual" (no 3D library)</title>
      <dc:creator>Jean Wentzel</dc:creator>
      <pubDate>Fri, 13 Nov 2026 09:05:32 +0000</pubDate>
      <link>https://dev.to/jean_wentzel_0b124632d9bd/i-put-twelve-3d-guests-on-our-wedding-website-instead-of-writing-smart-casual-no-3d-library-al7</link>
      <guid>https://dev.to/jean_wentzel_0b124632d9bd/i-put-twelve-3d-guests-on-our-wedding-website-instead-of-writing-smart-casual-no-3d-library-al7</guid>
      <description>&lt;p&gt;Shani and I get married in March 2027, in the highlands of South Africa. Every wedding website I looked at had the same dress-code section: a line that says "smart casual" and leaves everyone guessing.&lt;/p&gt;

&lt;p&gt;So I built ours by hand, and on the "What to wear" page I put twelve guests instead of a sentence.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://boomslangchips.github.io/wedding-guests-3d/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;boomslangchips.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;They show what to wear on each day of the weekend. They breathe, shift their weight, look around, fold their arms, glance at each other. You can drag one to turn them round, tap to step closer, and try the wedding colours on them.&lt;/p&gt;

&lt;p&gt;There is no game engine and no 3D library behind it: about &lt;strong&gt;250 KB of plain JavaScript and WebGL 1&lt;/strong&gt;, plus one 760 KB file for the bodies. It runs on a phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it fits together
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;atelier-core.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vectors, matrices, mesh building (tubes, shells, patches) and the WebGL renderer: skin, cloth, knit, denim, satin and hair shaders, a soft shadow map, the floor's reflection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;atelier-body.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reads the MakeHuman base mesh (CC0) in three body shapes, 163 bones and skin weights, and poses a body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;atelier-cloth.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A small position-based cloth simulation for skirts and long hair, kept out of the body by the body's own cross-sections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;atelier-figure.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One guest: body, face, hair, every garment cut round that body, shoes, accessories, and the arm poses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;atelier-stage.js&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The stage: day tabs, dragging, the colour swatches, and each guest's little "mind" (breath, weight shifts, glances, blinks, smiles)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The hardest part was hands
&lt;/h2&gt;

&lt;p&gt;Rendering was not the hard bit. Hands were.&lt;/p&gt;

&lt;p&gt;A hand "on the hip" that floats a centimetre away looks wrong instantly. One that sinks into the hip looks worse. Folded hands that pass through each other are the first thing anyone notices. So each resting pose is solved: two-bone IK for the arm, then a small solver that places the palm &lt;em&gt;against&lt;/em&gt; the surface it rests on, for every body shape.&lt;/p&gt;

&lt;p&gt;The stage also watches its own frame time and does less on slow devices, and nothing moves at all if you have reduced motion turned on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The guests stand in place: no walking.&lt;/li&gt;
&lt;li&gt;Fingers keep one relaxed shape.&lt;/li&gt;
&lt;li&gt;Creases at elbows and knees are drawn on the cloth, not simulated.&lt;/li&gt;
&lt;li&gt;All faces are variations of one head.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The rest of the site
&lt;/h2&gt;

&lt;p&gt;Our real site is private (it has our guest list on it), so I made a twin with a made-up couple and stock photos that you can click through: the invitation gate, a countdown, the weekend day by day, a drawn venue map, where to stay, an RSVP that knows who is on each invitation, and add-to-calendar.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://demo.wentzel.wedding" rel="noopener noreferrer"&gt;https://demo.wentzel.wedding&lt;/a&gt; (the invitation code is &lt;code&gt;DEMO&lt;/code&gt;)&lt;br&gt;
👉 &lt;strong&gt;3D guests, MIT licence:&lt;/strong&gt; &lt;a href="https://github.com/BoomslangChips/wedding-guests-3d" rel="noopener noreferrer"&gt;https://github.com/BoomslangChips/wedding-guests-3d&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wrote it with Claude Code over a few very long days. Happy to answer how any part works in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>webgl</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
