한국 미학

달항아리 물레

물레 위 흙이 끌어올려져 달항아리가 되고, 유백색 유약이 위에서부터 번져 내린다.

달항아리 물레 실행 화면
새 탭에서 보기

실제 코드로 재생되는 미리보기입니다

프롬프트 설정

Claude 가 읽는 제작 지시문입니다. 직접 읽지 않아도 됩니다.

물레 위에서 백자 달항아리가 빚어지는 세로 영상을 HTML 파일 하나로 만들어 줘. 미리보기에서 바로 재생되게. 길게 설명할 테니 숫자는 그대로 지켜 줘.

핵심 아이디어: 어두운 작업실, 물레 위에 막 빚은 젖은 흙 항아리가 돈다. 첫 1초 안에 젖빛 유약이 아가리에서 흘러내리기 시작하고, 눈물 줄기를 앞세워 굽까지 번져 내려간다. 덮인 자리에는 창문 빛이 휘어 비치며 광이 차오른다. 항아리는 천천히 돌고, 유약 얼룩과 기운 어깨가 함께 돈다. 그다음 흙덩이로 주저앉고, 카메라가 다가간 채로 다시 빚어진다. 흙덩이가 끌어올려지고(흙 벽을 타고 올라가는 고리 모양 불룩함이 손의 힘을 대신 보여 준다), 넓은 아래 사발로 벌어지고, 그 위로 윗사발이 자라 입을 오므리면 처음 화면으로 돌아온다. 위아래 두 사발을 이어 붙여 만드는 실제 기법처럼 허리에 아주 옅은 이음 자국이 남고, 한쪽 어깨가 살짝 처졌다.
3D 라이브러리 없이 만든다. 항아리는 높이별 반지름 r(y) 로 정해지는 회전체이고, 이것을 픽셀마다 직접 셰이딩한다. 돌고 있다는 단서는 몸 위의 각도에 붙은 무늬(흙의 가로 결, 유약 얼룩, 철분 반점)다. 무늬는 앞면 가운데에서 빠르게 지나가고 양옆 가장자리로 갈수록 눌려 느려진다.

[바꿀 곳]
- 색: 작업실 어둠 #100E0C · 벽에 고인 빛 #342D26 · 젖은 백자토 #A2988B · 유약(따뜻한 쪽) #EAE6DA · 유약(푸른 쪽) #D6DCD8 · 가장 밝은 빛 #FFFDF7 · 물레판 #4A4037 · 물레 옆면 #2A221B · 철분 반점 #6E5E4C
- 길이: 18초 (끝나면 처음으로 이어서 반복)
- 시작 시각: 시간표 9.3초 (유약이 흐르기 0.3초 전)
- 화면비: 9:16 (캔버스 1080×1920)
- 비대칭 세기: 1.0 (0 이면 완벽한 회전체)
- 화면 글자: 없음

[크기] — W = 화면 폭 1080, H = 화면 높이 1920. 아래 길이는 모두 배율 Z = 1 일 때의 「세계 길이」다.
- 시점: 위에서 10° 내려다본다. 수평 원은 모두 세로 반지름이 가로의 sin10° = 0.1736배인 타원으로 보인다. 이 값을 sE 라 한다.
- 물레판: 위면 타원 가로 반지름 0.40W(432px), 세로 반지름 0.40W×sE(75px), 옆면 두께 0.022H. 위면 중심 = 굽 바닥 자리.
- 완성 항아리: 높이 Hj = 0.55H(1056px). 최대 반지름 Rm = 0.45W(486px), 최대 지름 0.90W. 높이 ÷ 최대 지름 = 1.086(실제 달항아리는 1.03~1.09 사이다). 굽 반지름 0.37Rm(180px), 아가리 반지름 0.505Rm(245px).
- 흙덩이: 높이 0.15H, 바닥 반지름 0.27W. 끌어올린 원통: 높이 0.40H, 반지름 0.190W(바닥) → 0.176W(입술). 아래 사발: 높이 Hj/2 = 0.275H, 입 반지름 Rm.
- 카메라 배율 Z(t) 와 굽 바닥 화면 높이 Yb(t): 세계 좌표 (X, y)(X = 축에서 가로, y = 굽 바닥에서 위로)는 화면 (0.5W + Z·X, Yb − Z·y) 에 놓인다. 반지름·높이·물레판·그림자·흙물 고리·입술 두께 전부에 Z 가 곱해진다. 시간표(이징은 easeInOutSine):
  · 0~1.6초 Z 1.75 · Yb 0.74H — 흙덩이 꼭대기 0.477H, 폭 0.945W. 물레판 양끝은 화면 밖으로 잘린다.
  · 1.6~4.2초 Z 1.75 → 1.35, Yb 0.74H — 4.2초 원통 화면 높이 0.54H(꼭대기 0.20H).
  · 4.2~4.4초 그대로. 4.4~6.4초 Z 1.35 → 1.0, Yb 0.74H → 0.82H — 6.4초 아래 사발 폭 0.90W.
  · 6.4~16.0초 Z 1.0 · Yb 0.82H. 완성 항아리는 굽 0.82H, 아가리 0.27H 이고 화면 높이의 55%, 폭의 90% 를 차지한다.
  · 16.0~18.0초 주저앉음 진행률 mT(아래 장면 시간표)를 따라 Z 1.0 → 1.75, Yb 0.82H → 0.74H. 18초 = 0초로 닫힌다.
  · 검산: 어느 시각에도 몸의 화면 반폭은 0.493W 를 넘지 않는다(16.8초가 최대). 꼭대기는 0.20H 보다 아래다.

