スリムかクラシックかは24ピクセルで決まる。その詳細を徹底解説
スキンがスリムと判断されるのは、(46,20)~(47,31)の24ピクセルのうち、不透明なピクセルが6個未満の場合です。さらに、完全なUVマップ、レガシーな64×32スキンがミラーリングされる理由、岩盤版の128×128スキンがJava版で読み込まれない理由についても解説します。
スキンのPNGファイルには、「スリム」という情報が直接書かれているわけではありません。フラグもメタデータもファイル名の規則もなく、モデルは画像自体から推測されます。具体的には、特定の2×12ピクセルの長方形を調べて、実際に存在するピクセルの数を数えることで判断されます。
判定方法
sample x 46–47, y 20–31 — 2 wide, 12 tall = 24 pixels
count pixels with alpha > 0
slim if fewer than 6 are opaque
クラシックな腕は幅4ピクセル、スリムな腕は幅3ピクセルです。そのため、スリムなスキンでは腕の4列目が空になり、この列が判定の対象となります。この24ピクセルが、キャラクターが着用するモデルを決定します。
しきい値は24ピクセル中6ピクセルであり、1ピクセルではありません。クラシックとみなされるには、列の4分の1が埋まっている必要があります。この許容範囲が重要です。空いているはずの列にいくつかのストレイピクセルがあるスリムなスキンでも、スリムと判断されます。これは、これらのストレイピクセルが意図的なものではなく、ほとんどの場合、編集ミスであるため、望ましい結果です。
また、これにより失敗モードが静かになります。クラシックなスキンを描いたものの、4列目を薄くしか使用していない場合(細い輪郭や、いくつかのシェーディングピクセルなど)、6ピクセル未満となり、自動的にスリムとして検出されてしまうことがあります。その結果、腕の幅が1ピクセル失われても、その理由が説明されないままになります。スキンが間違ったモデルで表示される場合は、この列を確認してください。
完全なUVマップ
スキンの各パーツは固定された長方形であり、それぞれシート上の別の場所にオーバーレイレイヤーがあります。
| パーツ | ベース | オーバーレイ | オフセット | サイズ |
|---|---|---|---|---|
| 頭 | (8, 8) | 帽子 (40, 8) | 右に32 | 8 × 8 |
| 体 | (20, 20) | ジャケット (20, 36) | 下に16 | 8 × 12 |
| 右腕 | (44, 20) | 袖 (44, 36) | 下に16 | 4 × 12 |
| 右足 | (4, 20) | ズボン (4, 36) | 下に16 | 4 × 12 |
| 左腕 | (36, 52) | 袖 (52, 52) | 右に16 | 4 × 12 |
| 左足 | (20, 52) | ズボン (4, 52) | 左に16 | 4 × 12 |
6つのオーバーレイのうち5つは、ベースから正確に16ピクセル離れていますが、方向は同じではありません。 最初の3つのパーツは下に16ピクセルです。後から追加され、下にスペースがなかった下半分に押し込まれた左腕と左足は、代わりに横に16ピクセル移動します。しかも、互いに逆方向です。
帽子だけは16ピクセル離れておらず、頭と同じ行の右に32ピクセルの位置にあります。
したがって、「オーバーレイはベースの下にある」というルールは、シートのちょうど半分にしか当てはまりません。ベースの長方形をコピーして下方向にオフセットすることでオーバーレイを見つける方法は、体、右腕、右足には機能しますが、他の3つでは誤ったパーツにたどり着いてしまいます。
スリムなスキンでは、幅4ピクセルの腕の長方形はすべて幅3ピクセルとして読み込まれます。長方形の位置は移動せず、読み込まれる幅だけが変わります。
レガシーな64×32スキンには左側が全くない
1.8以前のスキンは64×32ピクセルで、シートの下半分が単純に存在しません。左腕と左足はそこに配置されるため、描画する元となるデータがないのです。
この問題を解決するためにミラーリングが行われます。右足 (0, 16) は (16, 48) に、右腕 (40, 16) は (32, 48) にコピーされ、どちらも水平方向に反転されます。これが、古いスキンが完全に左右対称であるのに対し、現代のスキンはそうである必要がない理由です。左右非対称性は64×32形式では表現できない唯一のものであり、変換された古いスキンは、望むと望まざるとにかかわらず、左右対称性が強制されます。
岩盤版の128×128スキンは、大きいのではなく異なる形式
Java版は64×64またはレガシーな64×32スキンを受け入れます。岩盤版は128×128のみを受け入れ、それ以外は受け入れません。どちらのエディションのビューアも、もう一方のファイルを直接表示することはできません。これはスケーリング可能な解像度の違いではなく、異なるサイズの異なるUVレイアウトです。
これは不便というよりも、乗り越えられない壁です。Java版のスキンが岩盤版に「アップスケール」されることはなく、岩盤版のスキンをJava版ビューアに読み込んでも半分のサイズでレンダリングされるのではなく、拒否されます。このページの編集者は、まさにこの理由から、両者を別々のビルドとして扱っています。