ImportLDrawアドオンの修正①
6582.dat が正しく読み込めないバグが発見されたので、その修正方法を調べました。
バグの内容
ken@treh81 さんのツイートより。
Blender へ取り込んだメッシュがめちゃくちゃになっています。
6582.dat を配置した .ldr ファイルを作成して再現してみました。
Edit モードで観察してみると、四角形であるべき面がねじれていました。
ソースコードの調査
ImportLdraw アドオンのソースコードを調査し、四角形を読み込む処理を辿ったところ、loadldraw/loadldraw.py にて下記を見つけました。
def parseFace(self, parameters, cull, ccw, isGrainySlopeAllowed):
#...
# Fix "bowtie" quadrilaterals (see http://wiki.ldraw.org/index.php?title=LDraw_technical_restrictions#Complex_quadrilaterals)
if num_points == 4:
nA = (newPoints[1] - newPoints[0]).cross(newPoints[2] - newPoints[0])
nB = (newPoints[2] - newPoints[1]).cross(newPoints[3] - newPoints[1])
if (nA.dot(nB) < 0):
newPoints[2], newPoints[3] = newPoints[3], newPoints[2]
#...
四角形がねじれる問題は "bowtie" ( 蝶ネクタイ ) 現象として知られており、四角形を構成する四点を指定する順番が原因のようです。
下図でいうと、四点を指定する正しい順番は、時計回り ( 0 → 1 → 2 → 3 ) か反時計回り ( 0 → 3 → 2 → 1 ) である必要があるようです。
先ほどのソースコードを読み解くと、ベクトル演算で上手いこと ( 0 → 1 → 3 → 2 ) や ( 0 → 3 → 1 → 2 ) と最後二つが逆になる間違いを検知して修正しています。
しかし、( 0 → 2 → 1 → 3 ) や ( 0 → 2 → 3 → 1 ) のように途中二つが逆になる間違いは検知できず修正されないようです。今回はこのレアケースに当たってしまったようです。
処理の修正
途中二つが逆でも検知し修正されるように、処理を追加しました。
この処理だと凹みのある四角形 ( concave quadrilateral ) には対応できませんが、LDraw の仕様書を調べたところ、"Quads must not be concave" ( 四角形は凹んでいてはいけない ) という記述があったので大丈夫そうです。
また仕様書には時計回りか反時計回りで指定するように、との記述もあるので、本来は 6582.dat のほうを修正するべきなのかもしれません。
修正したコードをインストール
アドオンの作者さんへバグ&修正報告をしておきましたが、いつ適用してもらえるか分からないので、各自で修正する方法を紹介します。
修正したアドオンを下記からダウンロードします。
Code → Download ZIP
Blender から元のアドオンをアンインストールします。
Edit → Preferences → Add-ons を開き、"ldraw" で検索し、右下の Remove ボタンを押します。
続いて右上の Install ボタンからダウンロードした修正版アドオンをインストールします。手順は下記記事を参照願います。
結果の確認
最初の .ldr ファイルを取り込むと、四角形はねじれませんでした。
おまけ
バグの修正や改造などプログラミングに興味のある方向けの補足です。
アドオン情報の File に記載されているパスを開くと、直接ソースコードを編集できます。
編集結果を適用するには Blender を再起動する必要があります。
原点の修正や独自プロパティの追加など、取り込んでから処理するよりアドオンを改造してしまったほうが簡単な場合も結構あるかと思います。
この記事が気に入ったらサポートをしてみませんか?