[윤곽 — 높이별 반지름]
y = 굽 바닥에서 위로 잰 세계 높이(px), h = 지금 높이, v = y / h (0~1).
- 완성 항아리 rJar(v), 높이 Hj:
  · 굽 v < 0.03: r = 0.37Rm
  · 아래 사발 0.03 ≤ v ≤ 0.5: r = Rm·(1 − |(v − 0.5)/0.520|^1.9)^(1/1.9) (v = 0.03 에서 0.40Rm, 0.10 에서 0.61Rm, 0.25 에서 0.86Rm — 아래로 갈수록 좁아진다)
  · 윗사발 0.5 < v ≤ 0.955: r = Rm·(1 − |(v − 0.5)/0.4823|^2.6)^(1/2.6) (v = 0.955 에서 0.47Rm. 지수 2.6 이 어깨를 넉넉하게 해 위가 조금 무거운 달 모양이 된다)
  · 목과 입술 0.955 < v ≤ 1: r = 0.47Rm + 0.035Rm·((v − 0.955)/0.045)² (짧게 서서 살짝 벌어진다)
- 흙덩이 r0(v) = 0.27W·(1 − v^2.5)^0.6, 높이 0.15H. 꼭대기는 닫혀 있다(r = 0).
- 원통 r1(v) = W·(0.190 − 0.022v) + 0.008W·smoothstep(0.93, 1, v), 높이 0.40H.
- 아래 사발 r2(v) = rJar(0.5v), 높이 Hj/2. 완성 항아리의 아래 절반과 정확히 같은 모양이다.
- 기울기 k = dr/dy 는 행마다 r(y+1) 과 r(y−1) 의 중앙차분으로 구한다(고리 불룩함까지 포함, 아래 비대칭은 넣지 않는다).
- 비대칭 — 모두 비대칭 세기를 곱한다. wU(y) = smoothstep(0.44Hj, 0.56Hj, y).
  · 반지름 배수 A(y, φ) = 1 + aL·cos(φ − 0.3) + cA·(0.0125·cos(φ − 0.6) + 0.006·wU·cos(φ − 3.0) + 0.008·cos(2(φ − 0.9))). aL = 흙덩이의 쏠림(중심 잡기 전), 0.0125 = 몸 전체가 한쪽으로 살짝 부름, 0.006 = 윗사발이 다른 방향으로 어긋나 붙음, 0.008·cos 2φ = 위에서 보면 아주 살짝 달걀꼴인 단면(돌 때 윤곽 폭이 한 바퀴에 두 번 숨 쉰다). cA = 비대칭이 생긴 정도(장면 시간표에서 정한다).
  · 어깨 처짐: δ(y, φ) = cA·0.012Hj·wU·(1 − smoothstep(0.92Hj, 0.955Hj, y))·cos(φ − 2.2)(±13px). 가마에서 윗사발이 한쪽으로 살짝 주저앉은 자국이다. 윤곽 끝 반지름에만 반영한다: 그 끝에서는 r(y) 대신 r(y − δ) 를 쓴다(법선 기울기 k 에는 넣지 않는다). 아가리 가까이에서 0 으로 줄어 입술은 수평으로 남는다.
  · 검산: 최대 지름 줄의 좌우 반지름 차는 최대 2.1%(cos 2φ 항은 좌우가 같아 차이를 만들지 않는다). 어깨(반지름 0.75Rm 인 높이)의 좌우 높이 차는 최대 29px 라서, 멈춘 화면에서도 한쪽 어깨가 낮아 보인다.
- 허리 이음 자국: 이음 높이 yS(φ) = 0.5Hj + 0.006Hj·sin(φ − 1.1) + δ(0.5Hj, φ)/2(돌 때마다 오르내리고 처진 쪽으로 기운다). d = (yW − yS)/(0.004Hj) 일 때 바탕색에 1 − J·(0.09·e^(−(d+0.6)²) − 0.03·e^(−(d−1.2)²)) 를 곱한다. 바로 아래는 9% 어둡고, 그 위로 3% 밝은 턱이 진다. J 는 이음 세기.

[그리기 — 회전체를 픽셀마다 셰이딩]
- 몸통은 화면 밖 버퍼 캔버스에 ImageData 로 직접 칠한다. 버퍼 해상도 = 기준 캔버스 × S(CONFIG.shadeScale, 기본 0.5). 버퍼는 배율 Z 가 이미 곱해진 화면 좌표를 그대로 칠한다(작게 칠해 늘리지 않는다 — 흐려진다). 매 프레임 몸을 감싸는 화면 상자만 새로 칠해 putImageData 한 뒤, 본 캔버스에 imageSmoothingQuality 'high' 로 1/S 배 늘려 그린다. 상자 안 몸통 밖 픽셀은 알파 0 이다.
- 버퍼 행마다 한 번: 화면 높이 Y 에서 y = (Yb − Y)/Z, v, r(y), k, hTex, 그리고 오른쪽 끝 반지름 rR = r(y − δR)·A(y, π/2 − ψ), 왼쪽 끝 반지름 rL = r(y − δL)·A(y, −π/2 − ψ). δR·δL 은 그 끝 각도의 어깨 처짐, ψ 는 회전각이다.
- 픽셀마다(X = (화면 x − 0.5W)/Z, −rL−1 ≤ X ≤ rR+1):
  1) s = X / (X ≥ 0 ? rR : rL), −1~1 로 자른다. c = √(1 − s²). θ = asin(s)(2048칸 표로 찾는다). 몸 위의 각도 φ = θ − ψ.
  2) 세계 높이 yW = y + r·c·sE. 무늬·이음 자국·유약 경계는 전부 yW 로 정한다. 그래서 앞면 가운데가 처지는 타원 호로 휘어 보이고, 입체가 읽힌다. 윤곽과 빛은 y 로 정한다.
  3) 가장자리 덮임 = clamp((끝 반지름 − |X|)·Z·S / √(1 + k²) + 0.5, 0, 1) 을 알파로 쓴다. k 는 그 행의 기울기다. 가로 거리만 쓰면 어깨에서 목으로 꺾이는 거의 수평인 윤곽에서 덮임이 한 픽셀 안에 0→1 로 뛰어 버퍼 한 행 높이의 계단이 진다. 윤곽에 수직인 거리로 나눠야 어느 기울기에서도 계단지지 않는다.
  4) 법선 n = (s + 물결, −k + 결 + 턱, c) 을 정규화한다(x 오른쪽, y 위, z 보는 사람 쪽). 물결·결·턱은 아래에 있다.
