Poly to Poly
Main/History
GraphiX
LScript
Plugin
Knowledge
Blog

 本末転倒 LScript。LightwaveのLScriptを配布しています。 ご利用は事故自己責任で。
 Lightwave 7.5/8.5/9.x向け、Lightwave 7.5c/dのLScript 2.6では未テスト。(Version List)
 LW9.6以前では2Byte文字(コメント等)に対応出来ず、*.lsのままではプラグイン追加は出来ません。
 その場合、2Byte文字を削除するか、LSコンパイラでLSC化すればプラグイン追加出来るようになります。
 LW9以前のモデラでの変形させる機能は基本的にPrimaryLayerにしか作用しません。
 PrimaryLayerには単一のFGレイヤ選択時はそれがそのまま、複数のFGレイヤ選択時はファイルオブジェクト内で順番の若いレイヤがなります(但し条件によっては不定になります)。


○追加関数
LS QueryFlags 0.100 (x86/x64)(75/85/9x)
 LScriptでは取得出来ない、モデラ上の選択モードと対称モードを取得する為の外部関数(と補助プラグイン)です。
 詳細は同梱のソースとテキストを見て下さい。


○頂点座標操作関係

○ウェイト操作関係

Weight Value Modifier0.324 (LScript2.5〜)
 選択した頂点のウェイト値を足したり引いたり掛けたり割ったり、値をコピーしたり。
 LS2.5では前回対象にしたマップを選択した状態で、LS2.6以上ではモデラで選択中のマップも加えた状態で起動します。
 エッジウェイトである「Edge Weight」は無視します。

 [overwrite]がONの場合は、[Absolute]、[Add/Sub]、[Copy]時に変更対象頂点にウェイトマップが無かった場合に付与します。

 [Absolute]は入力値がそのまま適用されます。
 [Add/Sub]は入力値が加算されます。 入力値がマイナスなら結果的に引き算になります。  [Absolute]と[Add/Sub]の時は入力欄が[ n.n % ]になります。

 [Multi][Divide]は掛けたり割ったり、そのままです。 入力値が0の時、0倍(結果0)はされますが、0で割る事はありません。  [Multi]と[Divide]の時は入力欄が[ n.n ]になります。
 [Copy]は1番目の選択頂点の値を他の頂点に適用します。
 1番目の頂点にウェイトマップが無い場合、[overwrite]がONでは他の頂点から対象ウェイトマップを削除します。 OFFでは何もしません。
 [Copy]の時は入力欄は表示されません。

 [Current][Add]ボタン(LS2.6以上)はモデラで選択中のマップを選択、または選択に追加します。
 [Recent][Add]ボタンは前回対象にしたマップを選択、または選択に追加します。

 対象にしたウェイトマップと動作モードをstore()で覚える為にレジストリが汚れます(overwriteフラグは覚えません)。
 スクリプト内の「@define OVERWRITE false」をtrueにすると[overwrite]の初期状態がONになります。
(070318)copyモードがバグってたのをFIX。
(070320)Edge Weightをリストから除外するように。
(070919)LS2.11対策。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


○モーフ操作関係

○UV座標操作関係

○選択処理操作関係

○その他

Merge Points No Requester20.1 (LScript2.5〜)
 動作モードを問い合わせずに選択頂点の1番目に合わせてマージします。 WeldのMerge版。
 MorphMap等の辻褄合わせはしないので通常のMergeと同じ制約を受けます。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。

 パネル表示無しでマージするだけなら、モデラのユーザコマンド登録で「mergepoints」を登録するのが早いです。
 コマンド登録の方が余計なファイルが増えないのでオヌヌメですがLightwave9.0のコマンドはぶっ壊れてるので以下略。


