MRが楽しい

MRやVRについて学習したことを書き残す

Blender 2.8のPython APIドキュメントを少しずつ読み解く 落とし穴 その4

本日は Blender2.8 の調査枠です。
Blender 2.8 の Python API ドキュメントを少しずつ読みつつ試していきます。
前回記事の続きです。
bluebirdofoz.hatenablog.com

Blender 2.8 Python API Documentation

以下のページを日本語訳しつつ実際に試して記事を進めていきます。
docs.blender.org
docs.blender.org

今日は「落とし穴」の「Nゴンとテッセレーション」です。
f:id:bluebirdofoz:20200114093208j:plain

Nゴンとテッセレーション

バージョン2.63からNゴンがサポートされています。
一部のエクスポーターなど三角ポリゴンにアクセスする必要がある場合があるため、これにより複雑さが増します。
※ Nゴン:5つ以上の頂点で生成されるポリゴン(面)のこと。

面にアクセスするには、次の3つの方法があります。

bpy.types.MeshPolygon:オブジェクトモードで面を保存するデータ構造(mesh.facesではなくmesh.polygonsでアクセス)
bpy.types.MeshLoopTriangle:ポリゴンを三角形にモザイク化した結果(mesh.loop_trianglesでアクセスする)
bmesh.types.BMFace:編集モードで使用されるポリゴン。

以降はこれらをそれぞれポリゴン、Tessfaces、bmesh-facesと呼びます。
5つ以上の頂点で生成されるポリゴンは ngons として参照されます。

サポートの概要

APIbpy.types.MeshPolygonbpy.types.MeshTessFacebmesh.types.BMFace
作成悪い(柔軟性がない)良い(サポート)ベスト
編集悪い(柔軟性がない)悪い(Nゴンが失われる)ベスト
出力良い(ngonをサポート)良い(ngonが不要な場合)良い(メモリのオーバーヘッドあり)

bmesh APIの使用は bpy から完全に独立したAPIです。
通常、必要な編集レベルに基づいていずれかを使用します

作成(インポート)

3つのデータ型はすべて、面の作成に使用できます。

ポリゴン

ポリゴンは面を作成する最も効率的な方法です。
しかし、データ構造は柔軟性がないため、すべての頂点と面を準備して一度に作成する必要があります。
各ポリゴンが独自の頂点を格納せず、固定配列であるインデックスとサイズを bpy.types.Mesh.loops で参照する形となるため、更に複雑になります。

bmesh-faces

bmesh-faces は新しいスクリプトがフェースを作成する最も簡単な方法である可能性が高いです。
面は1つずつ追加でき、APIにはメッシュ操作用の機能があるためです。
bmesh.types.BMesh より多くのメモリを使用しますが、一度に1つのメッシュのみを操作することで管理できます。

編集

編集では、3つのデータタイプの扱いが最も異なります。

ポリゴン

ポリゴンは、編集、マテリアルの変更、スムーズのオプションが非常に制限されています。柔軟性が低く、保管のみを目的としています。

Tessfaces

Tessfaces は既存の ngons がテッセレーションされるため、ジオメトリの編集には使用しないでください。

bmesh-faces

BMesh-Faces は、ジオメトリを操作する最良の方法です。

出力(エクスポート)

3つのデータタイプはすべてエクスポートに使用できます。
選択肢は主に、ターゲットフォーマットが ngons をサポートしているかどうかによって異なります。

ポリゴン

ポリゴンは出力形式に変換できるのであれば、最も直接的で効率的なエクスポート方法です。

Tessfaces

Tessfacesは、ngons をサポートしていない形式へのエクスポートに適しています。使用が推奨される唯一の事例です。

bmesh-faces

BMesh-Facesはエクスポートにも機能します。しかし、オブジェクトモードのネイティブストレージ形式ではないため、bmeshを使用するとオーバーヘッドが発生します。このため、ポリゴンを使用できる場合は必要ありません。

bluebirdofoz.hatenablog.com