2019年07月17日

発想は悪くない

...んですが、実装はちと チカラワザ が過ぎましたな。
sm35402391


(7/19追記) さっそく対応されたようですよ → sm35419659

スマートな (よくある) 実現方法としては、外部のウィンドウ操作系スクリプトやそれ系のAPIを使うことが多いように思います。

※有名どころだと UWSCとか(なんか色々消えてるらしい?)。検索するとその手のツールは色々見付かります。

件のパターンなら、

1. TransformViewの "#個別モーフ確認" をON
2. モーフリストを上から走査しつつ (先頭要素選択からキー下入力)、表示画面のウィンドウ内容をキャプチャし加工保存

ぐらいで実現できるので、面倒なのは View内の各コントロールハンドルの取得あたりでしょうか。

まあ (予めモデル情報の精査は必要ですが) 同じような発想で MMD本体でも同様のブツは作れたりするので、自動化でラクしたい方なんかは色々情報をあさってみるのもよいかもしれませんね。


...と、頑張っている方たちに冷や水浴びせているだけではアレなので、一応 対応?的なことをやっておきました。

以下にサンプル置いておくので後はお好きなように。

※PMX用のプラグインはあまり太らせたくないので、旧仕様に突貫で拡張を施しておきました。↑でも書いてありますが、操作マクロ系拡張は十分に方法論が確立されているので、わざわざプラグインとして専用機能を用意していくのは気が進むものではないですね (面倒)


!! PmxEditor_0254g 以降が必要
コード上でダブルクリックをおこなうと内容を選択できます。CSScript の簡易形式にそのままコピペで実行可能です。

■テストコード1 : View画面をクリップボードへキャプチャ
// PmxView画面をクリップボードへコピー(キャプチャ)
Clipboard.SetImage(view.GetClientImage());

// SubView
//Clipboard.SetImage(connect.View.PmxViewHelper.SubView.GetClientImage());

// TransformView
//Clipboard.SetImage(connect.View.TransformView.GetClientImage());

----
■テストコード2 : モーフ一覧を画像で出力(参考用)
/*
* 全モーフを一覧で画像出力します/適宜表示状態を変更してください.
* 一時フォルダにMorphImageOutフォルダを作成します
* 不要になったら要削除
* なお掲載用の参考版なので各自改変してご利用ください.
*/

// 画像出力先 = 一時フォルダ以下
var dir = Path.Combine(Path.GetTempPath(), "MorphImageOut");
if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); }

// 有効ファイル名判定用
var invals = Path.GetInvalidFileNameChars();
Func< /*このコメントはブログの表示が変になるため(元ソースには何もありません)*/
string, bool> checkName = (string name) => { return name.IndexOfAny(invals) < 0; };

// TransformViewは表示しておく
var tv = connect.View.TransformView;
tv.Visible = true;