Simple Split0.221 (LScript2.5〜)
 面選択を端折れるSplit。
 頂点から面選択を自動でするだけで、内部的には標準機能のSplitと同じです。
 標準のSplitと同じ問題(1面に対し複数頂点を選択した時に線ポリが作成される)を持ちます。
 操作ミス対策で20頂点以上の選択時にerror()終了しますが、スクリプト中の「 @define MAX_POINT 20 」の数値を変更する事で、任意の数を上限に出来ます。
 LW8/9のコネクト(Connect)があれば無用の長物。
(070319)調整。


○遺産 プラグイン版に置き換えたもの

Random Deselect/Select Point0.323 (LScript2.5〜)
 ポイント選択を指定数に合わせてランダムに増減させます。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。
(100223)最大値でclipする所が代入になってなかった。


Normalize Weight Maps0.303 (LScript2.5〜)
 選択した頂点の任意の複数のウェイトマップ(値)を正規化します。

 ボーンで使う特定のウェイトマップを指定する事でレイアウトのWeightNormalizationと同じ結果になります(多分)。

 WeightMap A:100、B:100、C:0、D:無し、という頂点に全マップ選択して適用すると、結果は A:50、B:50、C:0、D:無し、となります。
 A:100、B:100、C:100、D:100の頂点に、マップABCを対象にして実行すると、A:33.3333、B:33.3333、C:33.3333、D:100となります。
 0とマイナス値は無視するので影響しません。

 対象頂点数とマップ数が多いとそれなりに時間が掛かるので注意。
 エッジウェイトである「Edge Weight」は無視します。

