DAZスクリプトを使って、省力化したいなーと思ったので、ざっくり情報を集めてみた。
開発環境 IDEやVisual StudioでDAZ スクリプトの導入
IDE 統合開発環境
IDE(Integrated Development Environment)=統合開発環境。
スクリプトを打ち込んで、その場で実行できるものと考えておけばいいだろう。
DAZスクリプトは、QtScriptの拡張でDAZ StudioのAPIにアクセスすることで自動操作などをおこなえるそうだ。なんのこっちゃ。フィーリングはJavascriptに似ているっぽい。
DAZ StudioのWindow→Pane(tabs)→Script IDEから呼び出し可能。
デバッガがついていて、ソースコードをステップ・バイ・ステップで実行できる。(Debug→Debuggerまたは、Shift+F5でデバッガ起動)
サンプルスクリプトを1行づつ動かして、実際の画面の変化を確認して「このコードはこういう動きになるか…」って確認するのに役立ちそう。
Visual StudioでDAZスクリプトを開発
>DAZ Script開発環境の構築方法[DAZ Studio] – Qiita
本気で長めのスクリプトを作りこむ場合は、こういう環境の方がいいのかも。
TypeScriptというJavascriptの親戚みたいなコードで記述してから変換、という形を取るのだそう。
TypeScript慣れしている人用なのかな。
DAZ スクリプトの自作方法
とりあえず、こんな感じで、 (function(){ と })(); でコードを囲っておけば動くっぽい。
この書き方をなんと呼ぶのかとか、そういうことは知らない。
(function(){ //ここにコードを書くと動く })();
たとえば、選択状態のパーツから先端までを全て非表示にするスクリプトを当てはめてみる。
選択したパーツの子をすべて非表示にするサンプルスクリプト
参考)[DAZ] Script to hide all children nodes | F95zone ←メッチャエロ広告でるので注意
(function(){ var startNode = Scene.getPrimarySelection(); if ( startNode ) { var nodes = [ startNode ]; nodes = nodes.concat( startNode.getNodeChildren( true ) ); for ( var n = 0 ; n < nodes.length ; n++ ) { nodes[ n ].setVisible( false ); } } })();
これを、Script IDEにコピペして、Executeボタンをクリックすると動く。ファイル名.dsaでファイルに保存して、Content LibraryからダブルクリックしてもOK。
なお、setVisible( false )を、setVisible( true )に変更すると、指定パーツから先端までが表示状態に変更される。
設定したパーツのXRotateの最小値、最大値を設定するスクリプト
(function(){ var Node = Scene.getPrimarySelection(); control = Node.getXRotControl(); control.setMin(-50.0); control.setMax(50.0); })();
選択したパーツの、Xrotate(例えば手の場合はTwist)の最小値をー50、最大値を50に設定する。
値を表示するスクリプト
(function(){ var val = 10; print( "val=", val ); })();
スクリプト、というのもおこがましいが値を表示するには、print()を使う。カンマで区切ると、文字列と値を連結して表示できる。(ただし、何故か間に半角空白が入る)
メニューやライブラリからDAZ スクリプトを実行
Content Libraryに登録してダブルクリック
※Content Libraryの指す実際のフォルダは、右クリックして「Browse to Folder Location」を選ぶとエクスプローラーが開く。
開いたフォルダにスクリプトをコピーして、Refresh(再描画)を選ぶと、スクリプトが表示される。
アイコンは「アイコン画像がないよ」みたいなのが割り当てられてカッコ悪いけど、コレを解消するのは超面倒くさいので、気にせず使おう。
画面上部メニューからスクリプトを呼び出せるようにする
毎回Content Libraryなんて、使ってらんねー!
フォルダの迷宮で迷子になるわ!
というあなたは、メニューにスクリプトを登録することも可能だ。
なお、ここでSubmenuを選ぶと、メニューを階層構造にすることができる。
以下のメッセージが表示される。「指定したスクリプトのカスタムアクションが作成されました。Scriptsメニューから実行可能です」というような意味だ。
たしかに、画面上部のScriptsに、先ほどのスクリプトが登録されている。
登録済みのスクリプトをメニューから消す方法
▲DAZ Studioの日本語化を試していたので、表示が日本語になっているけど
Customize DAZ Studioウインドウが表示される。
と、いつでも消せるので雑に追加して色々試そう。
DAZ スクリプトのマニュアルや拡張子・関連情報
DAZスクリプトマニュアル
>Scripting [Documentation Center]
英語。最初にざっくり日本語翻訳しながら流し読みすればいけそう。
やっぱ流し読みには日本語がいいなぁ。
サンプルスクリプトも多数用意されてるので、チュートリアルがわりにIDEで動かしながらフィーリングをつかんでいきたい。
スクリプトの種別 dsa,dsb,dse
すごい種類ある。
File Extensions [Documentation Center]
DAZ Script2の拡張子に絞ると3つで、dsa、dsb、dseがある。
.dsaは、アスキー形式。テキストエディタで開いて読める。
.dsbは、バイナリ方式。読めない。アスキーに変換する方法もあるのか?
.dseは、encrypt(暗号化)された形式。
サンプルスクリプトやDAZスクリプトのソース公開サイト
DAZ Studioスクリプトはソースを見えなくする(.dse)ことも可能だが、.dsa形式だとソースが自由に見られてカスタマイズも可能。
ありがたいサンプルスクリプト配布サイトや、カスタマイズ例を紹介してみたい。
関節limit一覧表示などのスクリプト
>自作DAZ Script | lps da DAZ Studio user
lps da DAZ Studio userさんによる、公開スクリプト。
- フィギュアのパーツのリミット設定一覧表示
- 選択ノードの表示・非表示(子階層ごと)
詳細なスクリプトの解説も掲載あり。
Github(無料で使えるソースコード管理サービス)に、各種スクリプトが公開されているので、ありがたく見させてもらおう。
>lowpolysnow/DAZStudioScriptSet
ポーズコンバーター
旧フィギュア~最新フィギュア間でポーズコンバートができるスゴイやつ。
素晴らしい。
ランダムモーフ スクリプト
Daz3D Morphs Randomizer – Script – ShareCG
モーフパラメータをランダムに設定するスクリプト。実行するとパーツと、モーフのグループを指定するとランダムに値をセットしてくれる。
対象パーツを指定するコンフィグ画面と、ランダムモーフ実行用スクリプトの二本立て。
実際に動かしてみた例はこちら。軽いカスタマイズ例も。
アイテム表示・非表示 スクリプト
HIDE and SHOW – Daz Script(消滅してた!)
指定したアイテムが表示されてたら非表示、非表示だったら表示するスクリプト。透明度(Opacity)を変更するっぽい。
ランダム表情(Genesis) スクリプト
Genesis Expression Randomizer – Script – ShareCG
Genesis用のランダム表情。
大きな文字でパラメータパネル
DAZフォーラムに投稿されていたスクリプト。
「いつか、DAZ本体に実装されるといいんですけどねっ!」という希望と絶望の入り混じったコメント入りで公開されていた。
>A script to control a selected Property, with large font size, and Preview buttons – Daz 3D Forums
mcasualsdazscripts7 スクリプト集
一風変わったスクリプトが大量。遅延アニメーションコピーや、電撃エフェクト、パーティクルシステムなど有料級が大量に。(でも、全部無料)
遅延アニメーションで子豚を踊らせてみた使用例はこちらの記事にまとめた。
インストールフォルダの.dsaファイル
- C:\Program Files\DAZ 3D\DAZStudio4\resources
上記フォルダの.dsa(暗号化・バイナリ化されてないスクリプトファイル)を眺めているだけでも、ヒントになる…かも。
選択パーツのプロパティ(モーフ名など)の一覧を出力するスクリプト
Sceneタブで対象パーツを選んでから実行すると、対象パーツのプロパティをズラズラっと表示する。
/*********************************************************************/ // Array<DzProperty> : function getGroupProperties( oGROUP, bTRAVERSE, bRECURSE ){ var aProperties = new Array(); if( !oGROUP ){ return aProperties; } else{ const nPROPERTIES = oGROUP.getNumProperties(); for( var i = 0; i < nPROPERTIES; i++ ){ aProperties.push( oGROUP.getProperty( i ) ); } if( bRECURSE ){ aProperties = aProperties.concat( getGroupProperties( oGROUP.getFirstChild(), bTRAVERSE, bRECURSE ) ); } if( bTRAVERSE ){ aProperties = aProperties.concat( getGroupProperties( oGROUP.getNextSibling(), bTRAVERSE, bRECURSE ) ); } } return aProperties; } /*********************************************************************/ // Array<DzProperty> : function getNodeProperties( oNODE, bTRAVERSE, bRECURSE ){ const oPROPERTY_GROUP_TREE = oNODE.getPropertyGroups(); const oPROPERTY_GROUP = oPROPERTY_GROUP_TREE.getFirstChild(); return getGroupProperties( oPROPERTY_GROUP, bTRAVERSE, bRECURSE ); } /*********************************************************************/ const oNODE = Scene.getPrimarySelection(); if( oNODE ){ const aPROPERTIES = getNodeProperties( oNODE, true, true ); var oProperty, oOwner; for( var i = 0; i < aPROPERTIES.length; i++ ){ oProperty = aPROPERTIES[ i ]; oOwner = oProperty.getOwner(); if( oOwner.inherits( 'DzNode' ) ){ print( String( '%1 : %2 : %3' ).arg( oOwner.className() ).arg( oProperty.name ).arg( oProperty.getLabel() ) ); } else{ print( String( '%1 : %2 : %3' ).arg( oOwner.className() ).arg( oOwner.name ).arg( oProperty.getLabel() ) ); } } }
Getting the properties associated with a node. [Documentation Center]
出力例はこんな感じ。
Executing Script... DzFigure : XTranslate : X Translate DzFigure : YTranslate : Y Translate DzFigure : ZTranslate : Z Translate DzFigure : XRotate : X Rotate DzFigure : YRotate : Y Rotate DzFigure : ZRotate : Z Rotate DzFigure : Scale : Scale DzFigure : XScale : X Scale DzFigure : YScale : Y Scale DzFigure : ZScale : Z Scale DzFigure : Point At : Point At DzFigure : Disable Transform : Disable Transform DzFigure : Fit to : Fit to DzFigure : Fit to Mode : Fit to Mode DzFigure : FID_Genesis8Female : Figure ID: Genesis8Female DzObject : Genesis8Female : Geometry Switching DzFigure : BaseJointCorrectives : Base Joint Correctives DzFigure : BaseFlexions : Base Flexions DzGraftingFigureShape : Genesis8Female : Resolution Level DzGraftingFigureShape : Genesis8Female : SubDivision Level DzGraftingFigureShape : Genesis8Female : Render SubD Level (Minimum) DzGraftingFigureShape : Genesis8Female : SubDivision Algorithm DzGraftingFigureShape : Genesis8Female : Edge Interpolation DzGraftingFigureShape : Genesis8Female : SubDivision Normals DzFigure : SCLArmsLength : Arms Length DzMorph : PBMForearmsSize : Forearms Size DzFigure : SCLShldrsScale : Shoulders Scale DzMorph : PBMShouldersSize : Shoulders Size DzFigure : SCLShldrsWidth : Shoulders Width DzMorph : PBMUpperArmsSize : Upper Arms Size DzFigure : xCTRLAllArmsLower : All Arms Lower DzFigure : xCTRLAllArmsLowerAlt : All Arms Lower Alt DzFigure : xCTRLAnconeus : Anconeus DzMorph : xPBMAnconeusL : Anconeus Left DzMorph : xPBMAnconeusR : Anconeus Right DzFigure : xCTRLAnconeusAlt : Anconeus xAlt
DAZスクリプト厳選リンク
DAZとPoserのスクリプトWiki
Software/Scripts – Poser and Daz Studio Free Resources Wiki
大量。すでにやりたいことがスクリプト化されて公開されているかも知れない。sharecgにはお宝スクリプトがゴロゴロしているのかも。
目についたスクリプトをピックアップしておこう。
ShareCGのScriptのページ
ShareCGのDAZ Studio用ページ。
一部、dsa(テキストエディタで読める)形式のスクリプトが公開されている。
自作スクリプトへの第一歩 Geometry Shell生成サンプル
とりあえず、Geometry Shellの各パーツを自動で非表示にするスクリプトを作りたい。
Geometry Shellを生成するスクリプトをDAZ公式サイトで見つけたので、こいつをベースに作って行こうと思う。