From 8267905c0c7ca3407eb9a18d0f7b71ddaf445e73 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Thu, 20 Aug 2026 16:37:49 +0900 Subject: [PATCH] =?UTF-8?q?=ED=85=8C=EB=91=90=EB=A6=AC=20=EA=B4=91?= =?UTF-8?q?=EC=9D=84=20=ED=9A=8C=EC=A0=84=EC=8B=9C=ED=82=A4=EA=B3=A0=20thr?= =?UTF-8?q?ee.js=20=EB=AA=A8=EB=B0=94=EC=9D=BC=20=EB=8C=80=EC=9D=91?= =?UTF-8?q?=EC=9D=84=20=EA=B3=A0=EC=B9=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 회전 테두리 conic 의 각도를 @property 로 돌리면 매 프레임 배경을 다시 칠한다 — 컴포지터에서 못 돌고 메인 스레드가 페인트한다(하드 게이트 8). 정사각형 원뿔 레이어를 마스크 안에서 rotate 시켰다. transform 만 움직인다. aspect-ratio: 1 이라야 회전 중 밝기가 일정하고, width: 200% 라야 1178x52 헤더에서 모서리까지 닿는다. 주기 11초. three.js 모바일 세로 화면에서 게이트가 통째로 안 보이고 있었다. 수직 시야는 화면 비율과 무관하지만 수평 시야는 aspect 에 비례한다. 데스크톱(2.5:1)에서 정한 판 폭 15 가 세로 화면(0.45:1)의 수평 시야 2.5 에 비해 여섯 배라, 첫 판이 화면을 완전히 덮었다. fit() 에서 camera.aspect 를 갱신할 때 판의 scale.x 도 같이 잡는다. 저사양 판정도 고쳤다. hardwareConcurrency <= 4 만 보면 요즘 폰이 전부 고사양으로 잡힌다(8코어가 흔하다). innerWidth < 760 을 함께 본다. DPR 1.5 -> 1.25, 캔버스 불투명도 0.7 -> 0.45(세로는 화면 전체를 덮는다). 스킬 svg-filters.md 테두리 광 회전은 각도가 아니라 정사각형 레이어 rotate three.md 지오메트리를 화면 비율에 맞춰 다시 잡아라 저사양 판정에 화면 폭을 넣어라 --- apps/site/design.md | 22 +++++++++++ apps/site/src/components/Materials.astro | 1 + apps/site/src/components/Pipeline.astro | 4 ++ apps/site/src/layouts/Base.astro | 1 + apps/site/src/lib/gate-scene.ts | 25 ++++++++++-- apps/site/src/styles/base.css | 48 ++++++++++++++++++++++++ packages/skill/references/svg-filters.md | 32 ++++++++++++++++ packages/skill/references/three.md | 41 ++++++++++++++++++++ 8 files changed, 171 insertions(+), 3 deletions(-) diff --git a/apps/site/design.md b/apps/site/design.md index 27f855f..b513a46 100644 --- a/apps/site/design.md +++ b/apps/site/design.md @@ -286,6 +286,28 @@ conic 은 중심에서 각도로 도는데, 1180×54 처럼 납작한 형태에 유리가 차갑게만 보이지 않게 하는 정도이고, 밝은 밴드에서는 흰빛 대신 그림자로 뒤집는다(`--glass-rim`·`--glass-bloom` 을 `.band-inverse` 에서 재정의). +### 테두리 광을 회전시켰다 + +정지한 헤어라인 위에 **도는 빛**을 얹었다. `conic` 의 각도를 `@property` 로 돌리면 +매 프레임 배경을 다시 칠하므로(하드 게이트 #8), **정사각형 원뿔 레이어를 마스크 안에서 +`rotate` 시킨다.** 움직이는 것은 transform 뿐이다. + +`aspect-ratio: 1` 로 정사각형을 유지해야 회전 중 밝기가 일정하고, +`width: 200%` 로 크게 잡아야 1178×52 짜리 헤더에서도 모서리까지 닿는다. 주기 11초. + +### three.js 모바일 대응 + +**세로 화면에서 게이트가 통째로 안 보이고 있었다.** 수직 시야는 화면 비율과 무관하지만 +수평 시야는 aspect 에 비례한다 — 데스크톱(2.5:1)에서 정한 판 폭 15 가 +세로 화면(0.45:1)의 수평 시야 2.5 에 비하면 **여섯 배**라, 첫 판이 화면을 완전히 덮었다. + +`fit()` 에서 `camera.aspect` 를 갱신할 때 판의 `scale.x` 도 같이 잡는다. + +그리고 저사양 판정을 고쳤다. `hardwareConcurrency <= 4` 만 보면 **요즘 폰이 전부 +고사양으로 잡힌다**(8코어가 흔하다). `innerWidth < 760` 을 함께 본다 — +좁은 화면은 대개 배터리로 돌고 열이 더 난다. DPR 도 1.5 → **1.25**, +캔버스 불투명도도 0.7 → **0.45**(세로에서는 화면 전체를 덮으므로). + ### three.js 씬 셋은 서로 다른 것이어야 한다 게이트 씬을 파이프라인으로 옮기면서 히어로에도 그대로 남겨뒀더니 diff --git a/apps/site/src/components/Materials.astro b/apps/site/src/components/Materials.astro index f8a631e..2dfd10b 100644 --- a/apps/site/src/components/Materials.astro +++ b/apps/site/src/components/Materials.astro @@ -17,6 +17,7 @@ const { c } = Astro.props;

{c.lead}

+ {/* GPU 가 만드는 재질. WebGL 이 없으면 위 그라디언트가 그대로 결과물이다 */} diff --git a/apps/site/src/components/Pipeline.astro b/apps/site/src/components/Pipeline.astro index 4360c71..239c2ce 100644 --- a/apps/site/src/components/Pipeline.astro +++ b/apps/site/src/components/Pipeline.astro @@ -91,6 +91,10 @@ const { c } = Astro.props; } .gate-canvas { opacity: 0; transition: opacity 1s var(--ease-soft); } .gate-canvas.is-live { opacity: 0.7; } + /* 세로 화면에서는 캔버스가 화면 전체를 덮는다. 같은 밝기면 본문이 묻힌다 */ + @media (max-width: 760px) { + .gate-canvas.is-live { opacity: 0.45; } + } /* 통과한 단계가 켜진다. 3D 와 텍스트를 잇는 유일한 연결이다 */ .stop { transition: opacity var(--dur-quick) var(--ease-out); } diff --git a/apps/site/src/layouts/Base.astro b/apps/site/src/layouts/Base.astro index 2049791..5176b0c 100644 --- a/apps/site/src/layouts/Base.astro +++ b/apps/site/src/layouts/Base.astro @@ -87,6 +87,7 @@ const FAVICON =