見出し画像

テクスチャUVを調べる

メッシュに色をつける方法は、頂点カラーのほか、テクスチャを貼りつけるという方法がある。テクスチャの実体はピクセル・アレイ(Array、配列)で、普段扱っている画像ファイルの中身とほぼイコールだと考えて差し支えはないと思う。

フェイスごとにテクスチャの領域を指定すると、テクスチャに描かれている絵がフェイスへ貼りつけられてメッシュが描画される。テクスチャのどの領域をどのフェイスに割り当てていくのかを対応づけしていくマッピングをするので、テクスチャ・マッピングと呼ばれている。

テクスチャは、あとから差し替えることで動的に絵面を変更できる。また、テクスチャを差し替える時にテクスチャのピクセル・サイズを変更することもできる。テクスチャのピクセル・サイズがいきなり変わっても問題ないように、テクスチャは独自の座標系を持っている。

テクスチャ・マッピングは、テクスチャのピクセル・サイズに依存しないよう、領域を指定する単位にピクセル座標系を使っていない。代わりに実数で指定するようになっており、この実数が作る座標系をテクセル(Texel)と呼んでいる。

ピクセル座標系はXとYの2軸で座標を表すけれど テクセル座標系はUとVの2軸で座標を表す。この2軸の名前を取って、UV座標と呼ぶ人もいる。

今回は、このテクセルへのアクセスについて調べてみる。

UV Editing画面

UVの配置状況は、UV Editing画面で見ることができる。Blenderを起動するとデフォルトで作成されているCubeメッシュ・オブジェクトにはあらかじめUVが定義されているけど、自前でメッシュ・データを作った場合はUV展開という操作が必要になる。

UV座標系は横軸がUで、縦軸がVとなっている。左下が原点(0.0, 0.0)になっているので、右上が(1.0, 1.0)となる。テクセルは座標をUVで表すと説明したけど、Blender上ではXYで表現しているのはご愛嬌。

なお、Blenderでは表示する座標系をピクセル空間に切り替えることもできる。右側に縦に並んでいるViewタブから[Display]-[Pixel Coordinate]をチェックすればいい。

UV Editing画面の右上にはUPMapという文字が見られる。おそらくこれがUVの情報を持っているデータ・ブロックだと思う。

プロパティ画面で探してみると、UV Mpasの中に見つけることができた。

UV Mapsから、もうひとつ別のデータ・ブロックを追加すると「UVMap.001」が増えた。

この状態でUV Editing画面に戻ると、右上の欄から選択できるようになったので、この情報をスクリプトで参照できるようになれば、UVの操作を行うことができるはずだ。

uv_layers

UVの情報もメッシュ・データに紐づくだろうと思って、bpy.data.meshes["Cube"].uvまでタイプして、タブキーを押すといくつかの候補が挙がってくる。一覧を見ると、おそらくuv_layersプロパティであろうと判断できる。

インタラクティブ・コンソールでuv_layersプロパティに紐づくデータの名前を表示させてみると、先ほど確認したUV Mapsに格納されているデータを確認することができた。

>>> for uvLayer in bpy.data.meshes["Cube"].uv_layers:
...     print(uvLayer.name)
...     
UVMap
UVMap.001

UV座標は頂点カラーの時と同じようにdataプロパティに紐づいていると容易に推測できる。

次のスクリプトで頂点カラーの時と同じように24個のデータに紐づいていることが確認した。

>>> print(len(bpy.data.meshes["Cube"].uv_layers["UVMap"].data))
24

dataプロパティも、頂点カラーと同じようにメッシュ・ループに紐づくサブスクリプトを持っていることがわかった。

UV座標はuvプロパティに持っているので、メッシュ・ループのサブスクリプト0番のuvは、次のように参照できる。

>>> bpy.data.meshes["Cube"].uv_layers["UVMap"].data[0].uv
Vector((0.625, 0.5))

フェイス0番に紐づくUV座標をすべて参照したいのであれば、次のようにスクリプトを書ける。

>>> for index in bpy.data.meshes["Cube"].polygons[0].loop_indices:
...     print(bpy.data.meshes["Cube"].uv_layers["UVMap"].data[index].uv)
...     
<Vector (0.6250, 0.5000)>
<Vector (0.8750, 0.5000)>
<Vector (0.8750, 0.7500)>
<Vector (0.6250, 0.7500)>

データ構造

UV座標を参照するためのデータ構造をイメージにまとめると次のようになる。頂点カラーを参照するデータ構造との比較をしてみると、同じ構造になっていることがわかる。

この記事が気に入ったらサポートをしてみませんか?