Making 3D Designable Inside Framer

Likes

0 views

8 Mins Read

Overview

Framer x ThreeJS Runtime là một lightweight Three.js runtime được xây dựng dành cho designer.

Mục tiêu của dự án là giúp designer có thể tạo và điều khiển 3D scene trực tiếp trong Framer mà không cần viết code hay hiểu sâu về Three.js.

Thay vì phải thiết lập renderer, camera, animation, lighting hay interaction bằng code, designer chỉ cần upload model và làm việc với những control quen thuộc của Framer.

Why It Exists

Hầu như designer nào cũng muốn làm một website 3D cho riêng mình.

Tuy nhiên, việc xây dựng một website Three.js vẫn là một rào cản lớn.

Trong khi Framer giúp designer xây dựng website nhanh hơn bao giờ hết, workflow cho 3D vẫn phụ thuộc vào các công cụ bên ngoài như Spline hoặc các custom component rời rạc.

Điều đó tạo ra một khoảng trống khá rõ:

Designer có thể build website trong Framer.

Nhưng lại không thể build trải nghiệm Three.js trong chính workflow đó.

Câu hỏi đặt ra là:

Nếu designer có thể tự xây website trong Framer, tại sao họ không thể tự xây một website Three.js theo cùng cách đó?

The Gap Between Spline and Custom Three.js

Khi bắt đầu nghiên cứu workflow 3D cho Framer, tôi nhận ra hầu hết mọi người thường rơi vào một trong hai hướng.

Hướng đầu tiên là sử dụng các công cụ như Spline. Đây là cách nhanh nhất để đưa một model 3D lên website. Tuy nhiên khi dự án cần nhiều tương tác hơn, logic animation phức tạp hơn hoặc cần gắn chặt với layout và content của website, workflow này bắt đầu bộc lộ giới hạn.

Hướng thứ hai là xây dựng trực tiếp bằng Three.js. Điều này mang lại khả năng kiểm soát gần như không giới hạn, nhưng đổi lại là độ phức tạp kỹ thuật rất cao. Designer gần như phải trở thành developer để có thể tiếp tục.

Khoảng trống nằm ở giữa hai cách tiếp cận đó.

Tôi không muốn tạo ra một công cụ thay thế Three.js.

Tôi cũng không muốn tạo thêm một trình editor 3D khác.

Mục tiêu là tạo ra một runtime cho phép designer làm việc với 3D bằng chính workflow mà họ đã quen thuộc trong Framer.

The Challenge

Vấn đề không nằm ở việc render được model 3D.

Vấn đề nằm ở việc biến một thư viện kỹ thuật như Three.js thành một công cụ mà designer có thể sử dụng được.

Điều này tạo ra ba thách thức lớn:

Challenge

Meaning

API complexity

Three.js có quá nhiều khái niệm kỹ thuật đối với designer

Framer integration

Three.js không được thiết kế để hoạt động như một Framer component

Designer usability

Runtime phải đủ mạnh cho production nhưng vẫn đủ đơn giản để học nhanh

Thách thức lớn nhất là tìm ra đâu là những phần quan trọng nhất của Three.js cần được expose, và đâu là những phần nên được ẩn đi.

The biggest challenge was not rendering 3D.

The biggest challenge was deciding what not to expose.

Three.js cung cấp hàng trăm API, setting và khái niệm kỹ thuật khác nhau. Nếu expose toàn bộ, sản phẩm sẽ nhanh chóng trở thành một developer tool thay vì một design tool.

Core Idea

Thay vì đưa toàn bộ Three.js vào Framer, tôi chọn cách ngược lại:

Chỉ mang những gì designer thực sự cần.

Designer không cần hiểu:

  • Renderer

  • Scene Graph

  • Animation Mixer

  • Raycaster

  • Render Loop

  • Environment Pipeline

Designer chỉ cần:

  • Upload model

  • Scroll xuống

  • Model chuyển trạng thái

  • Hover vào object

  • Trigger animation

Mục tiêu của runtime là biến các khái niệm kỹ thuật thành những control quen thuộc bên trong Framer.

Approach

Step 01 — Define the Minimum Runtime

Tôi bắt đầu bằng việc xác định những tính năng thiết yếu nhất cho một website 3D hiện đại:

  • Model import

  • Camera control

  • Scroll-driven animation

  • Hover interaction

  • Lighting

  • Environment

  • Material control

Ngoài ra runtime cần hỗ trợ:

  • Upload model bằng local file hoặc URL

  • Camera scroll-drive theo section

  • Position, Rotation, Scale animation

  • Scroll appear

  • Scroll transform

  • Scroll animation

  • State transition

Tất cả đều phải bám sát mental model mà designer đã quen thuộc trong Framer.

Step 02 — AI-Assisted Development

Đây là một lĩnh vực hoàn toàn mới đối với tôi.

Thay vì build toàn bộ bằng tay, tôi sử dụng AI agent để tăng tốc quá trình nghiên cứu và phát triển.

Agent được trang bị hai nhóm kiến thức chính:

  • Framer Component Architecture

  • Three.js Runtime Architecture

Song song đó tôi nghiên cứu Framer Developer API và phân tích nhiều website Three.js khác nhau để hiểu những pattern phổ biến trong thị trường.

Step 03 — Build First, Optimize Later

Ở giai đoạn đầu, tôi chủ động bỏ qua kiến trúc.

Mục tiêu duy nhất là:

Build tất cả những gì có thể build.

Tôi muốn hiểu giới hạn của Three.js, giới hạn của Framer và giới hạn của chính runtime trước khi bắt đầu tối ưu hệ thống.