// 変形はリセット
tv.ResetTransform();
// 個別モーフ確認をON
tv.MorphChecker = true;
int c = 0;
foreach (var m in pmx.Morph) {
try {
// "m[番号(4桁)]+_[モーフ名]" / 無効な場合は番号のみ
var path = Path.Combine(dir, "m" + c.ToString("0000") + (checkName(m.Name) ? "_" + m.Name : ""));
// モーフ対象を選択 → 変形適用
tv.SelectedMorphIndex = c;

// TransformViewの画面を取得し保存 | このjpegは画質が悪いので注意
path = Path.ChangeExtension(path, ".jpg");
tv.GetClientImage().Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch {
// 掲載用なのでここではスルーしておく
}
c++; // カウンタを進める
}

// モーフ確認をOFF
tv.MorphChecker = false;
// 対象フォルダを開く
System.Diagnostics.Process.Start(dir);



以上


posted by - at 02:30| PMX | 更新情報をチェックする

2018年06月26日

小ネタ (PMXエディタ)

たまには小ネタでも。内容的には今更な話ばかりですが、何故か未だに周知されていない不思議...

■ パーツ選択表示
まずはダメパターンから
●チェックリストからポチポチやる
0102.jpg

リストから一つ一つ探すのは非常に効率が悪い操作です。リストチェックから選択するのは "対象が判明している場合" だけにしておきましょう。

※PMXエディタは OS標準の(古い) UIを使って全て実装していますが、チェックリストUIはあまり触りたくない標準UIです (イベント挙動が謎?/カスタマイズが面倒etc)

●推奨操作1
0103.jpg

面選択を使った昔ながらの絞り込み方法。面の選択により対象材質の確認もすぐにできます。複数材質でも問題ありません。

●推奨操作2
0104.jpg

最近の PMXエディタなら対象面は選択頂点でも反応します。[除]→[反] は Shift+なら一度の [除] 操作だけで OKです。こちらも複数材質でも問題ありません。

※そもそもの話、MMDでの描画パフォーマンスを最適化するなら、材質数はできるだけ少ない方が望ましいです。PMXはエディタでの仕様上、材質をパーツ単位として個別に取り扱えるようにしていますが、本来は細かく分ける必要はありません。エディタの基本機能でも [同一材質の結合] などが用意されているので、テスクチャUVや透過判定等問題なければ (リリース時などに) 結合して最適化しておくとよいでしょう。


■ 選択補助

0105.jpg


■ 視点操作設定の場所 (カメラリセット関連など)

0106.jpg

視点操作関係は右上操作アイコン内から表示されるメニュー内 (右クリック) に配置されています。通常のメニュー内にあるのは回転中心関連だけなので、リセットや操作ロックなどはこちらから設定する必要があります。


■ ボーン系列選択

0107.jpg


■ 100%ウェイト設定

0108.jpg

ユーザー方の動向を見ていると "ウェイトは塗るもの" みたいな固定観念をたまに感じますが、別にそんなことはないです。

単一ボーンへの全振り(100%)ウェイトなら、対象の頂点/ボーンを双方選んで Ctrl+M を押すだけで完了します (PmxViewメニュー:[ウェイト関連]-[選択頂点を近位置ボーンでウェイト設定]-[ボーン軸基準])

一々ウェイト描画状態にして → ボーンを選択して → 頂点を範囲ドラッグ... みたいな面倒な基本操作を経由する必要はありません。

対象ボーンが選択しづらい場合は絞込み表示や、本体リストからのボーン選択 (View側がボーン選択不可でも選択可) などを併用するとよいでしょう。


■ ボーン軸ウェイト設定

0109.jpg

ボーン軸ウェイト設定 (Ctrl+M) で複数のボーンが選択されていた場合は、ボーン列からできる空間軸にしたがってウェイトが自動配置されます。

※元々の機能がこっちで、全振りはそれを特定状況で利用している形です。

機能としては、腕や指、髪などの円筒状に対して系列ボーンが内包されるような形状を想定しています。さらにこの状態から接合部に対してのブレンド描画([>>>])で、ざっくりとウェイト設定ができるようになっています。

0110a.jpg

0110b.jpg


とりあえず動けば十分、という程度のウェイト付けならこの手順だけで OKです。

●ブレンド描画 :
指定範囲の開始位置と終了位置に一番近い頂点のウェイト (と指定方向) を基準にして、範囲内を連続的な混合ウェイトに設定します。

画像の例だと 水色と青 がそれぞれ 100%で交差している範囲を指定しているので、互いが 0〜100% になるような、なだらかなウェイト変化に設定されます。

100%ウェイト以外でも使用できますが、あまり望ましい結果にはならないと思います (想定は、ボーン軸ウェイト設定との組み合わせで簡素なウェイト設定が楽にできるように、という程度)

なお、同 [>>>] 枠内の [ウェイト範囲] と同じように、指定位置によっては意図しない頂点に編集が及ぶことがあるので、その場合は絞込みや選択頂点によるマスキングなどで対応する必要があります。ブレンドの場合は対応ボーンが異なっていれば一応大丈夫なはずではありますが...


■ 2ボーン同時ウェイト描画

2ボーンウェイト (BDEF2) の場合、下地を 1ボーン分塗って、次のボーンにしてさらにウェイトを上から塗って... とか、そういう旧来の編集方式に従う必要はありません。

0111.jpg

元々 BDEF4用として拡張した機能ですが、ウェイト値を直接指定できるケースはこの機能だけでだいたい賄えます。

最近の PMXエディタなら各部位のボーン選択は以下のような仕様になっています (ボーンリスト欄上での右メニューから Indexコピーでも選択可)

0112a.jpg

0112b.jpg


■ モーフ編集時のアーカイブ利用

モーフ編集方式変更後、アーカイブが利用できなくなった? という話をどこぞやで見た気がしますが、特別に考える必要もなく単に本体側のアーカイブ機能を使えばいいだけです。

モーフ編集や変形同期など、PmxViewの現在の状態が特定の編集状態になる場合、本体側の操作は "その編集状態に対して適用される" という仕組みです。

0113.jpg



とりあえずこんなところで...(キリガナイ

エディタ関係の使い方を調べても古い時代 (PMDエディタ) の情報が真っ先に出てきてしまい、後に効率化された機能 (PMXエディタやプラグインなど) への更新はなかなか進みません。

まあ編集ツールに限った話ではありませんが、個別の機能ヘルプをネットの検索システムに頼る弊害の一つかもしれませんね。

なおエディタに限らず、やたら古いverで TIPSや機能解説をしている場面がたまにありますが、正直意図がよくわかりません。情報を発信する前にそのときの最新版なのか確認した方がよいでしょう (特に過去版に対して悪態なんかついていたりすると...)


以上

posted by - at 20:17| PMX | 更新情報をチェックする

2017年10月29日

0254

■更新内容

・仮想軸モード
・仮想軸表示
・オブジェクト操作機能の改定
・TransformViewの一部機能更新

以上


基本的な編集機能の拡充/改変は正直あまりやる気ないんですが、Switchが(店頭で)全然買えなくてアレなのでその腹いせに... (Switch版の繋ぎ目的で買った3DS版FE無双もそろそろコンプしてしまいそう)

というわけで謎な編集機能がまた一つ増えました。

●仮想軸

いわゆるローカル軸?的な編集仕様です。なおボーンのローカル軸設定などとまぎらわしいので用語は変更。

とりあえず PmxViewのハンドルアイコンの右に [v軸] というのが増えているので、ONにしてボーンや剛体などを選択してみるとよいでしょう。

仮想軸モード中はハンドルや子窓内の操作が指定した軸でおこなわれます。各オブジェクトの選択時に自動的に軸設定をする機能もあります。

----
・主な自動設定形式
[対象が単数]
頂点 : 法線
面 : 面法線(複数面の場合平均方向)
ボーン : 表示先(無効な場合親方向) ※設定で制限軸やローカル軸にも変更可
剛体/Joint : 対象の向き

[同一形式の対象が2つ]
対象位置を結ぶベクトル方向

[それ以外(3対象以上や混在状態など)]
実軸方向
----

その他、軸の任意設定や詳細などは [動:オブジェクト操作] 子窓の下に [軸指定] というタブが増えているのでそちらから。

一応、軸向きはハンドルの回転部分や子窓の回転操作(ドラッグ/値設定)を Altキー併用で操作することでも変更可能です(仮想軸モード時のみ)

仮想軸を表示(ドラッグ移動可)すると Z軸が逆方向になっているのが気になる方もいるかもしれませんが、MMDや PMXエディタに多少の造詣があれば理由はおのずと解るでしょう。

●オブジェクト操作機能の改定

ドラッグ操作欄(SRTタブ)の回転の順序が上から [X][Y][Z] に変更されています。合わせてドラッグ操作が横方向に統一(基本は右が+/左が- ただし標準状態はハンドルの操作方向に合わせて適宜変更されています)

従来は軸(XY)が画面の横/縦に対してほぼ同じ向きあることから操作感を合わせていましたが(それゆえ横方向操作に相当する Y軸回転が上側配置)、仮想軸の導入で対応関係も意味をなさなくなったので、リセットして全項目を同一の操作方法に変更しました。

※以前の配置及び操作方向に戻すことも一応できますが(操作子窓上でCtrl+Rなど) 推奨はしません。

Shift/Ctrl/Alt キー併用による操作もいくつか変更になっています。詳細はドキュメントを参照してください。

※値指定のボタン上で Shiftや Ctrlを併用した右クリックを行うと対象項目の初期化などが以前からできましたが、
・初期化が Shiftから Ctrlへ変更
・旧Ctrl併用の負数変換が破棄(負数(逆方向)設定は操作時のShift併用へ移管)
となっているのでご注意ください。合わせて他の同系入力でも Shift/Ctrl併用操作などが変更になっているものがあります。

といってもまあ 「そんな機能があったことをそもそも知らん」 という方がほとんどでしょうが...

●TransformViewの一部機能更新

各変形操作をオブジェクト操作子窓と同系統に設定。ドラッグ方向は上下のままですが、初期化やオフセットのShift+/Ctrl+などは変更されています。

他にメニューに、

[ローカル軸無視] : ハンドル向きにローカル軸設定を反映しない
[ベクトルコピー(クリップボード)からボーン位置設定] : ベクトルコピーによる選択対象ボーンへの位置設定

などが増えています。ボーン位置設定はうまく使えばパーツ合成時の位置合わせなどが多少楽になるかも?(強制的に位置設定されるので割と簡単に不正な変形状態になりますが)


以上、今回の更新でした。


----
11/1 追記:
一部ドキュメントに不備があったのでこちらで先に訂正

■旧操作系(※非推奨機能)
誤) ドラッグ操作の回転が[Y][X][Z]になり、2段目のドラッグ方向が横方向になります。
正) ドラッグ操作の回転が[Y][X][Z]になり、2段目のドラッグ方向が方向になります。