- 굽 바닥: −r(0)·sE ≤ y < 0 인 행도 칠한다. (X/r(0))² + (y/(r(0)·sE))² ≤ 1 인 픽셀만 y = 0 의 행 값으로 칠해, 바닥이 아래로 볼록한 타원 호가 되게 한다(곧은 가로선으로 잘리면 안 된다).
- 아가리(꼭대기 반지름 rT = r(1) 의 화면 길이 Z·rT 가 2px 보다 클 때, 몸통 다음에 본 캔버스에 그린다): 중심 (0.5W, Yb − Z·h) 에 세로 반지름 Z·rT·sE 인 타원을 입술색으로 채운다. 가로 반지름은 오른쪽 절반 Z·rR(h), 왼쪽 절반 Z·rL(h) 로 따로 둔다(몸통 맨 윗행의 끝 반지름과 같은 값 — 비대칭 A 가 들어 있다). 경로는 ellipse(…, Z·rR, …, −π/2, π/2) 다음 ellipse(…, Z·rL, …, π/2, 3π/2) 로 이어 그린다. 대칭 타원이면 돌 때 몸 윤곽이 입술 끝보다 4px 까지 삐져나와 턱이 보인다. 입술색은 그때의 바탕색 × 0.95(왼쪽)에서 × 0.45(오른쪽)로 가는 가로 그라디언트다. 그 안에 좌우 가로 반지름에서 각각 입술 두께(min(0.014W, 0.45rT))를 뺀 같은 꼴의 타원을 속색으로 채운다. 속색은 중심을 (타원 중심 x + 0.35rT, 타원 중심 − 0.5rT·sE) 에 둔 반지름 rT 의 방사 그라디언트다. 흙일 때는 바탕색 × 0.34 → × 0.07, 유약일 때는 × 0.62 → × 0.20 으로 가고, 아가리가 유약색으로 바뀌는 것과 같은 진행률로 섞는다. 유약을 입힌 안벽은 뒤쪽이 왼쪽 빛을 받아 젖빛이고, 구멍이나 쇠그릇 안쪽처럼 어둡지 않다.
- 물레판(몸통보다 먼저): 옆면 띠를 그리고 위면 타원을 채운다. 위면 위에 흙물 고리 6개를 그린다. 세계 반지름 0.25·0.285·0.315·0.345·0.37·0.39 W 의 타원 선(2px, #5A5046 50%)이고, 고리마다 젖은 호 하나(길이 60~110°, 3px, #9A8F80 22%)가 각도 a0 − ψ 에 붙어 몸통과 함께 돈다(a0·길이는 고리마다 시드 난수. 타원 매개각 a 에서 a = π/2 가 앞쪽이고, a 가 줄면 앞쪽 점이 오른쪽으로 간다). 굽 둘레에 접지 그림자를 깐다. 가로 1.3·r(0), 세로 그 × sE 타원이고, 가운데 검정 55% 에서 가장자리 0% 로 간다.
- 배경은 시작할 때 화면 밖 캔버스에 한 번만 그린다: #100E0C 위에 중심 (0.62W, 0.17H), 반지름 0.75W 방사 그라디언트(#342D26 → 0.45 지점 #211D19 → #100E0C), 시드 난수 명도 그레인 ±2%(띠 무늬 방지), 네 모서리 10% 어둡게. 빛이 항아리 위 빈 벽에 고여 위쪽을 채운다.

[재질과 빛]
- 빛: 키 빛 L = 정규화(−0.55, 0.70, 0.45) = (−0.551, 0.702, 0.451)(왼쪽 위 앞, 색 #FFF6EA), 채움 빛 F = 정규화(0.85, −0.05, 0.50)(오른쪽, 차가운 #9FB2C4), 시선 V = (0, 0, 1), Hv = 정규화(L + V). G = 유약 양(0~1, 장면 시간표), g = 유약 광이 오른 정도(0~1).
- 픽셀 색 = 바탕색 × (Am + Km·d·키색 + 0.30·f·채움색) × 접지어둠 + 광택 × #FFFDF7 + 테두리빛 × #C9B79C, 그다음 부드러운 누름.
  · 주변광 Am 과 키 세기 Km 은 G 로 섞는다: 흙 Am 0.12·Km 0.80 → 유약 Am 0.30·Km 0.66.
  · d = clamp((n·L + w)/(1 + w), 0, 1), 감싸는 빛 w = 흙 0.25 → 유약 0.70(G 로 섞음). 백자 유약은 빛이 속으로 스며 그늘 쪽도 젖빛으로 밝다.
  · f = clamp(n·F, 0, 1). 접지어둠 = 1 − 0.35·smoothstep(0.12Hj, 0, y).
  · 테두리빛 = 0.20·(1 − n_z)³·clamp(n_x + 0.2, 0, 1). 오른쪽 어두운 윤곽이 배경에서 떨어져 보인다.
  · 광택 = (1 − G)·0.20·(n·Hv)^28 + G·g·(0.17·창문 + 0.07·(n·Hv)^10). ^28 항은 (n·Hv) < 0.6, ^10 항은 < 0.3 이면 0 으로 둔다(버리는 값이 10⁻⁵ 미만이다). 젖은 흙은 넓고 흐린 윤기다.
  · 창문(유약 광 — 점이 아니라 창문 반사): 반사 벡터 Rx = 2·n_z·n_x, Ry = 2·n_z·n_y. q = (((Rx + 0.551)/0.12)⁴ + ((Ry − 0.702)/0.22)⁴)^(1/4), 창문 = smoothstep(1.0, 0.40, q)(q 가 0.40 이하면 1). 키 빛 방향에 걸린 세로로 긴 둥근 사각형이 몸의 곡면을 따라 휘고, 물레 자국과 유약 물결을 따라 가장자리가 일렁인다. 가장자리가 넓게 번지고 세기가 0.17 인 것은 달항아리 유약이 반무광에 가깝기 때문이다 — 또렷하고 밝은 창문은 광택 도자기 쪽으로 기운다.
  · 부드러운 누름(채널마다, m = #FFFDF7 의 그 채널 값 /255): x ≤ 0.86m 이면 그대로, 넘으면 0.86m + 0.14m·(1 − e^(−(x − 0.86m)/(0.14m))). 그래서 어떤 픽셀도 #FFFDF7 을 넘지 않는다. 0~1 로 잘라서 #FFFFFF 를 만들지 않는다.
- 결 텍스처(시작할 때 한 번, 시드 고정): 1024칸(φ, 0~2π 한 바퀴) × 512칸(u, 0~2.2). 읽을 때는 φ 방향으로 이웃 두 칸을 선형 보간한다. 칸 넷을 둔다.
  · 흙 결: 가로로 긴 결 700개. 중심 (φc, uc) 무작위, 길이 0.06~0.20 rad, 높이 u 로 0.003~0.008, 세기 −0.14~+0.10, 모양 exp(−(Δφ/(길이/2))² − (Δu/높이)²). Δφ 는 한 바퀴를 감아 잰다. 각 결은 자기 상자 범위만 칠한다. 그 밑에 128×64 격자 값 노이즈를 쌍선형으로 보간한 ±0.03 층을 더한다.
  · 유약 얼룩: ① 한 바퀴 매듭 7개 × 높이 매듭 6개 주기 값 노이즈(smoothstep 보간), ±0.045. ② 큰 얼룩 5개: 중심 φ 무작위·u 0.3~1.7, φ 반폭 0.18~0.48 rad·u 반폭 0.08~0.26, 모양 exp(−(Δφ/반폭)² − (Δu/반폭)²). 얼룩값에서 0.07·모양을 빼고, 따뜻함 칸에 0.10·모양을 더한다. 오래 쓴 달항아리의 스민 얼룩과 유약 두께 차이가 몸과 함께 돌아, 머물 때도 도는 것이 보인다.
  · 철분 반점 30개: 21개는 흩어 두고, 9개는 2~3개씩 무리 3개로 모은다(무리 안 간격 ±0.03). u 0.3~1.8, 반지름 1.5~7px(φ 로는 반지름/Rm, u 로는 반지름/(Hj/2)), 가운데 1 에서 가장자리 0 인 원반. 반지름은 φ·u 각 방향으로 텍스처 칸 0.7개보다 작게 두지 않는다(칸 사이에 빠져 사라지거나 돌 때 깜빡인다).
  · 텍스처 좌표 u = yW / hTex. hTex = h(0~6.6초, 흙이 늘어나며 결도 같이 늘어난다), Hj/2(6.6~16초, 윗사발이 자라도 아래 결이 미끄러지지 않는다. 아가리 앞쪽에서 u 는 2.07 까지 간다), h·(0.5 + 0.5·mT)(16~18초, 18초에 다시 h 가 되어 처음과 이어진다).
  · 결의 φ 길이 최소 0.06 rad 는 빚는 속도에서 한 프레임에 도는 0.050 rad 보다 길다. 그래서 결이 깜빡이지 않고 흐른다.
- 물레 자국(손가락 고리): 법선 y 에 gR·cos(2π·yW/λ + 1.8·nL(yW/(0.09H)) + 1.2·nP(φ/2π, 16)) 를 더한다. λ = 0.012H(23px), gR = 흙 0.055 → 유약 0.012(G 로 섞음). nL 은 주기 없는 1차원 값 노이즈, nP(x, K) 는 한 바퀴에 매듭 K개인 주기 값 노이즈다(매듭 값 −1~1 시드 고정, smoothstep 보간).
- 유약 물결: 법선 x 에 0.08·G·nP(φ/2π, 5)·cos(2π·2·yW/h) 를 더한다. 창문 반사가 돌 때마다 일렁인다.
- 바탕색:
  · 흙 = #A2988B × (1 + 결값)
  · 유약 = mix(#EAE6DA, #D6DCD8, qB) × (0.92 + 0.08g) × (1 + 0.15·결값) × (1 + 얼룩값), 그다음 #C9B79C 쪽으로 따뜻함만큼, #6E5E4C 쪽으로 0.6 × 반점값만큼 섞는다. 푸른 정도 qB = clamp(0.35 + 0.45·smoothstep(0.55, 0, yW/h) + 0.25·e^(−((yW − yS)/(0.02Hj))²), 0, 1). 유약이 고이는 아랫배와 이음 둘레가 조금 더 푸르다.
  · 둘 사이는 G 로 섞는다.

[회전]
- 회전각 ψ(라디안) = 2π × (시간표 0초부터 그때까지 돈 바퀴 수)이고, 시간의 닫힌 식으로 구한다. 기본 속도: 빚을 때 0.5바퀴/초, 머물 때 0.1바퀴/초. 바뀌는 구간은 사인 램프 ω = a + (b − a)·(1 − cos πs)/2 이고, 그 적분은 D·(a·s + (b − a)·(s/2 − sin(πs)/(2π))) 이다(D = 구간 길이, s = 진행률).
- 속도표: 0~8.8초 0.5 · 8.8~10.0초 0.5→0.1 · 10.0~16.0초 0.1 · 16.0~16.6초 0.1→0.5 · 16.6~18초 0.5. 이 표를 적분하면 6.24바퀴다. 모든 속도에 6/6.24 = 0.9615 를 곱해 18초에 정확히 6바퀴가 되게 한다(실제 속도 0.481·0.096바퀴/초). 그래서 반복 이음매에서 무늬가 튀지 않는다.
- 앞면의 무늬는 왼쪽에서 오른쪽으로 흐른다(θ = φ + ψ). 물레판 젖은 호도 같은 방향으로 같은 ψ 로 돈다.

[장면] (시각은 시간표 기준. 작품은 9.3초에서 시작한다. ease = easeInOutSine 이 기본이고, 모든 이징은 입력을 0~1 로 자른 뒤 쓴다)
0.0~1.6초 중심 잡기. 흙덩이(r0)가 돈다. 쏠림 aL 이 0.04 → 0 으로 줄어든다(easeOutCubic). 돌 때마다 좌우로 8% 일렁이던 덩어리가 똑바로 선다. 카메라는 가까이(Z 1.75) 있어 흙덩이가 화면 폭을 채운다.
1.6~4.2초 끌어올리기 두 번. s1 = (t − 1.6)/1.3, s2 = (t − 2.9)/1.3. 모양 = r0 와 r1 을 m = 0.5·ease(s1) + 0.5·ease(s2) 로 섞고(같은 v 끼리), 높이도 0.15H → 0.40H 로 같은 m 을 따른다. 한 번 당길 때마다 키가 한 칸씩 자란다. s1·s2 가 각각 0~1 인 동안 고리 불룩함 r += 0.010W·sin(πs)·exp(−((y − vP·h)/(0.035H))²) 를 더한다. vP = 0.05 + 0.93·ease(s) 라서 불룩함이 굽에서 입술까지 올라간다(최대 11px 부풀고, 폭 67px). 꼭대기가 열리며 아가리 타원이 0 에서 자란다.
4.2~4.4초 멈춤(원통).
4.4~6.4초 벌리기. r1 → r2, 높이 0.40H → 0.275H, ease. 같은 고리 불룩함이 한 번 더 아래에서 위로 지나간다. 원통이 넓은 아래 사발로 열리고 카메라가 물러난다.
6.4~6.6초 멈춤(아래 사발).
6.6~8.8초 윗사발 올리기. c = easeInOutCubic((t − 6.6)/2.2), 높이 h = Hj/2 + c·Hj/2. 반지름은 r(y) = rJar(y/Hj) 로, 테두리가 완성 윤곽을 따라 기어올라 안으로 오므라든다. 아래 사발 부분은 움직이지 않는다. cA = c 로 비대칭과 어깨 처짐이 생긴다. 이음 세기 J 는 6.6초에 1.0 으로 나타나 7.4~8.8초 동안 0.4 로 다듬어진다(ease).
8.8~10.0초 완성, 물레가 느려진다(속도표). ← 작품 0초 = 9.3초. 첫 화면은 폭 0.90W 의 젖은 흙 항아리다.
9.6~12.0초 ★유약(시그니처, 작품 0.3~2.7초). 유약 앞선 vF = 1.10 − 1.14·ease((t − 9.6)/2.4) 가 아가리에서 굽까지 내려온다(10.4초에 어깨 0.81, 10.8초에 허리 0.53).
  · 눈물 줄기 14개가 앞선보다 먼저 내려간다. 줄기 k 는 각도 φk·반폭 wk 0.02~0.04 rad·길이 Lk 0.02~0.06(높이 비율, 21~63px)이 시드 난수다. 실제 앞선 vF′ = vF − ease((t − 9.6)/0.6)·Σ Lk·√max(0, 1 − ((φ − φk)/wk)²)(Δφ 는 한 바퀴를 감아 잰다). 끝이 둥근 혀 모양이고, 몸과 함께 돈다. 9.6초에 길이 0 에서 자라 시작이 끊기지 않는다.
  · 유약 양 G = smoothstep(−0.015, 0.015, e) × smoothstep(0.03, 0.042, y/Hj), e = yW/h − vF′ + 0.018·nP(φ/2π, 9). 경계는 각도마다 들쭉날쭉하다. 굽(v < 0.03)에는 유약이 앉지 않는다 — 백자는 굽 바닥의 유약을 닦아 내고 굽기 때문에 완성된 항아리도 굽은 흙빛 띠로 남는다.
  · 앞선 턱: 0 ≤ e ≤ 0.02 인 띠(12.4초까지)에서 바탕색을 4% 밝게 하고 법선 y 에 +0.15 를 더한다. 두툼하게 고인 유약 턱이 빛을 받아, 색칠 진행 막대가 아니라 흘러내리는 액체로 읽힌다.
  · 9.6초 전에는 G = 0 이다(아래 사발 시기엔 입이 넓어 앞쪽 테두리의 yW/h 가 1.16 까지 올라가 식만으로는 유약이 샌다). 시작값 1.10 은 완성 항아리 아가리 앞쪽 yW/h 1.04 보다 커서 9.6초에 G 가 0 에서 끊김 없이 시작된다.
  · 광 g = max(clamp((yW/h − vF)/0.25, 0, 1), ease((t − 11.6)/0.8)). 갓 덮인 자리는 무광으로 시작해 앞선이 지나간 뒤 창문 반사가 차오르고, 12.4초에는 전부 광이 난다. 아가리 입술과 속은 vF 가 1.02 → 0.98 로 지나는 동안 흙색에서 유약색(#EAE6DA)으로 바뀐다.
12.0~16.0초 머묾. 0.096바퀴/초로 천천히 돈다. 유약 얼룩과 철분 반점 무리가 앞면을 가로지르고, 창문 반사가 물결을 타고 일렁이며, 처진 어깨와 기운 이음 줄이 돌아 나온다.
16.0~18.0초 주저앉음. mT = ease((t − 16)/1.65). 높이별 진행률 m(v) = max(ease((t − 16.0 − 0.35·(1 − v))/1.65), mT) 로 rJar → r0 로 섞는다. 위쪽(v = 1)이 먼저 무너진다. max 로 굽 쪽이 높이보다 늦지 않게 해 밑동이 잘록한 버섯 모양을 막는다. 이 구간에서는 rJar 의 굽 띠(v < 0.03, 반지름 상수 0.37Rm)를 그 자리의 아래 사발 식 값(같은 식을 v < 0.03 까지 늘인 것, v = 0 에서 0.25Rm)으로 mT 만큼 섞는다. 상수 반지름 띠가 넓어지는 흙덩이 밑에 세로 벽 받침과 가로 주름으로 남지 않고, 반지름이 굽에서 위로 끊김 없이 늘어난다(16.3~17.4초 검산: 굽 쪽 v < 0.08 에서 위로 갈수록 반지름이 줄어드는 곳 0). 높이는 Hj → 0.15H 를 mT 로 따르고, 아가리는 오므라들어 닫히며, 카메라가 다시 다가간다. 흙 앞선 vC = −0.04 + 1.16·ease(t − 16.0) 이 16~17초에 아래에서 위로 올라가 유약을 다시 젖은 흙으로 덮는다(G 에 smoothstep(−0.015, 0.015, yW/h − vC) 를 곱한다. 끝값 1.12 는 아가리 앞쪽까지 남김없이 덮는다). 아가리 입술과 속은 vC 가 0.98 → 1.02 를 지날 때 흙색으로 돌아간다. 이음 세기 J 0.4 → 0(16~17초), cA = 1 − ease((t − 16)/2), 쏠림 aL 은 0 → 0.04(ease, 2초).
18.0초 = 0.0초(흙덩이, 쏠림 0.04, 유약 0, 회전 6바퀴째, Z 1.75). 시간표는 끊김 없이 돌고, 작품의 18초 = 작품의 0초(시간표 9.3초)다.

[구현]
- HTML 파일 하나로 만든다. 외부 파일·글꼴·라이브러리·네트워크 요청을 쓰지 않는다(미리보기에서 막히거나 느려진다).
- 첫 <script> 맨 앞에 CONFIG 객체를 두고 [바꿀 곳]의 값과 이 글에 나온 숫자(시간표·크기·색·세기)를 이름 붙여 모은다. 나중에 숫자만 바꿔 다듬을 수 있게.
- 그림은 시간 t(초)만으로 계산하는 함수 render(t) 로 그린다. requestAnimationFrame 의 타임스탬프나 performance.now() 로 t 를 구한다. setTimeout·setInterval·CSS 애니메이션·transition 으로 움직이지 않는다(프레임마다 속도가 달라지고, 다시 재생할 때 어긋난다). 시뮬레이션처럼 상태가 쌓이는 작품은 고정 시간 간격으로 상태를 진행하되 그 진행도 타임스탬프로만 정한다.
- 난수는 시드 고정 난수(mulberry32 등)만 쓴다. Math.random 은 쓰지 않는다(매번 다른 화면이 나온다).
- 캔버스 내부 해상도는 화면비에 맞춘 기준 크기로 고정하고, 창 크기에 맞춰 화면비를 지키며 가운데에 꽉 차게 보이게 한다(남는 곳은 배경색). 스크롤이 생기지 않게 한다. devicePixelRatio 는 그리는 선명도에만 반영한다.
- 글자는 시스템 글꼴만 쓴다: 'Pretendard', 'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans KR', sans-serif. 붓글씨·손글씨 느낌은 글꼴이 아니라 획을 그려서 낸다.
- 길이가 정해진 작품은 끝나면 처음과 같은 화면으로 돌아가 이음매 없이 반복한다.
- 모든 함수·상수·셰이더 문자열을 먼저 정의하고, 시작(초기화와 첫 requestAnimationFrame)은 스크립트 맨 끝에서 한 번만 호출한다. 정의되기 전에 쓰면 첫 화면에서 멈춘다.

이 작품에만 해당하는 구현:
- 시작 시각: 작품의 0초는 시간표의 9.3초다. render(t) 는 맨 앞에서 t = (t + CONFIG.startAt) mod 18 로 바꿔 쓴다(startAt = 9.3). 회전각·유약·모양·배율이 모두 이 t 로 계산된다. 그래서 첫 화면은 완성된 젖은 흙 항아리이고, 0.3초 뒤 유약이 흐르기 시작해 첫 1초 끝에 앞선이 어깨(0.81)에 닿는다. 녹화도 이 0초부터 시작한다.
- 기준 크기 1080×1920. 상태가 쌓이지 않는다. 모양·회전각·유약·배율은 전부 t 만의 순수 함수다.
- 시작할 때 한 번만 만든다: 배경 캔버스, 결 텍스처 네 칸(Float32Array 1024×512 — 흙 결·얼룩값·따뜻함·반점), asin 표, 노이즈 매듭, 눈물 줄기, 흙물 호. 배경과 텍스처를 매 프레임 다시 만들지 않는다(몸통 셰이딩이 프레임 예산의 대부분을 쓴다).
- 몸통 셰이딩은 ImageData 의 Uint8ClampedArray 에 직접 쓴다. 픽셀 안에서 객체를 만들지 않고, Math.pow 는 [재질과 빛] 의 문턱을 넘을 때만 부른다.
- 해상도 단계: render(t) 앞뒤를 performance.now() 로 재어 그리는 데 걸린 시간의 2초 평균을 낸다(requestAnimationFrame 간격으로 재지 않는다 — 30Hz 화면이나 절전 모드에서 괜히 흐려진다). 평균이 14ms 를 넘으면 shadeScale 을 0.5 → 0.42 → 0.35 순서로 한 단계씩 낮추고(2초마다 한 번까지), 6ms 아래가 4초 이어지면 한 단계 올린다. 녹화 중에는 단계를 바꾸지 않는다.
- 합격 기준 자체 대조: 시작할 때 화면 밖 1080×1920 캔버스에 render 를 시간표 14.0초와 14.5초로 그려 아래를 콘솔 표(console.table)로 낸다. 기준을 벗어난 줄은 console.warn 으로 한 번 더 알린다. 명도 = (0.2126R + 0.7152G + 0.0722B)/255, 9×9 평균.
  · 14.0초 몸 가운데 (0.5W, 0.82H − 0.5Hj) 0.72~0.80 · 왼쪽 위 (0.5W − 0.5Rm, 0.82H − 0.72Hj) 0.78~0.86 · 오른쪽 아래 그늘 (0.5W + 0.6Rm, 0.82H − 0.25Hj) 0.50 이상
  · 14.0초 화면에서 #FFFDF7 을 한 채널이라도 넘는 픽셀 0개
  · 몸통 상자 안 명도 62/255 초과 픽셀에서 14.0초와 14.5초의 명도 차 평균 ≥ 1.4/255, 4단계 넘게 바뀐 픽셀 ≥ 5%(머물 때도 도는 것이 보이는지)
  · 최대 지름 줄 좌우 반지름 차(%, 기준 2.1 이하) · 첫 프레임들의 셰이딩 ms · 지금 shadeScale
- CONFIG 에는 [크기]·[윤곽]의 비율과 배율 시간표, 빛 벡터와 계수(흙·유약 Am·Km·w, 창문 0.17·0.12·0.22·0.40), 속도표, [장면]의 모든 시각, 비대칭 계수(aL 0.04 · 0.0125 · 0.006 · 0.008 · 어깨 0.012Hj), 이음 자국 계수, 텍스처·얼룩·반점·눈물 줄기의 개수와 범위, 합격 기준을 이름 붙여 넣는다.

[하지 말 것]
- 3D 라이브러리·WebGL 을 쓰거나, 회전각을 프레임마다 더해 쌓지 않는다 — 외부 의존은 미리보기에서 막힐 수 있고, 회전체는 2D 픽셀 셰이딩으로 충분하다. 쌓은 회전각은 프레임 간격이 흔들리면 어긋나 18초 6바퀴 이음매가 튄다.
- 가로 띠마다 좌→우 선형 그라디언트 하나로 칠하지 않는다 — 각도를 따라 흐르는 무늬가 없어서 돌고 있다는 게 보이지 않고, 띠 경계가 계단처럼 남는다.
- 무늬를 화면 x 좌표에 붙여 옆으로 밀지 않는다 — 벽지가 미끄러지는 것처럼 납작해 보인다. 무늬는 몸 위의 각도 φ 에 붙어 있어야 가장자리에서 눌리고 가운데서 빨라져 둥근 몸이 읽힌다.
- 유약을 입힌 뒤 무늬를 다 지우지 않는다 — 매끈한 단색 몸은 돌아도 정지 화면이다. 얼룩·반점·창문 반사의 일렁임이 머무는 4초의 회전을 보여 준다.
- 유약 광을 작고 둥근 점 반사((n·Hv)^120 같은 높은 거듭제곱)로 만들거나 화면에 고정된 흰 타원으로 덧칠하지 않는다 — 흰 점이 켜지는 컴퓨터 그래픽 공·플라스틱의 문법이다. 실제 백자 사진의 광은 창문이 비친 넓고 부드러운 면 반사라서, 곡면을 따라 휘고 결을 따라 일렁인다.
- 빛을 더한 뒤 0~1 로 잘라 #FFFFFF 를 만들지 않는다 — 하얗게 탄 덩어리는 석고나 플라스틱처럼 보인다. 마지막에 부드러운 누름으로 #FFFDF7 아래에 둔다. 백자 유백색은 #D6DCD8~#EAE6DA 의 약간 푸르고 따뜻한 회백이다.
- 유약에 흙과 같은 주변광·대비를 쓰지 않는다 — 몸의 절반이 회색으로 가라앉아 회색 돌이나 콘크리트 공이 된다. 유약은 주변광 0.30·감싸는 빛 0.70 이다.
- 굽에 유약을 입히지 않는다 — 실제 백자는 굽 바닥을 닦아 내고 굽는다. 유약 입힌 굽은 푸른 플라스틱 받침처럼 보인다.
- 손·도구·도공을 그리지 않는다 — 2D 로 그린 손은 떠 보이고 시그니처인 윤곽 변화를 가린다. 손의 힘은 위로 지나가는 고리 불룩함이 맡는다.
- 모양이 바뀔 때 두 모양을 투명도로 겹쳐 넘기지 않는다 — 흙이 늘어나고 벌어지는 연속 변형이 아니라 장면 전환으로 읽힌다. 윤곽은 반지름 함수를 섞어서만 바꾼다.
- 완벽한 좌우 대칭으로 만들지 않는다 — 달항아리의 아름다움은 두 사발을 이은 손작업의 미세한 어긋남이다. 대칭이면 공장 화병이 된다.
- 최대 지름 줄의 좌우 차를 3% 넘게 키우거나 이음 자국을 홈처럼 깊게 파지 않는다 — 찌그러진 실패작이나 금 간 그릇으로 보인다. 「아주 살짝」이어야 가까이 볼수록 보인다.
- 흙을 붉은 갈색으로 칠하지 않는다 — 붉은 흙은 옹기나 토기가 된다. 백자토는 젖으면 회갈색 #A2988B 다.
- 별 모양 반짝임·렌즈 플레어·블룸·후광을 넣지 않는다 — 광고 템플릿처럼 보이고 유약의 깊이를 덮는다.
- 먼지·연기·빛 입자·물방울 튐을 넣지 않는다 — 화면에서 움직이는 것은 흙·유약·물레뿐이어야 고요한 작업실이 된다.
- 태극·단청 문양·한복·한글 글귀로 한국을 설명하지 않는다 — 이 작품은 재료(백자토·유백 유약)와 기법(두 사발 잇기·비대칭·굽 닦기)으로 말한다. 상징 장식은 상투가 된다.
- 바닥에 거울 반사를 넣지 않는다 — 물레판은 흙물에 젖은 나무라 비치지 않는다. 반사가 생기면 제품 광고 무대가 된다.
- 유약을 한꺼번에 페이드하거나 아래에서 위로 칠하지 않는다 — 유약은 아가리에서 굽으로 흘러내린다. 이 방향과 눈물 줄기·들쭉날쭉한 앞선이 시그니처다.
- 빚는 동안 카메라를 멀리 두지 않는다 — 흙덩이가 화면의 5% 로 남아 영상 앞부분이 빈 벽이 된다. 배율 시간표대로 다가가 화면 폭을 채운다.
- 셰이딩 버퍼를 배율 1 로 칠한 뒤 확대해 그리지 않는다 — 가까이 갈 때 흙 결과 윤곽이 뭉개진다. 화면 좌표에서 칠한다.

사용 방법

필요한 것: claude.ai 계정 — 무료 계정에서도 Claude Opus 5.5 를 고를 수 있습니다

  1. claude.ai 에서 새 대화를 엽니다.
  2. 모델 메뉴에서 Claude Opus 5.5 를 고르고, 같은 메뉴의 Effort(답변 깊이)를 High 로 둡니다.
  3. 복사한 프롬프트를 붙여 넣고 전송합니다. 결과로 나온 HTML 파일을 브라우저로 열면 재생됩니다.
권장 모델
Claude Opus 5.5 · Effort High
화면비
9:16 (세로)
재생 길이
18초
결과물
HTML 파일 하나 · 따로 설치할 것 없음
영상 파일
위 「MP4 저장 기능 포함」을 켜면 결과 화면에 녹화 단추가 생깁니다 1080 기준 · 12 Mbps · 브라우저에 따라 MP4 또는 WebM

추가 요청 예시

결과가 나온 뒤 같은 대화에서 이어서 요청하면 해당 부분만 수정됩니다.

  • 배경을 어두운 작업실 대신 따뜻한 한지색 #E9E1D0 으로 바꾸고, 유약은 그보다 조금 더 푸른 #DCE2DE 쪽으로 옮겨 항아리가 바탕에 묻히지 않게 해 줘.
  • 화면 위쪽 빈 자리(위에서 12% 높이)에 「백자 달항아리」 제목을 작고 가늘게 넣고, 유약이 다 덮이는 12초에 아래에서 0.6초 동안 떠오르게 해 줘.
  • 전체를 24초로 늘려 줘. 빚는 장면의 시각은 그대로 두고, 유약을 입힌 뒤 천천히 도는 장면만 4초에서 10초로 늘려서 반짝이는 빛이 더 오래 흐르게.

한국 미학

같은 카테고리의 다른 프롬프트

한국 미학 전체 보기

모든 모션 보기 블로그 글 목록 RSS 로 새 글 받기