惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
Jina AI
Jina AI
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
宝玉的分享
宝玉的分享
C
Check Point Blog
有赞技术团队
有赞技术团队
小众软件
小众软件
IT之家
IT之家
Vercel News
Vercel News
V2EX - 技术
V2EX - 技术
雷峰网
雷峰网
L
Lohrmann on Cybersecurity
Cloudbric
Cloudbric
Engineering at Meta
Engineering at Meta
Schneier on Security
Schneier on Security
P
Privacy International News Feed
Apple Machine Learning Research
Apple Machine Learning Research
W
WeLiveSecurity
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
J
Java Code Geeks
T
Threatpost
S
Secure Thoughts
T
Tailwind CSS Blog
V
V2EX
Attack and Defense Labs
Attack and Defense Labs
P
Palo Alto Networks Blog
S
Security @ Cisco Blogs
The GitHub Blog
The GitHub Blog
Simon Willison's Weblog
Simon Willison's Weblog
The Register - Security
The Register - Security
AWS News Blog
AWS News Blog
罗磊的独立博客
GbyAI
GbyAI
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Webroot Blog
Webroot Blog
爱范儿
爱范儿

Codrops

Magnetic Commerce: Building the Dash Creative Website | Codrops The Craft Behind Memorable Digital Experiences: Inside Unseen Studio | Codrops ZERO: The Engineering Behind a Defiant Interactive Narrative | Codrops Meet the Speakers of the First Three.js Conference | Codrops The Architecture Behind Trionn: Coordinating GSAP, Three.js, Lenis, and Web Audio | Codrops Where Stories Become Interactive Worlds: How makemepulse Brings Ideas to Life Across Web, XR, and Beyond | Codrops The Sleepers: Creating an Atmospheric WebGL Experience with Lightweight Techniques Building an Interactive Wave Propagation Cube Grid with Three.js | Codrops Ten Years Away: Designing an Interactive Comic for Studio375’s Tenth Anniversary | Codrops Building a Scroll-Driven 3D Gallery Using a Blender Camera Path with Three.js and GSAP | Codrops From Years of Client Work to a Next.js + Sanity Starter Kit | Codrops Building Persistent Page Transitions with WebGPU and Vanilla JavaScript | Codrops Inside Bisous: Designing an Editorial Experience for Cinematic CGI | Codrops Engineering the Web Experience Behind Shopify’s Spring ’26 Edition: Everywhere | Codrops Shaping Stories into Experience: The Work of Kevin Lam | Codrops Testing What Users Actually See with Vitest and Chromatic | Codrops Podium: Building a Website Where Running Becomes Storytelling | Codrops Designing Beyond the Surface: How DashDigital Turns Complexity into Clarity | Codrops Creative Entrepreneurship: Designing the Machine | Codrops Exploring 3D Image Rotations on Scroll | Codrops Always Building, Always Learning: Cyd Stumpel’s Journey Through the Modern Web | Codrops Designing A Better Lou: Reducing Cognitive Load Through Design, Content, and Systems | Codrops Sketching the Impossible: A 3D Portfolio Built Without a Single 3D Model | Codrops Building Horeca: Advanced Motion Design in Webflow Without the Performance Trade-Offs | Codrops Building an Interactive Digital Stamp Collection with Shaders, Postcards, and Playful Inspection | Codrops No Two Paths Alike: Inside San Rita’s Approach to Digital Experiences | Codrops The Making of the New Lesse Studio Website: Clarity, Performance, and Intentionality | Codrops Creating a Thumbnail Flow Animation with GSAP MotionPath | Codrops Forging Her Own Path: Houmahani Kane’s Journey in Creative Development | Codrops Beaucoup and the Pursuit of Memorable Experiences | Codrops The Future of Emotional Technology: Comfort Websites for Growth and Self-Awareness | Codrops The Never Ending Story: Building a Seamless Infinite Scroll Experience with GSAP & Lenis | Codrops Whooshes, Snaps and Shaders: Adrien Vanderpotte and the Feeling of the Interface | Codrops Building a Scroll-Driven 3D Cube Gallery in Webflow with GSAP | Codrops Creating Scroll-Driven SVG Map Animations with GSAP | Codrops Made With Gsap: Building a Fun Gravity-Based Mouse Trail | Codrops 80s Business Tech and Seamless Scene Transitions: Inside Shader.se’s Scroll-Driven WebGPU Pipeline | Codrops Merlin: The Code Boutique Turning Motion Into Digital Magic | Codrops Designing Ourselves: The New Obys Identity and Website | Codrops Exploring the HTML-in-Canvas Proposal | Codrops Le:mma Studio: Building the Feeling Behind the Screen | Codrops From Shader Uniforms to Clip-Path Wipes: How GSAP Drives My Portfolio | Codrops Reverse-Engineering Claude AI’s Mascot Animations with SVG and GSAP | Codrops Akaru: Crafting Precision-Driven Digital Experiences | Codrops Designing Against the Gallery: A Two-Year Journey to a Layered Portfolio Experience | Codrops Between Human and Machine: Sofia Papadopoulou’s Approach to Augmented Creativity | Codrops More Than a Portfolio: Building a Scroll-Driven 3D World with Something to Say | Codrops Rhumb Studio: Small but Mighty, Shaped by Curiosity | Codrops Susurrus: Crafting a Cozy Watercolor World with Three.js and Shaders | Codrops Building 4WIDE: Turning Distortion, Blur, and Motion into a Coherent Experience | Codrops A Playful Clip Menu with GSAP’s easeReverse | Codrops False Earth: From WebGL Limits to a WebGPU-Driven World | Codrops Interactive Storytelling for the Web: Building Immersive Stories with Timelines, 3D, and Layered Scenes | Codrops The Art of Complex Motion: Corentin Bernadou’s World of Shaders and Experimentation | Codrops They Call Me Giulio: The Making of a Cinematic Cyberpunk Portfolio | Codrops Lusion: Where Digital Craft Meets Ambitious Experimentation | Codrops The Exat Microsite: Pushing a Typography Showcase to New Creative Extremes | Codrops A Single DM, a First SOTD, and the Start of Chanh M. Ho’s Creative Journey | Codrops Creating Custom Page Transitions in Astro with Barba.js and GSAP | Codrops R—K ’26: The Thinking and Code Behind a Portfolio Led by Presence | Codrops Building the Maxima Therapy Website: React, GSAP, and Dabbling with AI | Codrops Where Engineering Meets Craft: Edoardo Lunardi’s Obsession with the Details | Codrops Animating 160,000 Cubes in Three.js to Visualize Dithering | Codrops Arnaud Rocca’s Portfolio: From a GSAP-Powered Motion System to Fluid WebGL | Codrops Where Confidence Needs No Decoration: The Malvah.Studio Story | Codrops Motion Highlights #17 | Codrops
Sculpting a Digital Athlete: Capturing Stefanos Tsitsipas Beyond the Court | Codrops
By OFF+BRAND · 2026-07-01 · via Codrops

