Blender2.8に登場したFace Mapsとは何か？

# この記事の目的
一応、最初に断っておくと、筆者にはプログラミングがわからぬ、筆者は、村のグラフィッカーである。
Blenderを弄り、スザンヌと遊んで暮して来た。
けれどもワークフローの改善と自動化、知見の共有に対しては、人一倍に敏感であった。

ということで、はじめまして、月見ねぎとろです。
プログラミングなんもわからん！なグラフィッカーです。
初のQiita記事なので作法などもわからんちんですが、
追加情報や間違いなどありましたら、遠慮なくお寄せください。
どうぞお手柔らかにお願いいたします。

「Blender2.8に登場したFace Mapsとは何か？」という話を少し調べたので紹介します。


# 初めに


一応、本記事の背景はこんな感じ

- Blender2.80は晴れて、2019年7月末正式リリースと相成ったが、日本語での新機能紹介などはまだまだ少ない。
- ていうか、新機能については物によっては英語でもまともに情報なんて出ない。
- グラフィッカーにとってはわかる話でも、非グラフィッカーにとっては謎なものもある。(逆も然り)
- 知見の共有は正義。
- ググって情報が出てくるようにしたい…なら書くしかないよね。

Blenderの解説はある意味でプログラミングと関係なくQiita的にOKかよくわかんないけど、
とりあえずアドオン開発とかに役立つように書いてるつもりです。
 
# Blender2.8に登場したFace Mapsとは何か？

というわけでいきなり本題、Blender2.8で登場したFaceMapsって何なの？という話です。
![facemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507319/a65672eb-c89b-1dcf-cfed-96d0c053a9ca.png)
Face MapsはPropertiesのObject Dateに2.80から追加された新機能です。
Blender2.80現在、日本語ではフェイスマップというカタカナ表記の語訳があてはめられております。
ですが、今時点では正直なんに使うのかよくわからない人が大半だと思います。
それもそのハズ、調べたところ、この機能はまだまだ実装途中で、完成形ではないそうです。
とりあえず、現状どの様に使えるのか、将来的にどのように拡張される予定があるのか、触れていきたいと思います。

#現在実装されているFaceMaps機能
現状実装されている機能はVertex Groups(頂点グループ)に酷似しておりますが、
weightウェイトの設定はできません。
![facemap2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507319/d0e904d7-2db0-2628-3004-f533f2826ffd.png)
（鳩のキャラクターモデルの下顎部分をFaceMapsにlower jawとして登録した図）

マテリアル、シェイプキー、頂点グループなどと同じく、
+ボタンから新規のFaceMapを定義、-ボタンで削除、▲/▼ボタンで並び替えができます。

FaceMapという名前ですが、テクスチャ等とは今のところ関係なさそうです。

3Dビューポート上で面を選択した状態で、FaceMap一覧からFaceMapを選び、Assign(追加)をクリックすると
FaceMapに任意の面を割り当てることができます。
同様にRemove(削除)で任意のFaceMapから面の割り当てを解除できます。

FaceMapを選択し、
selectをクリックすると、FaceMapとして登録した面が、3Dビューポート上でも追加で選択され
Deselectをクリックすると、選択中の面の中からFaceMapとして登録した面が3Dビューポート上で選択解除されます。

このあたりはBlenderを扱っている人であれば、
他の機能とほぼ同様なので感覚的に理解できるのではないかと思います。

FaceMaps特有の話としては、この機能を使うにあたって
選択モードは頂点、辺、面を問いませんが、頂点や辺だけをFacemapにAssign(追加)することはできないようです。
また、頂点グループと異なり、マテリアル同様に1つの面が2つ以上のFaceMapにAssignされることはなく、
最後にAssignされたFaceMapで面のFaceMapが上書きされるようです。

