MRが楽しい

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

MeshLabによる3Dデータ加工をスクリプトで出力してCUIで実行する

本日は MeshLab の小ネタ枠です。
MeshLabによる3Dデータ加工をスクリプトで出力してCUIで実行する手順を記事にします。
f:id:bluebirdofoz:20200612225149j:plain

前回記事の続きです。
bluebirdofoz.hatenablog.com

3Dデータ加工のスクリプト出力

MeshLab のスクリプトGUIでデータ加工の操作を行った際に記録されています。
メニューから Filters -> Show current filter script を開いて記録中のスクリプトを確認することができます。
f:id:bluebirdofoz:20200612225159j:plain

サンプルスクリプトの作成

試しに、サイズを2分の1にした後、45度の回転処理を行うスクリプトを作成してみます。
最初にメニューから Filters -> Normals,... -> Transform: Scale.. を選択します。
f:id:bluebirdofoz:20200612225208j:plain

各Axisを 0.5 に設定し、[Apply]をクリックします。これでサイズが2分の1になります。
f:id:bluebirdofoz:20200612225218j:plain

次にメニューから Filters -> Normals,... -> Transform: Rotate を選択します。
f:id:bluebirdofoz:20200612225227j:plain

Y軸方向に45度回転するように[Rotation on]と[Rotation Angle]を変更し、[Apply]をクリックします。
f:id:bluebirdofoz:20200612225236j:plain

加工作業が完了したら、メニューから Filters -> Show current filter script を選択します。
f:id:bluebirdofoz:20200612225246j:plain

ダイアログが開き、現在、記録されているスクリプトの一覧が表示されます。
[Save Script]をクリックすると、一覧で表示されている加工を行うスクリプトを保存します。
f:id:bluebirdofoz:20200612225255j:plain

ファイルエクスプローラーが開くので、ディレクトリとファイル名を指定して mlx ファイルを出力します。
f:id:bluebirdofoz:20200612225304j:plain

スクリプトファイルには以下のように加工処理が出力されています。

<!DOCTYPE FilterScript>
<FilterScript>
 <filter name="Transform: Scale, Normalize">
  <Param isxmlparam="0" name="axisX" value="0.5" description="X Axis" type="RichFloat" tooltip="Scaling"/>
  <Param isxmlparam="0" name="axisY" value="0.5" description="Y Axis" type="RichFloat" tooltip="Scaling"/>
  <Param isxmlparam="0" name="axisZ" value="0.5" description="Z Axis" type="RichFloat" tooltip="Scaling"/>
  <Param isxmlparam="0" name="uniformFlag" value="true" description="Uniform Scaling" type="RichBool" tooltip="If selected an uniform scaling (the same for all the three axis) is applied (the X axis value is used)"/>
  <Param enum_val1="barycenter" isxmlparam="0" name="scaleCenter" value="0" description="Center of scaling:" enum_cardinality="3" enum_val2="custom point" enum_val0="origin" type="RichEnum" tooltip="Choose a method"/>
  <Param isxmlparam="0" x="0" y="0" name="customCenter" description="Custom center" z="0" type="RichPoint3f" tooltip="This scaling center is used only if the 'custom point' option is chosen."/>
  <Param isxmlparam="0" name="unitFlag" value="false" description="Scale to Unit bbox" type="RichBool" tooltip="If selected, the object is scaled to a box whose sides are at most 1 unit length"/>
  <Param isxmlparam="0" name="Freeze" value="true" description="Freeze Matrix" type="RichBool" tooltip="The transformation is explicitly applied, and the vertex coordinates are actually changed"/>
  <Param isxmlparam="0" name="allLayers" value="false" description="Apply to all visible Layers" type="RichBool" tooltip="If selected the filter will be applied to all visible mesh layers"/>
 </filter>
 <filter name="Transform: Rotate">
  <Param enum_val1="Y axis" enum_val3="custom axis" isxmlparam="0" name="rotAxis" value="1" description="Rotation on:" enum_cardinality="4" enum_val2="Z axis" enum_val0="X axis" type="RichEnum" tooltip="Choose a method"/>
  <Param enum_val1="barycenter" isxmlparam="0" name="rotCenter" value="0" description="Center of rotation:" enum_cardinality="3" enum_val2="custom point" enum_val0="origin" type="RichEnum" tooltip="Choose a method"/>
  <Param min="-360" isxmlparam="0" name="angle" value="45" description="Rotation Angle" max="360" type="RichDynamicFloat" tooltip="Angle of rotation (in &lt;b>degree&lt;/b>). If snapping is enabled this value is rounded according to the snap value"/>
  <Param isxmlparam="0" x="0" y="0" name="customAxis" description="Custom axis" z="0" type="RichPoint3f" tooltip="This rotation axis is used only if the 'custom axis' option is chosen."/>
  <Param isxmlparam="0" x="0" y="0" name="customCenter" description="Custom center" z="0" type="RichPoint3f" tooltip="This rotation center is used only if the 'custom point' option is chosen."/>
  <Param isxmlparam="0" name="snapFlag" value="false" description="Snap angle" type="RichBool" tooltip="If selected, before starting the filter will remove any unreferenced vertex (for which curvature values are not defined)"/>
  <Param isxmlparam="0" name="snapAngle" value="30" description="Snapping Value" type="RichFloat" tooltip="This value is used to snap the rotation angle (i.e. if the snapping value is 30, 227 becomes 210)."/>
  <Param isxmlparam="0" name="Freeze" value="true" description="Freeze Matrix" type="RichBool" tooltip="The transformation is explicitly applied, and the vertex coordinates are actually changed"/>
  <Param isxmlparam="0" name="allLayers" value="false" description="Apply to all visible Layers" type="RichBool" tooltip="If selected the filter will be applied to all visible mesh layers"/>
 </filter>
</FilterScript>

コマンドラインで利用する

例えば、特定の3Dファイルを読み込んでスクリプトの処理を実行して出力するには以下のようにコマンドを実行します。
・MeshLab_script.bat

set PATH=%PATH%;C:\Program Files\VCG\MeshLab
meshlabserver.exe -i (読み込み3Dファイルパス) -o (書き出し3Dファイルパス) -s (mlx スクリプトファイルパス)

f:id:bluebirdofoz:20200612225314j:plain

Blender で入力データと出力データを比較してみました。
サイズが2分の1になり、45度の回転が行われていることが分かります。
・入力データ
f:id:bluebirdofoz:20200612225323j:plain

・出力データ
f:id:bluebirdofoz:20200612225333j:plain