本日はモデリング枠です。
先日Unityを使用したアプリケーション開発時にCanvasを使用したUIコンポーネントのメッシュをエクスポートしたいと思いましたが、Meshクラスを使用していない描画などでは、FBXExporterなどのツールが使用できないことがあります。
今回はRenderDocを使用してこういった特殊なメッシュをBlenderにエクスポートします。
〇環境
・Windows11PC
・RenderDoc
・Untiy2022.3.26f1
・Blender4.1
〇RenderDocを使用してBlenderでメッシュを再現する
今回はMRTK3のCanvasDialogプレファブで構成されるPlateオブジェクトのメッシュを抽出します。

このオブジェクトは前述の通り、MeshRendereではなくCanvas Element Rounded Rectコンポーネントによりメッシュが作成されています。

①RenderDocをロードします。

②RenderDocのキャプチャを撮影します。

③対象のメッシュのイベントを選択します。

④Mesh Viewerウィンドウへ切り替えます。

⑤CSVとしてメッシュデータをエクスポートします。

なおCSVのファイルパスは任意に指定します。
import bpy
import csv
# CSVファイルのパス
csv_file = r"C:\Users\\Desktop\test.csv"
# 頂点と面のデータを格納するリスト
vertices = []
normals = []
uvs = []
faces = []
# CSVデータの読み込み
with open(csv_file, 'r') as f:
reader = csv.reader(f)
header = next(reader) # ヘッダーをスキップ
for row in reader:
# POSITIONデータの抽出
x = float(row[2]) # POSITION.x
y = float(row[3]) # POSITION.y
z = float(row[4]) # POSITION.z
vertices.append((x, y, z))
# NORMALデータの抽出
nx = float(row[5]) # NORMAL.x
ny = float(row[6]) # NORMAL.y
nz = float(row[7]) # NORMAL.z
normals.append((nx, ny, nz))
# TEXCOORD0データの抽出 (UV座標)
u = float(row[16]) # TEXCOORD0.x
v = float(row[17]) # TEXCOORD0.y
uvs.append((u, v))
# 面を自動生成(例: トライアングルとして繋げる)
for i in range(0, len(vertices) - 2, 3):
faces.append((i, i + 1, i + 2))
# メッシュ作成
mesh = bpy.data.meshes.new("CustomMesh")
mesh.from_pydata(vertices, [], faces)
# カスタム法線を設定
mesh.normals_split_custom_set(normals)
# UV設定
uv_layer = mesh.uv_layers.new()
for i, loop in enumerate(mesh.loops):
uv_layer.data[i].uv = uvs[loop.vertex_index]
# オブジェクト作成
obj = bpy.data.objects.new("CustomObject", mesh)
# スムーズシェーディングの設定
for poly in mesh.polygons:
poly.use_smooth = True # 各ポリゴンにスムーズ設定を適用
# シーンにリンク
bpy.context.collection.objects.link(obj)
# スムージング角度を有効化(Blender 4.1以降)
bpy.context.view_layer.objects.active = obj
bpy.ops.object.shade_smooth() # オブジェクト全体にスムーズシェーディングを適用
これによってRenderDocで取得したメッシュがBlenderでも再現されます。

本日は以上です。