まだ内部的なデータ構造まで調べてはいませんが、
FaceMapsに追加した後ナイフツールや細分化などを用いて面を編集したり、
果てはある程度面を削除した後に、もう一度張りなおしたりしてもFaceMapが継承されるようなので、
どうやら単純に面にデータを持たせたものではないらしい雰囲気です。
私が知らないだけで、名前の通りUVMapのような何らかのマッピングとしてデータを保持しているのかもしれません。

とりあえず、**現在、実装されている機能としては、以上です。**

何にもねーじゃねーか！！と、ずっこけた人と、
なんて素晴らしい機能なんだ！！！と、感動した人と、
感想は人それぞれかと思いますが、個人的にはこの機能、結構感動しております。
…ですが、まあその理由は後述するとして、

とりあえず、FaceMapsの、この後のアップデート予定についてみていきましょう。

# Face Mapsの今後
### 参考資料
Face Mapsが何であるか、Blender開発側が言及している調べた限りの初出は2015年の以下の記事でした。
#### The Custom Manipulator Project (Widget Project)
https://code.blender.org/2015/09/the-custom-manipulator-project-widget-project/

逆にこれ以来、あまり言及が無かったようで、情報は極めて少ないです。
というか、当該記事でもアニメーションGIFを張ってあるだけで、イマイチなんの機能なのかは説明がありません。
記事からもアニメーションGIF動画で操作の様子が確認できるのですがいまいちわかりづらいですね。

この記事を書いたのはBlenderのUIディベロッパーであるJulian Eisel氏、調べていくと本人のYouTubeアカウントに
FaceMapsの最終的な完成系を示した動画デモがあった為、そちらを紹介いたしましょう。

#### Blender Face Group Widgets Demo
https://www.youtube.com/watch?v=WXstmjktMgc

さて、動画を再生すると、一見して面を選択して移動しているだけにも見えますが、
よく見ると面の形が変形しながら移動していることが解ります。
この動画でピンときた人もいるかと思いますが、これはリギング済みのモデルに
フェイシャルアニメーションを付けているときの様子です。

そこで先程の記事に戻りましょう、

### 資料の要約

>Blender suffers from an old disease – the Button Panelitis… which is a contagious plague all the bigger 3d software suites suffer from. Attempts to menufy, tabify, iconify, and shortcuttify this, have only helped to keep the disease within (nearly) acceptable limits.
>
>We have to rethink adding buttons and panels radically and bring back the UI to the working space – the regions in a UI where you actually do your work.  This however, is an ambitious and challenging goal.
>
>Here, the widgets come into play! Widgets allow to tweak a property or value with instant visual feedback. This of course, is similar to how ‘normal’ widgets like buttons or scrollbars work. The difference is, that they are accessible right from the working space of the editors (3D View, Image Editor, Movie Clip Editor, etc). It is simply more intuitive than having to tweak a value using a slider button that is in a totally different place, especially when the tweaked value has a direct visual representation in the working space (for instance, the dimensions of a box).
>
>Being able to interact with properties, or in fact with your content, directly, without needing to search for a button through a big chunk of other buttons and panels, is like UI heaven. This is how users should be able to talk to the software and the content they create in it. Without any unnecessary interfaces in-between. Directly.
>
>Blender already has a couple of widgets, like the transform manipulator, Bézier curve handles, tracking marker handles, etc. But we want to take this a step further: We want to have a generic system which allows developers to easily create new and user friendly widgets. And, we want the same to be accessible for Add-on developers and scripters.
>
>It’s also known that Pixar’s Presto and DreamWorks’ Apollo in-house animation tools make heavy use of widgets.

以下、筆者要約、

- Blenderをはじめ、多くの3Dソフトはボタンパネル症候群とでもいうべき病に侵され、UIがごちゃごちゃして肝心の3Dビューポートが狭くなっている。
- 3Dビューポートを広くしたい。
- 視覚上、UIの全く関係ない所にあるパラメーターを弄って操作する苦痛を減らしたい。
- 解決策としてWidget Project(ウィジェットプロジェクト)を進めている。
- Blenderにはマニピュレータやベジェカーブハンドルのような便利なウィジェット（パネルなどを介さず操作できるUI）があるが、これをもう一段階進めたい。
- アドオン開発者などにも優しい汎用システムが必要である。
- ピクサーやドリームワークスがこういったウィジェットを多用してる。（だから、Blenderがやらないのはおかしいでしょ）

