BlenderでIDマスクをペイントする

3Dペイントソフトでテクスチャを作成する際
パーツの塗り分けに「IDマスク」という単色で塗り分けした画像を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/db2bc312-8707-7d22-8133-f3faa2fbac75.png)
塗り分け画像の作り方はいくつかあるものの、
Blenderで検索して出てくる方法では 
手順が多く煩わしいものが多かったので、別の方法まとめておきたいと思います。

## ペイントマスクについて
まず、Blenderの機能として**ペイントマスク**のことについて触れておきます

ペイントマスクとは　テクスチャペイント　ウエイトペイント　頂点ペイントの各モードに付いている機能で
「選択した面のみ」に各ペイント結果の効果をつける機能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/ee2eb462-d145-5025-644d-5c70f7227b48.png)
各エディタ画面のメニューに四角の重なったようなアイコンや[M]キーを押すことで切り替えができます

面の選択は編集モードの面選択状態と同じになる他、
右クリック選択の設定の場合は右クリックで　左クリック選択の設定の場合はAlt+クリックで選択
さらにShift同時押しで追加選択もできます
また、　メニューに「選択」メニューが追加表示されて編集モードと同じような選択ツールも使用できるようになります
![22102301.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/c837db8a-9f3d-59eb-4647-5ccd6d140af3.gif)
特に「リンク選択」は重要で
現在選択している部分とメッシュ上でつながった部分が一気に選択された状態になります。

:::note
UVシームで範囲が完全に区切られている場合にはメッシュがつながっていても別パーツとして扱われます
:::

## テクスチャペイントモードでのIDマップ塗り分け
テクスチャペイントに入る前にUV展開は済んでいる前提で話をします

テクスチャペイントではビューのモードをテクスチャペイントに切り替えるだけでもいいですが
上のタブからテクスチャペイントのワークスペースを利用すると必要な設定が一通りされていて楽です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/8a6d1ead-82c0-d49c-3d02-f5a8b94cca8e.png)

IDマスクはBlender内のマテリアルでは利用しないデータですので
プロパティエディタのツールセッティングのモードを「**単一画像**」に切り替えます
（これはオブジェクトのマテリアル設定に関係なく
表示している画像をUVマッピングした状態でペイントするモードです）

既存の画像を選択するか　新規のボタンを選択してペイント対象の画像を作成します
キャプチャでUVMapなっている部分で ペイントで使用するUVマップを指定します

これでブラシツールでペイント可能な状態になりましたが
先に説明したペイントマスクモードに入ることで特定の部位のみにペイントできます
![22102302.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/2f662d8a-1d3b-621f-3fa6-4d877fe7ba61.gif)
さらに、ペイントマスクモードで塗りつぶしツールを使用すると
選択部位全てに色が付きます
IDマスクを作るのはとても楽なのではないでしょうか

UVの範囲外に余裕を持たせた塗り足し（パディング）はオプションの「にじみ」の項目で指定できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/d30e1821-faf3-69b0-4858-662f7184460f.png)
後はパーツ分けしたい部分毎に塗った後保存するだけです
３DペイントソフトではIDマスクの再読み込みに対応しているようなので
必用に応じて更新して行ってもいいでしょう

## カラーパレットの作成スクリプト
Blenderにプリセットされているカラーパレットもあるものの
IDマスクの作成にはもっと少ない色数のカラーパレットが欲しくなりました
一個一個手動登録してもよかったのですが　スクリプトで自動化しました
```py:
import bpy

# インデクスで指定したRGBカラーを返す　５４色が最大
def index2color(index):
    col_list = [255, 65280, 16711680, 65535, 16711935, 16776960,
    128, 32768, 8388608, 32896, 8388736, 8421376,
    39423, 26367, 10053222, 9868950, 6697728, 6723891,
    16751052, 10079487, 16737843, 13421619, 52377, 52479,
    12632256, 8421504, 16751001, 6697881, 13434879, 16777164, 
    6684774, 8421631, 13395456, 16764108, 8388608, 16711935, 
    65535, 16776960, 8388736, 128, 8421376, 16711680,
    16763904, 16777164, 13434828, 10092543, 16764057, 13408767, 
    13056, 13107, 13209, 6697881, 10040115, 3355443]
    if index > 54:
        return([0, 0, 0])
    else:
        col_int = col_list[index]
        color = [col_int %256 %256 /255, col_int //256%256 /255, col_int //256 //256 /255]
        return (color)
palette = bpy.data.palettes.new("id_palette")
for i in range(54):
    col = palette.colors.new()
    col.color = index2color(i)
```
スクリプトを実行した後　カラーパレットの一覧のプルダウンから「id_palette」を」選択するとパレットが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/2600a6ed-d4e5-7a22-80ce-9940e5078b49.png)

登録する色は別に作っていた関数を利用して
オフィスソフトのカラーパレットにある54色を参考にしました