今回は現在作成しているMixedRealityModelingToolsの開発に向けて調査としてBlender内でメッシュUV情報はどのように扱われているのか?BlenderからUV情報を取得するにはどうすればよいのかを調べていきます。
〇BlenderのUV
UVはテクスチャ画像とも呼ばれ2次元ベクトルの情報として頂点情報に紐づいています。
例えば編集モードで現在選択しているメッシュからUV情報を取得するには次のようになります。。
import bpy
# アクティブなオブジェクトを取得
obj = bpy.context.active_object
# 現在のオブジェクトがメッシュであることを確認
if obj.type == 'MESH':
# メッシュデータの取得
mesh = obj.data
# UV情報を含むUVマップを取得
uv_layer = mesh.uv_layers.active
if uv_layer:
# メッシュのすべての頂点に対してループ
for vertex in mesh.vertices:
vertex_index = vertex.index
# 頂点に関連づけられたUV情報を取得
loop = mesh.loops[vertex_index]
uv = uv_layer.data[loop.index].uv
print(f"Vertex {vertex_index}: UV = ({uv.x}, {uv.y})")
else:
print("UVマップが存在しません。")
else:
print("アクティブなオブジェクトはメッシュではありません。")
このコードではメッシュの持つすべての頂点情報を取得して、頂点のindexの中からuv情報を取得しています。
オブジェクトを選択して実行すると次のように各頂点に応じてUV座標が取得できます。

一般的にUV座標は0~1の間に収まるような値を示しますが、最適化の観点で1を超える値を扱うものもあります。
〇頂点情報として格納されている情報
今回はUVを取得しましたが、同様に頂点情報として頂点ごとに格納されている情報には以下のようなものがあります。
・頂点座標 (Vertex Coordinates): 各頂点の座標(xyz)
・法線ベクトル (Normals): 頂点や面の法線方向(xyz)
・面情報 (Polygons): メッシュ内の面に関する情報、面の頂点の順序など(int)
・頂点カラー (Vertex Colors): 頂点ごとに割り当てられたカラーデータ(rgb)
・頂点ウェイト (Vertex Weights): 頂点がどのボーンに影響を受けるかを示す情報
・テクスチャ座標 (UV Coordinates): テクスチャマッピングのためのUV座標情報。
・マテリアル情報 (Materials): 各面に適用されるマテリアルに関する情報。
・エッジ情報 (Edges): エッジに関する情報、エッジの頂点など。
本日は以上です。