(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


Transfer Any VMap0.113 (LScript2.5〜)
 BGの同位置頂点の指定タイプの任意VMAPの情報をFGの頂点にコピー、というか同期させます。
 FGの頂点にあってBGの同位置頂点には無いVMAPは、FG頂点から消し去ります。
 FGとBGを1レイヤづつにし、頂点を選択してから実行します。
 ファイルを跨がないので同一ファイル内に収めてから実行する必要があります。

 モデラでモーフを選択していると頂点の本来の座標が取得出来きないので、モーフマップが選択されていない状態で使う必要があります。

 位置判定を単純な比較でしている為、完全な同位置でないと反応しないと思うので、BGConform等で形状を一致させてから使う事を前提にしています。
 複数頂点が同位置にあった場合の動作は謎です(゚∀。)若いIDの頂点が持つ値が優先されるかも。

 下部の[Weight][Morph][UV]でそれぞれのタイプのリスト内容に切り替わります。 が、処理対象になるのは選んだマップタイプのみです。
 Morphで幾つかマップを選んでも、[Weight]を選んだ状態で実行したらMorphには作用しません。

 [UV]は不連続UVには対応してません。 後、UVは殆どテストしてないので以下略(;・з・)
 エッジウェイトである「Edge Weight」は無視します。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


Points Set Align0.324 (LScript2.5〜 LW8/9不可)
Points Set Align0.325 (LScript2.6〜)
 選択した頂点を任意軸の任意値に揃えます。

 始点、終点、バウンディングボックスの上限/下限/中心、ゼロ、何れかを選択する事でその値が数値入力欄に入ります。
 X/Y/Zの軸ボタンで適用する軸を決定します。

 数値入力欄に数値を直接入力した場合は、自動的にその軸ボタンがONになります。
 入力後でも軸ボタンをON/OFF出来ます。
 X/Y/Zの軸ボタンの並び右端のボタンで一括ON/OFF出来ます。

 この軸には始点の値、この軸には終点の値を入れて一度に処理、といった器用な事は出来ません。
(071012)8以降用のLW9.xでのUndoバッファ消費規則の変化への対策。


Point Value Round0.116 (LScript2.5〜)
 選択した頂点の座標値を任意桁で丸めます。

 X/Y/ZボタンのON/OFFで適用軸制限。
 スクリプト内の「 @define DEFAULT_ROUND 6 」が対象桁の初期値。
 0.0255とか、実は0.0254999〜でしたっていう罠もあるから微妙。
(071013)LW9.xでのUndoバッファ消費規則の変化への対策。一部の−値の判別で&&でなく||にしてた事による問題をFIX。−&小数一位の時の処置をx0.1x10倍からx-1x-1に変更。


Point Symmetric0.322 (LScript2.5〜)
 選択した頂点の1,3,5〜と2,4,6〜を対として、偶数番の頂点を対になる奇数番のx対称位置にに移動します。
 複数レイヤーへは未対応。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


Apply Many Morph0.213 (LScript2.5〜)
 最大8つ迄の任意のモーフマップを選択した頂点の座標に適用します。
 通常のApplyMorphと違って、%で適用量を調整する事は出来ません。

 モーフが選択状態になっていると、頂点の本来の座標値は取得出来ず、モーフが適用された値しか取得出来ない為不都合が生じます。
 LS2.6以降では警告して終了しますが、LS2.5ではそのまま続行してしまいます。 要注意。

 「ApplyMorph→Map選択→適用」を何度も繰り返さずに済むだけの物Death。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


Morph Diff0.313 (LScript2.5〜)
 選択した頂点の任意のモーフマップの値の差を適宜モープマップに格納します。
 多段階モーフの作成支援用。
 相対マップのみに対応。

 SRC Map 1とSRC Map 2の差分量をDEST Map 2に出力します。
 同様にS2->S3=D3、S3->S4=D4、S4->S5=D5。 5段階まで。
 DESTを指定しなかった場合は同番のSRCを上書きします(DEST 2を指定しなかった場合SRC 2を上書き)。

 SRC Mapの値を一つも持たない頂点があった場合、その頂点がDEST Mapの値を持っていたらDEST Mapに0を格納します。  DEST Mapの値を持っていない場合はその頂点に対しては何もしません。

 とにもかくにも事前バックアップは忘れないように('A`)ノ
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


Morph Modfy AnyAxiz0.625 (LScript2.5〜)
 選択した頂点の特定の軸の移動量を変更して、他の軸には干渉しないSet Morph Value。

 LS2.5では適宜モーフを選択。 前回対象にしたモーフがあれば次回以降それが初期選択になります。
 LS2.6では編集(選択)状態のモーフを優先して初期選択にします。
 編集状態でなければ前回対象が初期選択になります。
 X/Y/Zボタンで値を変更する軸を指定します。 [*] で一括ON、[−] で一括OFF。
 [− 0 +]は全軸への単位設定を問わず 1mmの増減もしくは0リセットを行います。
 X/Y/Z横の軸対象(Sym)チェックボックスが ON の場合、座標系の+側には入力値が、−側には入力値を±反転した値が適用されるので簡易的な軸対象性を得られます。
 ModifyTypeの[Related]は元の数値への増減、[Absolute]は入力値をそのまま適用します。
 [Multi]では元の数値に対して%欄の値を乗算します。 Multi以外は%欄を参照しません。 Multiは軸対象チェックボックスの状態を見ません。

 対象にしたモーフマップをstore()で覚える為にレジストリが汚れます。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


UV SetAlign0.141 (LScript2.5)
UV SetAlign0.221 (LScript2.6〜)
 安部氏のUV Fit/UV Fit(UV)のパチモノ。
 LastPointでなく「1stSelectに合わせる」版。
 不連続UVには非対応です。
 LS2.6では選択(編集)状態のUVマップが対象になります。
 LS2.5では現在選択中のVMAPを取得出来ない為、事前に対象とするUVマップを指定する必要があります。
 頂点選択が無い状態で実行すると出る左図メニューでUVマップを指定して下さい。 UVマップをstore()で覚える為にレジストリが汚れます。
 UVマップ名で記憶するので、対象が別モデルであっても対象にするUVマップが同名である限り再指定する必要はありません。
 マップ名が存在しなかった時も選択メニューが出ます。 際して頂点選択が適切なら継続実行されます。


UV Symmetric0.461 (LScript2.5)
UV Symmetric0.522 (LScript2.6〜)
 最初に選んだ頂点のU値を中心座標とした左右対称の座標値にします。
 2点目と3点目、4と5・・・の様に対に扱うので、適切な順で頂点選択する必要があります。
 中心とする基点を1点選んだ後、対称モードで点を選択してから実行、とするとよさげです。
 不連続UVには非対応です。
 LS2.6では選択(編集)状態のUVマップが対象になります。
 LS2.5では現在選択中のVMAPを取得出来ない為、事前に対象とするUVマップを指定する必要があります。
 頂点選択が無い状態で実行すると出る左図メニューでUVマップを指定して下さい。 UVマップをstore()で覚える為にレジストリが汚れます。
 UVマップ名で記憶するので、対象が別モデルであっても対象にするUVマップが同名である限り再指定する必要はありません。
 マップ名が存在しなかった時も選択メニューが出ます。 際して頂点選択が適切なら継続実行されます。


Round UV Value0.216 (LScript2.5〜)
 使用予定のイメージテクスチャの解像度(256,1024etc)に合わせ、選択頂点のUV値が画素の中央や境界になる様に調整します。
 選択したUVマップに対して処理します。
 | | |画素の並びに対し、
 |・| |Center、
 | ・ |Border。

 Centerを選び、100%の値に適用した場合、100%を超えた値になるので注意。
 不連続UVには非対応です。
 対象にしたUVマップをstore()で覚える為にレジストリが汚れます。
 8以降のLSComp.と相性悪いのか、複数回の実行で落ちる。 LSのままなら大丈夫っぽい。 でも日本語コメントを消さないとプラグイン追加は出来ない。

(071213)無用な頂点数取得を削除。解像度指定の選択と適用部の食い違いがあったのを修正。変数作成と値代入を分けた。


Select By AnyMap0.444 (LScript2.5〜)
 標準のSelect By VMAPの「ウェイトとモーフで一覧を別けて、前回マップを記憶しとく版」

 [Weight]、[Morph]でボタンがアクティブな方が処理対象になります。 ポップアップリストから選択した際に対象マップタイプが自動で切り替わります。
 [Select]で選択の追加、[Deselect]で現状の選択から該当頂点を外します。
 閾値横のボタンをONにすると等号/不等号ボタン、閾値入力欄が有効になります。
 等号/不等号ボタン、しきい値はWeightとMorphで動作が異なります。
 [Weight]の場合、閾値と等号/不等号で算数的に処理します。
 [Morph]の場合、閾値は無視され、等号の時にはモーフ値のXYZ全てが0の頂点が対象になり、不等号の時にはXYZに0以外の値を含む頂点が対象になります。

 [Weight]リスト内の「SubPatch Weight」を指定するとサブパッチウェイトが対象になります。

 LS2.6以降ではモデラで選択中のマップ名とそれに応じた対象([Weight]か[Morph])が優先してリストアップされます(ウェイトとモーフを選択中だった場合は対象は前回実行時の指定に沿います)。
 ウェイトに「base」という名のマップがあり、それをモデラで選択した状態で実行すると「SubPatch Weight」が優先してリストアップされますが、LS2.6以降の理不尽な動作にまつわる事象なので我慢して下さい(・з・)


QuickSelectSurface (LScript2.5〜)
 選択状態にあるポリゴンと同じサーフェスのポリゴンを(追加)選択状態にします。
 StaticsでSurface名を選択→「+」でポリゴン選択。てな手順の簡略化。
 LW9.2から同等のプラグインが付いたので9.2以降はそれを使うのが無難かも。


All DeSelect (LScript2.5〜)
 選択モード無視で点/面両方の選択を全部解除します。
 選択モードの取得方法が無いっぽいので、点と面の両方解除した挙げ句、選択モードを点に切り替えますorz
 Staticsで「−」やメニューの欄外クリックでの解除の簡略化。
 選択モードに応じた解除機能もあるけど、ツール(Move等)を選択した状態だと機能しない。
 本来なら「ツールを解除」=>「選択解除」という2行を書ければいいんだけど、両方共Commandとして解放されてないから出来ない('A`)
 LW9.0から類似のプラグインが付いたので9.0以降はそれを使うのが無難かも。


Select By Current WeightMap0.11 (LScript2.6〜)
Select By Current MorphMap0.11 (LScript2.6〜)
 モデラで現在選択しているウェイトorモーフマップを対象として、対象マップを持つ頂点を現在の選択状態に加えます。
 マップが選択されていなければ何もしません。


Change or Init Pivot Point0.1 (LScript2.5〜)
 選択無しの場合はPivotを< 0,0,0 >に設定。 選択した点が1つならその座標をPivotに設定。
 複数の点を選択した場合は、BoundingBoxの中心座標をPivotに設定。
 FGレイヤ全てに単一値が適用されます(レイヤー毎に個別算出されません)。


Merge Points No Requester30.103 (LScript2.5〜)
 基本的には動作モードを問うパネルの出ないMergePointsです。
 頂点のみを選択している場合はmergepoints()の発行だけします。
 その際は通常通りの結果になり、対象頂点にモーフ情報の違いがあればマージされません。
 ですが、頂点を明示的に選択し、モーフ情報を残したい頂点を含むポリゴンを選択した状態で実行するとモーフ情報の辻褄を合わせてからmergepoints()します。
 単純な位置比較で処理している為、同位置の頂点のみしか処理対象になりません。
 モーフ選択中は正常な頂点位置が取得出来ないので選択を解除して実行する必要があります(LS2.6では警告終了します)。
(071012)LW9.xでのUndoバッファ消費規則の変化への対策。


Change Point Order in QuadPoly0.132 (LScript2.5〜)
 四角ポリゴンを構成する頂点の順番をずらします。 頂点IDが変わるわけでは無いです。
 サブパッチでの分割方向を確定させるのが主な目的です。
 サブパッチの内部的な三角分割方向は頂点1と3で切り分けたものになります。
 頂点の並びが変わる事で法線ベクトルが変わります。
           (↑水色が内部的な三角分割方向)
 モデラ標準の三角分割で四角を分割する場合は2と4で切り分けられますが、レイアウトの四角ポリゴン(サブパッチ ケージにあらず)に対する扱いは不明です。
 平滑な(平面)四角ポリゴンには殆ど影響しませんが、捻じれのある所(非平面)ではスムージングや変形具合に影響します。
 レイアウトでワイヤー表示にするか、モデラのウェイトシェイドやポリゴン表示の特性を見切ったり、実際にフリーズさせる事でのみ視認出来る部分なので注意。
 サブパッチ状態のまま適用すると挙動が怪しいので、ポリゴン状態で使う事を推奨。
 一通り済ましたら念の為にDStorm製のRefinePolygonsで不正ポリが出来て無いか確認するのがよさげです。
 エッジウェイトとAPSLによるVMADへの影響は不明です。


Symmetrize Polygons Point Order0.121 (LScript2.5〜)
 選択した面の1,3,5〜と2,4,6〜を対として、奇数番を元にして偶数番のポリゴンを構成する頂点順を変更します。
 ↑のChange Point Orderと同様な内部操作をして、分割方向や法線をX軸対称にする為の物です。
 形状のX=0での左右対称性と選択内容(順番)の対称性を確保している事を前提としています。
 対称だった(変更対象にならなかった)対を残して選択解除。
 選択内容が対称かどうかを詳細にチェックしていないので注意。


Check Symmetric Polygons Point Order0.102 (LScript2.5〜)
 選択した面の1,3,5〜と2,4,6〜を対として、奇数番と偶数番のポリゴンの頂点順を照合します。
 ↑のSymmetrize Polygons Point Orderの前準備や事後確認向け。
 頂点順がマッチする対を隠します。
 Selxxx操作のせいかLWが落ちやすいかも('A`)