When designing a website around a person rather than a product, the challenge goes beyond visuals. The experience has to capture who they are and what people associate with them.

For Stefanos Tsitsipas, that meant first understanding his world before translating it into an interactive experience. Our goal was to represent his personality as authentically as possible for his community and fans.

Project Backstory

Stefanos Tsitsipas is one of the most recognizable names in tennis. Beyond his performances on the court, he is also a familiar face in international brand campaigns. From the very beginning, we wanted the experience to reflect both sides of his identity: the elite athlete and the personality beyond the game.

Production Pipeline

The 3D production pipeline relied on Cinema 4D, Redshift, Blender, and Marvelous Designer for asset creation, animation, and cloth simulation.

Photogrammetry

The first step was to capture a 360-degree scan of Stefanos using photogrammetry. OFF+BRAND partnered with a French studio to carry out the scan, as the process requires around 70 cameras and a highly specialized setup.

Stefanos being scanned with the photogrammetry technic in Paris

We asked Stefanos to stand in either an A-pose or a T-pose to make rigging in Mixamo easier.

We requested two distinct setups: one for the on-court version and another for the off-court version. For the on-court version, we needed the tennis outfit, hair with a headband, and wristbands to be included in the scan. For the off-court version, we required his hair without a headband and no additional accessories.

The studio delivered two versions of Stefanos, each with three Levels of Detail (LODs), ranging from high-definition models to optimized low-poly versions.

Off-court 3 LODs

Each part of the body had its own texture—arms, legs, head, and torso. This setup wasn’t suitable for WebGL, as it was not optimized at all. 

Stefanos Photogrammetry Scan Textures
UV sets from the Stefanos 3D scan model
Arm texture applied to the arm UVs.

UV Optimization

Set of 8 textures

The first step was to consolidate all eight textures into a single optimized texture set. To achieve this, we used Blender’s texture remapping tools. We duplicated the UVs, creating UV1 from the original model and UV2, which was remapped to pack all eight textures into a single UV layout. We then transferred the texture data from UV1 to UV2, as the original textures had already been baked onto the UV1 layout.