と、言うことで、FaceMapsはリギングを行った後に素早く編集を行う為の機能として今後開発が進んでいくようです。
具体的には頂点グループと同じく、同じ名前を持ったボーンを参照する仕組みになる予定のようです。

…ですが、これ、ちょっと複雑なモデリングをしている人達の多くが今時点でもけっこー使えるんじゃないかと考えているのではないでしょうか？

# とりあえずFace Mapsはこうやって使おう

とにかく、現状としては面を登録しておける機能だけでしかないのですが、
それでも多くのモデラーにとってこれは歓迎すべきことと言えるでしょう。
モデラーは1つのキャラクターにつき、数百～数万の頂点を管理する必要があり、
その中から一部だけを選択する作業を何度も繰り返すことになります。
![facemap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507319/5035edad-6223-392a-aadc-a28d60fb26c5.png)
上の図の鳩キャラクターモデルも下顎だけを選択しようとする場合、
透過表示にしたり、上あごを非表示化したりを何度も繰り返して選択範囲が正しいか、
何度も確認しながら選択しなければなりません。
こんな時、選択範囲を保存できるなら、それほど楽な事はありません。

これまでは選択範囲を保存するにあたって使えるのはマテリアルか頂点グループしかなかったのですが、
マテリアルを分けておくとそれはそれで編集上の不都合が発生します。
特にこのように口内など選択しづらい顔の一部だけをスピーディーに選択したい、などという局面は
シェイプキーの制作で高頻度に発生しますが、シェイプキーは原則的に最終工程であることを踏まえると、
そこからマテリアルを分けるなどは極力避けたい事象になると言えるでしょう。

そこで、もう一つの選択肢、頂点グループを用いて選択範囲を保存する事になるわけですが、
こちらも通常であれば大量の頂点グループが既に登録されており、一覧としては扱いづらい事に加えて、
何よりチェッカー選択などに見られる「頂点を共有する面を選択しない面選択」を実現できないという欠点があります。

![facemap4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507319/8d6b767a-3e6e-96a6-5218-3f29b7b18f5d.png)
（※代表的なチェッカー選択の例。これを頂点選択モードで実現しようとした場合、円柱の全ての頂点が選ばれていることになってしまう。）

もちろん、今後FaceMapsもリギング用の機能としてアップデートされていくため、
こうした一時的なデータの格納場所とし使うにしても、
最終的に余分なデータはクリンナップされることが好ましいでしょうが、
いずれにしてもこうした手段の選択肢が増えること自体は歓迎されるべきことです。

本当に文字にして説明するとしょうもない事なのですが、
きっと、たったこれだけの事に感動するモデラーは、やはり私だけではないハズ…

# まとめ

今回はBlender2.80から追加された、FaceMapsについて簡単にまとめてみました。

現状では大した機能は実装されていないという見方は確かに正しいと思いますが、
モデラーなどBlenderユーザにとっては、将来のアップデートを見越して、
自分たちのワークフローを見直す良い機会になるかとも思います。

また、ついに動き始めたWidget Projectを実感できるという意味でも、
なかなか期待感の持てる更新ではないかとも思います。
今後、アドオン開発者向けにもいろいろ機能が充実しそうなので、エンジニアサイドの皆さんにとっても、
今後の動向が気になる更新なのではないでしょうか？

まだまだFace Maps関連の更新はこれからだと思いますので、
また記事内容の修正や誤りなどありましたら、随時対応していきたく思います。
記事に対する情報やご意見等、お待ちしております。

# (追記)その後の続報(2019/12/08更新)
Julian Eisel氏の開発週報
https://wiki.blender.org/wiki/User:Severin/Reports/Institute_2019#November_4_-_November_10