本日は MeshLab の小ネタ枠です。
MeshLabによる3Dデータ加工をスクリプトで出力してCUIで実行する手順を記事にします。
前回記事の続きです。
bluebirdofoz.hatenablog.com
3Dデータ加工のスクリプト出力
MeshLab のスクリプトはGUIでデータ加工の操作を行った際に記録されています。
メニューから Filters -> Show current filter script を開いて記録中のスクリプトを確認することができます。
サンプルスクリプトの作成
試しに、サイズを2分の1にした後、45度の回転処理を行うスクリプトを作成してみます。
最初にメニューから Filters -> Normals,... -> Transform: Scale.. を選択します。
各Axisを 0.5 に設定し、[Apply]をクリックします。これでサイズが2分の1になります。
次にメニューから Filters -> Normals,... -> Transform: Rotate を選択します。
Y軸方向に45度回転するように[Rotation on]と[Rotation Angle]を変更し、[Apply]をクリックします。
加工作業が完了したら、メニューから Filters -> Show current filter script を選択します。
ダイアログが開き、現在、記録されているスクリプトの一覧が表示されます。
[Save Script]をクリックすると、一覧で表示されている加工を行うスクリプトを保存します。
ファイルエクスプローラーが開くので、ディレクトリとファイル名を指定して mlx ファイルを出力します。
スクリプトファイルには以下のように加工処理が出力されています。
<!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 <b>degree</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>