title: "六角形タイル" description: "六角形グリッドの座標系とハニカムパターンの作り方を学びます。" chapter: "05-transforms" order: 4 challenge: description: "六角形タイルに色のバリエーションをつけてください。各六角形のセルIDを使って、異なる色で塗り分けましょう。" hints:
- "セルIDからハッシュ値を計算して色に使います。fract(sin(dot(id, vec2(127.1, 311.7))) * 43758.5453) のように。"
- "ハッシュ値をhue(色相)として使い、HSVからRGBに変換すると綺麗な色分けになります。"
- "3つの異なるハッシュ値をRGBの各チャンネルに使う方法もあります。"
六角形タイル
六角形グリッドの考え方
正方形のタイリングは fract で簡単にできましたが、六角形タイリングはもう少し工夫が必要です。
六角形グリッドでは、行ごとに半分ずれた配置になります。偶数行と奇数行でオフセットが異なります:
/‾\ /‾\ /‾\
| | | |
\_/ \_/ \_/
/‾\ /‾\ /‾\
| | | |
\_/ \_/ \_/
六角形の座標系
六角形タイリングの基本的なアプローチ:
vec4 hexCoord(vec2 uv) {
vec2 r = vec2(1.0, 1.732); // 1, sqrt(3)
vec2 h = r * 0.5;
// 2つのグリッド候補
vec2 a = mod(uv, r) - h;
vec2 b = mod(uv - h, r) - h;
// 近い方の中心を選ぶ
vec2 gv;
vec2 id;
if (length(a) < length(b)) {
gv = a;
id = floor(uv / r);
} else {
gv = b;
id = floor((uv - h) / r);
}
return vec4(gv, id);
}
この関数は:
gv(xy成分):セル内のローカル座標id(zw成分):セルの識別子
を返します。
六角形の距離関数
六角形のSDFを使って、各セル内に六角形を描くことができます:
float sdHexagon(vec2 p, float r) {
const vec3 k = vec3(-0.866025404, 0.5, 0.577350269);
p = abs(p);
p -= 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
p -= vec2(clamp(p.x, -k.z * r, k.z * r), r);
return length(p) * sign(p.y);
}
ハニカムパターン
六角形タイリングと六角形SDFを組み合わせると、ハニカム(蜂の巣)パターンが作れます:
vec4 hex = hexCoord(uv * 5.0);
vec2 gv = hex.xy;
float d = sdHexagon(gv, 0.5);
float outline = abs(d) - 0.02;
float pattern = smoothstep(0.01, 0.0, outline);
まとめ
- 六角形グリッドは2つの正方形グリッドをずらして構成
- 各点がどちらのグリッドの中心に近いかで所属セルを決定
- セルIDを使ってセルごとのバリエーションが可能
- ハニカムパターンは六角形SDFのアウトラインで作れる