One single texture for one single object for Stefanos

Rigging

Once we had reduced the model to a single texture, we needed to rig it. After several tests, we discovered an issue with one of the hands, so we adjusted the fingers to ensure they were properly separated, allowing Mixamo to correctly interpret the topology.

Since we didn’t need an animation from Mixamo, we only downloaded the newly rigged model of Stefanos in a T-pose.

Character Posing

We then imported the rigged model into Cinema 4D and adjusted its pose to give Stefanos a strong, powerful stance. Both the on-court and off-court versions needed to share the same pose, so we chose one in which he holds his racket while crossing his arms. We created two keyframes for each animated bone: one maintaining the A-pose, which we would need later, and a second, a few frames afterward, with the arms crossed.

Once we were happy with the pose, we exported it as an Alembic file so that the animation could be imported into Marvelous Designer.

Clothing Simulation

The initial timeline for the entire 3D production process was estimated at five to eight days, but it ultimately took 14 days to complete. Given the tight schedule, we decided to use ready-made outfits from the Marvelous Designer Marketplace.

Free outfits for on court
Outfit for the off-court

We opened the outfits in Marvelous Designer and imported Stefanos’ Alembic files.

Although the first two versions of Stefanos on the homepage were not animated, we still needed them to start in an A-pose so the T-shirt could be properly fitted between the arms and the torso. Otherwise, fitting the T-shirt correctly would have been much more difficult, as the arms would have interfered with the process.

Once we were happy with the pose, we re-exported the dressed model of Stefanos as an FBX so it could be imported into the next tool. For the crossed-arms pose, we further refined it in Cinema 4D, subtly enlarging the torso and arms to give him an even stronger presence.

Below is a comparison between the initial pose and the final iteration. The difference in energy is immediately noticeable. Since we wanted to showcase Stefanos’ personality while evoking the presence of a Greek statue, we paid close attention to these details, as they made a significant difference.

For the animated version, we exported the model again as an Alembic file to preserve the animation.

As with Stefanos’ original model, each outfit came with its own UV set. We therefore consolidated them into a single texture set.

We used two different approaches for the textures.

For the static poses, we baked the shadows. We set up the lighting in Cinema 4D using Redshift, positioning the main light to come from Stefanos’ left side. We also baked ambient occlusion (AO) to add more realism to the statue.

Texture Development

For the animated version, we used only ambient occlusion and diffuse maps. We exported them from Substance Painter in case we later needed roughness and metalness maps, as these are not included in the beauty pass.

For the animated Stefanos statue, the main challenge was choosing the right angle to avoid introducing excessive ambient occlusion into the clothing. To solve this, we created two AO textures from different moments in the animation and combined them. We then refined the result with additional adjustments in Photoshop.

For the painted version, the reference image—created using AI tools—was a painted portrait of Stefanos. In WebGL, this meant the texture needed to incorporate a painterly shading style.

We ran several tests in Substance Painter but ultimately found that the WebGL rendering alone already provided a sufficiently painterly look.

Prop Optimization

To simplify the racket’s geometry, we used an alpha texture to create the strings. We then applied the PNG to a simple square mesh.

Hair Sculpting

For the hair and beard, we wanted them to resemble a Greek statue, so they needed to be sculpted. We used ZBrush to sculpt each strand individually.

Character Animation

For the animation, Stefanos has a very distinctive service motion, which we needed to replicate as accurately as possible. We used reference videos found online and worked frame by frame to match the movement.

The main challenge was that the 3D artist was not a character animation specialist and was not deeply familiar with tennis, making it difficult to judge whether the pose was accurate or realistic for a professional player. Fortunately, our project manager, Matt, is very knowledgeable about tennis and provided valuable feedback throughout the process. His input paid off, as Stefanos’ team provided very little feedback on the 3D animation.

Another challenge was exporting an optimized animated model with cloth simulation. Our developer, Adrian, found a solution by removing selected keyframes from the shape keys.

At first, the result looked completely broken, but it was simply a matter of understanding how the system worked. Each shape key is linked to a specific keyframe: at frame 1, shape key 1 is set to 1 while all others are set to 0.

However, if shape key 1 is set to 1 at frame 1 and no new value is recorded later, it will remain at 1 in subsequent frames. Therefore, when removing keyframes to reduce the file size, we also needed to readjust the shape key values by deleting unnecessary keys and re-recording the remaining ones.

From photogrammetry to WebGL optimization, every step of the pipeline was carefully crafted to create a digital experience that reflects Stefanos Tsitsipas’ personality both on and off the court.