From 2d5a61b98f9ab25b3a7e5dc5bee11cb98c5156df Mon Sep 17 00:00:00 2001 From: Yasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com> Date: Sun, 4 Oct 2026 19:21:55 +0900 Subject: bluebey-studio: まえがみをM字(富士額)の形に MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中央の尖り(未亡人の尖り)と左右のこめかみの山、その間の後退という3山2谷のM字にした。 --- public/bluebey-studio/src/faceArt.js | 19 ++++++++++--------- public/bluebey-studio/src/panel.js | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) (limited to 'public/bluebey-studio/src') diff --git a/public/bluebey-studio/src/faceArt.js b/public/bluebey-studio/src/faceArt.js index 6a870fa..fab975a 100644 --- a/public/bluebey-studio/src/faceArt.js +++ b/public/bluebey-studio/src/faceArt.js @@ -867,11 +867,11 @@ function drawHeadCover(ctx, spec, limits) { const halfSpan = width / 2; const boundary = (x) => { const t = clamp((x - cx) / halfSpan, -1, 1); - // まえがみ: falls towards the cheeks with a needle pulled down at the centre. + // まえがみ: 富士額 / M字 (a widow's peak). if (shape === 'fringe') { - const sweep = 420 * t * t; - const needle = 500 * Math.max(0, 1 - Math.abs(t) * 6); - return base - 100 + sweep + needle; + const m = (1 + Math.cos(2 * Math.PI * t)) / 2; + const peak = Math.max(0, 1 - Math.abs(t) * 3); + return base + 300 * m + 160 * peak; } // はちわれ: the same V upside down - a widow's peak. if (shape === 'fringe-up') return base - 320 * Math.max(0, 1 - Math.abs(t) * 1.5); @@ -958,12 +958,13 @@ export function drawHeadCoverWrap(ctx, spec, layout) { const cx = layout.offsetX + span * 0.5 + clamp(spec.offsetX ?? 0, -600, 600); const vBound = (x) => { const t = clamp((x - cx) / half, -1, 1); - // まえがみ: the hair falls towards the cheeks on both sides (a strong - // concave sweep) with a narrow needle pulled down at the centre of the head. + // まえがみ: 富士額 / M字 (a widow's peak). The hairline comes down at the + // centre (the peak) and at the temples, with the corners between receded - + // the three peaks and two valleys of an "M". `t` is -1..1 across the front. if (shape === 'fringe') { - const sweep = 0.30 * t * t; - const needle = 0.42 * Math.max(0, 1 - Math.abs(t) * 6); - return base + sweep + needle; + const m = (1 + Math.cos(2 * Math.PI * t)) / 2; // peaks at t = 0, +-1 + const peak = Math.max(0, 1 - Math.abs(t) * 3); // sharper central point + return base + 0.26 * m + 0.12 * peak; } // はちわれ: the same V upside down - a widow's peak. if (shape === 'fringe-up') return base - 0.18 * Math.max(0, 1 - Math.abs(t) * 1.5); diff --git a/public/bluebey-studio/src/panel.js b/public/bluebey-studio/src/panel.js index 3c2dc15..5a231f6 100644 --- a/public/bluebey-studio/src/panel.js +++ b/public/bluebey-studio/src/panel.js @@ -1121,7 +1121,7 @@ export function buildPanel(app, root) { }); headMarkBox.add(headMarkColor.el); headMarkBox.add(headMarkColor2.el); - headMarkBox.add(hint('「かぶせ」は頭にかぶせる丸い髪、「まえがみ」は中央が高くほっぺ側へ下がる前髪、' + headMarkBox.add(hint('「かぶせ」は頭にかぶせる丸い髪、「まえがみ」は中央とこめかみが下がるM字(富士額)の前髪、' + '「はちわれ」は中央が鋭く持ち上がった生え際、「カーブ」はドラえもんのように単純にカーブした髪、' + '「わけめ」は7:3に分けた髪です。「たかさ」で生え際を目の中心あたりまで下げられます。' + '「髪を目の前に出す」を切ると、髪が目の後ろに回ります。')); -- cgit v1.3.1