他にも冒頭部をずっと直し忘れていたようですね。
●動作対象
誤) Windows XP以降(32bit/64bit) ※推奨環境(=開発環境)は Win7-64bit及び32bit
正) Windows XP以降(32bit/64bit) ※推奨環境(=開発環境)は Win10-64bit

あとドキュメント書き忘れで、ハンドルのメニュー(ハンドル上で右クリック)の最下部に [状態] というのが増えています(主に仮想軸関連用)

メニュー内にハンドル向きを XYZ角(度) で保存/復元できる項目があるので、一時的に仮想軸の向きを外部のテキスト欄(メモ帳など)で記憶しておくことができます。

※[動] の仮想軸機能だけだと軸向きを一時的に保存/復元するのはちょっと大変

■テキストコピペによるベクトルコピー利用

ベクトルコピー関連を使ったことのない方は馴染みがないかもしれませんが、ベクトルコピーにより複数値が外部のクリップボードにも同時に登録されています("1,2,3" みたいなカンマ区切り数値)

逆にテキスト欄から数値をコピーしてベクトルコピー対応欄の [クリップボードから〜] などからエディタ側に設定することもできます。

例えば仮想軸を Y軸 = 45度回転した軸 にしたい場合は、"0,45,0" とメモ帳などに書いてテキストコピー(必要なのは" "内) → ハンドルメニューから設定、とすれば手早く軸の設定が可能です。

※仮想軸を選択対象から指定値にしておかないと、次に別の対象に切り替えると軸が変わってしまいますけどね(要注意点)

他にもオブジェクトの位置設定(PmxView上でCtrl+V)などにも応用できたりするので 「こういう機能がある」 程度には知っておくとよいでしょう。


posted by - at 20:35| PMX | 更新情報をチェックする