Step 04 — Become the User

Đây là giai đoạn tốn nhiều thời gian nhất.

Tôi liên tục sử dụng chính sản phẩm mình tạo ra dưới góc nhìn của một designer.

Mỗi control đều phải trả lời một câu hỏi:

Nó có dễ dùng hơn việc mở code editor không?

Nếu câu trả lời là không, control đó sẽ bị thiết kế lại.

Nhiều nhóm setting kỹ thuật được gom thành object đơn giản hơn để giảm cognitive load cho designer.

What I Built

Phiên bản đầu tiên đã bao phủ gần như toàn bộ workflow cần thiết cho một website Three.js trong Framer.

Scene Control

  • Model Import

  • Camera Setup

  • Environment Control

  • HDRI Setup

  • Lighting Control

  • Material Control

  • Post Processing

  • Debug Helper

Motion & Interaction

  • Scroll Animation

  • Scroll Appear

  • Scroll Transform

  • State Machine

  • Hover Interaction

  • Click Interaction

  • Lerp Animation Smoothing

Điểm quan trọng nhất là tận dụng event system có sẵn trong Framer thay vì tạo ra một workflow hoàn toàn mới.

Designer vẫn làm việc theo cách quen thuộc của Framer.

From Model Interaction to Object Interaction

Ở giai đoạn đầu, runtime chỉ hỗ trợ model-level interaction.

Designer có thể:

  • Move model

  • Scale model

  • Rotate model

  • Trigger animation

Điều này đủ để tạo ra các landing page 3D cơ bản.

Tuy nhiên sau nhiều vòng thử nghiệm, tôi nhận ra vấn đề không nằm ở model.

Vấn đề nằm ở các object bên trong model.

Ví dụ một chiếc xe không phải là một object duy nhất.

Nó bao gồm:

  • Door

  • Wheel

  • Dashboard

  • Steering Wheel

Designer không chỉ muốn xoay cả chiếc xe.

Họ muốn:

  • Hover vào bánh xe

  • Click vào cửa xe

  • Trigger animation cho dashboard

  • Thay đổi trạng thái của từng object riêng lẻ

Điều này dẫn tới việc tôi xây dựng hệ thống Object Interaction.

Thay vì điều khiển model ở cấp độ scene, runtime có thể expose interaction ở cấp độ object bên trong model.

Điều này mở ra nhiều khả năng hơn cho product showcase, storytelling website và interactive experience.

The Hardest Problem

Bài toán khó nhất không phải animation.

Mà là rendering.

Ban đầu mỗi component đều sở hữu một WebGL renderer riêng.

Cách tiếp cận này hoạt động tốt với các website đơn giản.

Nhưng khi layout trở nên phức tạp hơn, vấn đề bắt đầu xuất hiện:

  • GPU memory tăng nhanh

  • Render cost tăng theo số lượng canvas

  • Mobile browser dễ crash hơn

  • Layout phức tạp khó kiểm soát

Vấn đề thực sự không nằm ở model.

Vấn đề nằm ở số lượng WebGL context được tạo ra.

Root / Slot Renderer Architecture

Để giải quyết điều đó, tôi thiết kế một kiến trúc mới mang tên:

Root / Slot Renderer Bridge

Thay vì mỗi component tạo ra một renderer riêng.

Toàn bộ website chỉ sử dụng một renderer duy nhất.

Các Slot chỉ có nhiệm vụ khai báo dữ liệu, trạng thái và instruction.

Renderer trung tâm sẽ chịu trách nhiệm render toàn bộ scene.

Benefit

Impact

Shared WebGL Context

Giảm số lượng renderer cần tạo

Better Performance

Giảm GPU cost và memory usage

Better Mobile Stability

Hạn chế crash trên thiết bị yếu

Flexible Composition

Cho phép đặt 3D content ở nhiều vị trí khác nhau trong layout

Đây cũng là phần tốn nhiều thời gian nghiên cứu, build và debug nhất trong toàn bộ dự án.

Outcome

Runtime giúp biến workflow Three.js từ một bài toán engineering thành một workflow gần hơn với cách designer đang làm việc trong Framer.

Designer có thể:

  • Upload model

  • Thiết lập animation

  • Điều khiển state

  • Tạo scroll interaction

  • Xây dựng landing page 3D

mà không cần thiết lập Three.js từ đầu.

Quan trọng hơn, toàn bộ trải nghiệm vẫn giữ được mental model quen thuộc của Framer thay vì buộc designer phải học một workflow hoàn toàn mới.

What I Learned

Dự án này dạy tôi rằng build feature dễ hơn rất nhiều so với thiết kế control.

Phần khó nhất không phải render được một scene 3D.

Phần khó nhất là biến những khái niệm kỹ thuật thành những control mà designer có thể hiểu ngay khi nhìn thấy.

Một runtime tốt không phải là runtime expose nhiều tính năng nhất.

Mà là runtime expose đúng những tính năng cần thiết.

Dự án cũng củng cố một bài học tôi gặp đi gặp lại trong design system, developer tools và creative software:

Người dùng không học API.

Người dùng học mental model.

Càng bám sát mental model sẵn có của người dùng, sản phẩm càng dễ tiếp cận và dễ sử dụng.

Với Framer x ThreeJS Runtime, thành công lớn nhất không phải là render được 3D trong Framer.

Mà là biến một workflow vốn dành cho engineer thành một workflow mà designer có thể sử dụng hằng ngày.

Likes

0 views

Comment

Create a free website with Framer, the website builder loved by startups, designers and agencies.