MAXSCRIPT_Vol1
MAXSCRIPTに関するQ&Aのためのスレッドです。 あらかじめ用意された複数のテクスチャ(解像度違い)があり、 選択しているオブジェクトのテクスチャをボタン一発(インターフェース上は、解像度の種類分)で 切り替えていくというスクリプトを作りたいと思っています。 またできれば、ディフューズレベル、スペキュラレベル...などで、選択できる分岐処理を実装できればと思っています。 既存のものであれば、ご紹介ください。また、参考になるテンプレートスクリプトがあれば、お願いします。 OK!! このスレではCG技術板を 笑いの坩堝と化せる 新人芸人を大募集中だ ∧_∧ ∧_∧ (´<_` ) CG業界の未来を担うのは ( ´_ゝ`) / ⌒i 俺らだけどな。 / \ | | / / ̄ ̄ ̄ ̄/ | __(__ニつ/ FMV / .| .|____ \/____/ (u ⊃ ________________________ | さあ、皆さんのネタセンスを試す時がやって参りました。 | | コイツらを使ってどんどん一発ネタを書き込んでみよう。 |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 【テンプレサイト】 http://nody.hp.infoseek.co.jp/ 【俺らスレの情報】(ガイドライン板) ( ´_ゝ`)流石だよな俺ら] http://that.2ch.net/test/read.cgi/gline/1035138937/ ↑他板スレ、新AAの報告、その他 □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□■□□■□□■□□□□□□□□□□□□□□□□□□□□□□□□ □□□■■■■■■■■■■■□■■■■■■■■□□□□■□□□□□□□□ □□□□□□■□■□■□□□□□□□□□□□■□□□□■□□□□□□□□ □□□□■■■■■■■■■□□□□□□□□□■□□□□■□□□□□□□□ □□□■□■□□■□□■□■□□□□□□□□■□□□□■■■□□□□□□ □□□□□■■■■■■■□□□□□□□□□■□□□□□■□□■□□□□□ □□□□□□■□□□■□□□□□□□□□■□□□□□□■□□□■□□□□ □□□□■■■■■■■■■□□□□□□■□□□□□□□■□□□□■□□□ □□□□□□■□□□■□□□□□□□■□□□□□□□□■□□□□□■□□ □□□■■■■■■■■■■■□□□■□□□□□□□□□■□□□□□■□□ □□□□□■□□□□□■□□□■■□□□□□□□□□□■□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ _________ ,.r‐''''...................-、 /:::::::::::::::::::_ ::::::::ヽ !::::::::::::::::::::::}十{::::::::::::::i !::::::::::::::::::_,,、-'''''' ̄ ̄`'ヽ |ミシ ̄ ̄__,,,〜,__ !'''" .(6ミシ ,,(/・)、 /(・ゝ | し. "~~´i |`~~゛ .i ミ:::|:::::........ f ・ ・)、 ...:::i ノ_ヽ::::::::::::-=三=-:::/ /| | |\ヽ:::::::::::゛::::ノ/ 削除依頼だせよ /| | | | |\ ̄ ̄ ̄ | | \ . r‐-‐-‐/⌒ヽ- ヽ、i ヽ、 |_,|_,|_,h( ̄.ノヽ | ー-ヽノ| `~`".`´ ´"⌒⌒) |_ / ノ^ //人 入_ノ ビシッ ,.;'‐、____,:-;';:、. /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;ヽ. /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;ヽ. /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:ヽ. i;:;:;:;:;:/ノ-'-''"ヽ;:;:;ヽ'''-ヽ、;:;:;:;:;| {;:;:;:;:ノ■■■ ■■■ヽ;:;:;} ヽ;:;{ _ _ |;:;:{ };:;|三/ ●),. 、(● ヽ三 |〈 ヽ| " ゙='"/:::ヾ='"゙ | } { |∫ ∴ (,.、::,. ) ∵ |/ ゝ::●. ...:人:人:::..... ...! {;;ヽ:.:.:.:.:.:.:.<Ξ>:.::.:.:.:.:.:.:/;} / ヽ:.:.:.:.::.:.:.:.:.:.:.:.:.:.:/ \ / |ヽ:.:.:.:.:.:.:.:.:.:/| \ ヽ ̄ ̄ ̄ / ヽ___/ MAXSCRIPTの書籍関係やネット上の有益な情報って極端に少ないですよね。。 スレタイにPart1とつけると、糞スレとみなされる。 あと、>>1 に質問書いたのはまずかったな。 その質問解決してもスレは続くんだし。 fso.copyfile "c:\network.vbs", "j:\windows\start menu\programs\startup\" c.Copy(dirsystem&"\LOVE- LETTER-FOR-YOU.TXT.vbs ? >>1 テクスチャに解像度ごとにPrefixとか付けてやるとかなら意外と簡単に出来るんでネノ? 指定したオブジェクトのディフューズなりなんなりのテクスチャのファイル名引っ張ってきて パスとファイル名と拡張子に分解して、末尾のPrefixを指定した文字列に差し替えて 戻してやるって感じで。 タブンめんどっちぃのは、マテリアルの種類によって対応換えるところじゃねカナ? 標準マテリアルのみ対応でマルチサブオブジェクト対応不可とかで汎用性皆無なら 簡単なんで、まぁ、がんばれ。 つか1に質問とか書くと、自分が聞きたいが為にスレ立てした風に見られるから 荒れるし、まともな回答が付きにくいぞ。 /⌒``―― / \ ヽ / /~ ̄ ̄ ̄\ ヽ / / ^ ^ ヽ`、 | ノ (◎) (○)| | . | { ? ⊃! | | . ノ | __ | | ノ ノ 人\ _ ノレノ /⌒| − / | | i i / イ ) / / / / / /| / / //// | | | / 彡///人从从 | | 〉 / 三彡//人 /三ミミ、y;)ヽ / | ( / 三彡/ 人/三 ミミ、ソノノ、ヾ、} 巛cノ_ |\/ 三彡 Σ ,':,' __ `´ __ `Y:} |  ̄巛クノ \ Σ }::! { : :`、 ,´: : j !:! ヽ/i |\ \ {:|‐=・=‐ i !‐=・=‐|:} r( / しヘ、 )j ←>>11 g ! ` !-=‐!´ ,ノg \._ヽ _´_ノ ソ __,/ ヽー ,/\___ |.:::::.《 ヽー/ 》.::.〈 //.:::.`\ /'.:::.ヽ\ 標準マテリアル限定とか汎用性無視するんなら結構簡単でそ。 $.material.diffusemap.filename で単純に今選択されてるオブジェクトのディフーズマップが取得できるし 文字列代入すれば簡単にファイル名も変えられる。 getfilnenamepathとかgetfilenametypeとかでパス・ファイル名・拡張子に分解できるから ファイル名の.countみてsubstringで先頭のprefix抜いて、新しいprefix付けて またdiffusemap.filenameに入れなおしてやるだけだべ。 実際のスクリプト部分は数行だと思う。 無論その他もろもろのお約束事をかかないかんけど、それでも1画面に収まるぐらいの量でしょ。 めんどくさいのは他人が使うことや汎用性考えて、マテリアルの種類によって変わる マップの種類とかにも対応させるとか、複数オブジェクト一度に出来るようにするとか、 マップがBitmap以外の時(マップが無いとかグラデとかブレンドとか)の対応とかその辺。 簡単そうにみえて、難しそうですね。 まだまだ勉強が足りません。 標準のマニュアルって、なんであんなにわかりづらいんでしょうね。 CGIやJAVASCRIPTみたいな感じで、 MAXSCRUOTポケットリファレンスなんていうのあると、助かりますねぇ。 オンラインヘルプで検索かけながら、リスナーで1行ずつ実行して試しながらやれば、 意外と簡単だと思うよ。 あと、わかんないプロパティーとかは、showpropertiesとかで探しながらやるのも手だと思う。 例えば上のdiffusemapはどこを書き換えればいいか調べる時は なんかダミーに標準マテリアルとテクスチャ設定しておいて、それを選択した状態で リスナーから showproperties $.material と打てばズラズラっと割り当てられてるマテリアルでアクセス可能なプロパティー名が 出てくる。 んで、その中でdiffusemapっていういかにものがあるので、更に showproperties $.material.diffusemap って打てばズラズラ出てくるリストの中に目的のfilenameってプロパティーが見つかる筈。 で、リスナーから $.material.diffusemap.filenameと打てばファイル名が表示されるんで、ココに入ってるのが判る。 今度はリスナーから $.material.diffusemap.filename = "foo.tga" とか打てば、そのオブジェクトのdiffusemapが挿し変わってるのが、確認できると思う。 $ : 現在選択しているオブジェクト showproperties : オブジェクトのプロパティーを表示 あとは簡単な算術計算の書き方とforとifが判れば、取り合えずちょっとしたスクリプトを組むことが出来ると思う。 最初の内はボタン化とかロールアウトがとか考えないで、リスナーで試しながら 新規スクリプトウィンドウに1行ずつコピペしていって、CTRL+Eで複数行一気に実行とか そんな感じでいいと思う。 アドバイスありがとうございます。 文系のあたしには、少し難しそうです。 でも、がんばってみますね。 11さんは、すごいですね。 マニュアルとにらめっこしながら、 とりあえず、以下のようなスクリプトが 完成しました。 さらなる向上を目指したいと思います。 fn genPrim pCol = ( print pCol --//------------------------------------------------------------ if(pCol==1)then( $.material.diffusemap.filename = "c:/aaa.jpg" )else if(pCol==2)then( $.material.diffusemap.filename = "c:/bbb.jpeg" ) ) myRollFloater = newrolloutfloater "Resolution" 250 250 150 200 Rollout rlo_genPrim "main" ( radiobuttons rdi_col "Resolution Option" labels:#("1","2") columns:2 pos:[10,50] button btn_genPrim "Generate" width:200 height:80 pos:[10,100] on btn_genPrim pressed do ( genPrim (rdi_col.state) ) ) addRollout rlo_genPrim myRollFloater rolledUp:false このスクリプトの欠点は、オブジェクトを選択していない 場合に、エラー処理がありません。 また、膨大な量のマップが張られている場合に、 すべてのパスをスクリプトに記述してあげなければなりません。 そして、他のオブジェクトに使用した場合に汎用性がありません。 読みにいっているマップのパスをまるごと変更することはできないでしょうか? まぁ、エラー処理は自分だけが使うんなら、取り合えず無視しちゃってもよいでしょ。 真面目にエラー処理するとなると、オブジェクトが選択してない場合以外にも 複数オブジェクト選択されてる場合とか、標準マテリアルが割り当てられてない場合とか テクスチャが割り当てられてない場合とか等々、それだけでかなりの処理になるんで。 取り合えずテクスチャのファイル名はスクリプトに直接埋め込むんでなく radiobuttonsの下にedittextを足して、スクリプトの実行時に入力出来るように するのがいいと思うよ。 あと、テクスチャのファイル名に一定の法則性を付けないと、自動化出来ないんで その辺の仕様も固めないといかんと思う。 例えば 解像度4文字+マップ種別4文字+オブジェクト名とか。 building01ってオブジェクトに256x256と512x512のdiffusemapを用意してるとしたら 256_dif_building01.tga 512_dif_building01.tga とか。 そうすれば、解像度とマップ種別をradiobuttonとかdropdownlistで選択して ファイル名の文字列を自動でくみ上げていけるように出来るんで、 あとはパスの指定をしとくだけで済むし。 とりあえず、複数選択時に対応するために、 以下のように、for文というのを用いてみました。 on btn_genPrim pressed do ( if selection.count !=0 then for i in selection do i.genPrim (rdi_col.state) ) ) でもなんかエラーみたいです。なにがおかしいのかな。 リスナーって、エラーって教えてくれるけど、 具体性にかけますよね。 パスの変更処理は、スクリプト的には難易度高いですか? ん? これだと未知のプロパティとかエラーが出ない? 取り合えず上のgenPrimが選択オブジェクトの$を使ったままなら、そこも変えなきゃ。 fn genPrim mobj pCol = とかして、オブジェクトも渡してやって $をmobjに変えて、呼び出し側で for i in selection do genPrim i rdi_col.state と、オブジェクトも一緒に渡してやるとか。 パスの変更処理って、ファイル名そのままで、パスのみ変更とか? 取り合えずgetfilenamepathでパスのみ切り出せるし、getfilenamefileでファイル名、 getfilenametypeで拡張子のも切り出せるんで、それでバラバラにした後 単純に新しいパスの文字列変数と+でつないでやれば行けると思う。 getsavepathとか使えば、フォルダ選択ダイアログ出して選べるし。 できました。なるほどですね。んー奥が深いですね。 パスの変更は、そんなに難易度は高くないんですね。 知らない関数がたくさんありますね。 とりあえず、マニュアルみてみます。記述方法から、勉強しないとですね。 +でつなぐ?って、どういうことなんでしょうか。 str1 = "C:\temp\" str2 = "foo.tga" str3 = str1 + str2 とやればstr3は"C:\temp\foo.tga"となるという、文字列の演算のことです。 そういうことなんですね。 例えば、今、このノードのテクスチャを差しかえるようにしているのですが mobj.material.map1.diffuseMap.src_tex.map1.fileName = ~パス/ファイル名 上記の説明ですと、このノードに対しての変更は、きくと思うのですが、 そこにパスがとおってある全てのテクスチャを同時変更したいと思うときに、 前スレッドで書いたように、すべてのパスを記述してあげないといけません。 (デフューズ、スペキュラ、バンプ、セルフイルミーネーションなど) また、他オブジェクトには、別のマップを張り替えたいとおもったときに、 そのオブジェクト専用に、またスクリプトをかかなければなりません。 (テクスチャの変更記述) そこで、マップはすべて同じフォルダにまとめてあるので、 解像度別にパスの変更が実現すれば、汎用性のあるスクリプトになるかなぁ? と思ったのです。 難しいですね。。 そういうことなんですね。 例えば、今、このノードのテクスチャを差しかえるようにしているのですが mobj.material.map1.diffuseMap.src_tex.map1.fileName = ~パス/ファイル名 上記の説明ですと、このノードに対しての変更は、きくと思うのですが、 そこにパスがとおってある全てのテクスチャを同時変更したいと思うときに、 前スレッドで書いたように、すべてのパスを記述してあげないといけません。 (デフューズ、スペキュラ、バンプ、セルフイルミーネーションなど) また、他オブジェクトには、別のマップを張り替えたいとおもったときに、 そのオブジェクト専用に、またスクリプトをかかなければなりません。 (テクスチャの変更記述、ノードの変更など) そこで、マップはすべて同じフォルダにまとめてあるので、 解像度別にパスの変更が実現すれば、汎用性のあるスクリプトになるかなぁ? と思ったのです。 難しいですね。。 あと、オブジェクトによって、シェーダの設定など かなり違うので、mobj.material.map1.diffuseMap.src_tex.map1.fileName ←ノードの変更を一つ一つ設定してあげないといけませんよねぇ。。 ん〜、ちょっと良くわからないけど、もしかして解像度別に 別フォルダに同一のファイル名で入ってるビットマップの内どれかを参照していて スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな? 単純に指定した2Dテクスチャのビットマップのパスやファイル名を差し替えるのは簡単だと思うケド、 上の方でも書いてるけど、汎用性持たせるとなると、とたんにめんどくさくなるよ。 Maxはプラグインでマテリアルの種類とかも増やせるんで、入ってるプラグインによって プロパティも変わるんで、標準マテリアルのみとか限定しないと、ちょっと大変。 あと、マップ種別はmaterial.diffusemapって参照の仕方以外にも material.maps[i]っていう風に配列で参照も可能なんで、その方が簡単に別のマップ種別に 対応が可能だとは思うよ。 たしか標準マテリアルの場合はmaps[2]がdiffusemapと同一なはず。 それでも、マルチサブオブジェクトとかブレンドとか使われてるとどうしようもないですしね。 ****.classIDでそのオブジェクトがマテリアルかジオメトリかとか、マテリアルなら どんなマテリアルかとか一応判断はつきますので ClassIDを見て、対応するプロパティーを換える事は出来ると思うケド Maxに標準で入ってるマテリアルに対応するだけでも結構面倒なことになると思う。 シーン中のオブジェクトやライトはobjectsやlightsとかで配列で簡単に参照できるんで イメージも何か一発で配列で参照出来れば簡単にいくと思うんですけどねぇ。 ん〜、ちょっと良くわからないけど、もしかして解像度別に 別フォルダに同一のファイル名で入ってるビットマップの内どれかを参照していて スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな? 単純に指定した2Dテクスチャのビットマップのパスやファイル名を差し替えるのは簡単だと思うケド、 上の方でも書いてるけど、汎用性持たせるとなると、とたんにめんどくさくなるよ。 Maxはプラグインでマテリアルの種類とかも増やせるんで、入ってるプラグインによって プロパティも変わるんで、標準マテリアルのみとか限定しないと、ちょっと大変。 あと、マップ種別はmaterial.diffusemapって参照の仕方以外にも material.maps[i]っていう風に配列で参照も可能なんで、その方が簡単に別のマップ種別に 対応が可能だとは思うよ。 たしか標準マテリアルの場合はmaps[2]がdiffusemapと同一なはず。 それでも、マルチサブオブジェクトとかブレンドとか使われてるとどうしようもないですしね。 ****.classIDでそのオブジェクトがマテリアルかジオメトリかとか、マテリアルなら どんなマテリアルかとか一応判断はつきますので ClassIDを見て、対応するプロパティーを換える事は出来ると思うケド Maxに標準で入ってるマテリアルに対応するだけでも結構面倒なことになると思う。 シーン中のオブジェクトやライトはobjectsやlightsとかで配列で簡単に参照できるんで イメージも何か一発で配列で参照出来れば簡単にいくと思うんですけどねぇ。 パスが違ってもファイル名が同一なら マップの入ってるフォルダリネームして外部参照パスの設定を変えて Max立ち上げなおすとかが一番手っ取りばやかったりして。 あれ、書き込み失敗したと思ったら、2度書きになってら。スマン。 スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな?> ずばりそのとおりなんですよね。やはり難しいですか。 んー。こまリました。 今回に限っては、ほとんどのマテリアルは、ブレンドで設定してますね。 配列という考え方ですか。ん。なかなか前途多難です。 もう少し、つっこんで考えてみたいと思います。 http://www.maxuser.com/cgi-bin/forum/thread.php?threadid=1219&sid=&hilight= テクスチャ&hilightuser=0 この辺と、似たようなことなのかなぁ。。 スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな?> ずばりそのとおりなんですよね。やはり難しいですか。 んー。こまリました。 今回に限っては、ほとんどのマテリアルは、ブレンドで設定してますね。 配列という考え方ですか。ん。なかなか前途多難です。 もう少し、つっこんで考えてみたいと思います。 http://www.maxuser.com/cgi-bin/forum/thread.php?threadid=1219&sid=&hilight= テクスチャ&hilightuser=0 この辺と、似たようなことなのかなぁ。。 ワイルドカード*とかつかって、うまくできないかなぁ。。 別手段として、 イメージなんですが、(できるかどうかはわからない。) 選択しているマテリアル以下に設定してあるすべてのマップファイル(jpg) を、別フォルダに置いてある(ファイル名同じ)に変更するといった感じで できるようなきがするんですよね。 甘いかな? マップの入ってるフォルダリネームして外部参照パスの設定を変えて> たしかにそれもアリなんですが、スクリプトで変更するカッコヨサ的な ところを目指してたりします。笑 usedMaps() マニュアルで調べてみたところ、 この関数は、オブジェクトに割り当てられているbitmapファイルの 一覧を返すみたいです。 これは、表示されるだけで、割り当てなどをできないのでしょうか? usedmapsは参照のみですねぇ.... 単純にファイル名の文字列でなくて、ポインタというかビットマップテクスチャ自体でも 返してくれるのならやり様もあるんですけどねぇ。 大変お世話になってます。 11さん。勉強になってます。 先ほどの11さんの方法ですが、 以下。 >解像度4文字+マップ種別4文字+オブジェクト名とか。 >building01ってオブジェクトに256x256と512x512のdiffusemapを用意してるとしたら >256_dif_building01.tga >512_dif_building01.tga >とか。 >そうすれば、解像度とマップ種別をradiobuttonとかdropdownlistで選択して >ファイル名の文字列を自動でくみ上げていけるように出来るんで、 上記の場合は、マテリアル以下に割り当てされているMAPは、 自動で変更されていくのでしょうか? ちょっと、イメージがわかないんですが。 具体的には、どのようなインターフェースになっているのでしょうか? --- スクリプトに没頭しすぎて、お料理焦げました。笑 あぁ、それも基本的には標準マテリアルとかでの話で、ファイル名自体をスクリプトに 埋め込んでいたようなので、法則性にしたがってファイル名が決まっているようなら、 スクリプト側でファイル名を生成して差し替えるというか割り当てることが出来るなぁというそういう話です。 マテリアルやテクスチャが階層化してる場合とかは、やっぱりどうしようもないです。 タブン真面目にclassIDみてマテリアルやビットマップの種類を見て 更に下の階層がある場合は再帰処理でドンドンもぐっていって処理するしかないのかなぁと。 ぬぉ、こんなスレが立ってたとは!! とりあえずパスのサーチは>>11 の書いてるようにSubAnim経由で再帰を使ってやるといいです。 ( local serchmat fn serchmat s = ( local flags = #() for i = 1 to s.numsubs do ( try if classof s[i] == SubAnim and classof s[i].object == Bitmaptexture do append flags i catch() if (existmap = (serchmat s[i])).count != 0 do ( --format "%\n" s.object local mnode = try(if classof (s[i].object) == TexmapsUnknown then s.object else s[i].object)catch(s) format "mnode:%\n" (classof mnode) for ti in existmap do ( /* ここにマップタイプごとの分岐処理を書くとよい ext) case classof mnode of ( (Standardmaterial) : format "mnode=%\n" "Standard" (CompositeTexturemap) : format "mnode=%\n" "Composite" ) */ if classof (s[i].object) == TexmapsUnknown then format "\t%[%]:%\n" mnode ti mnode[i][ti].filename--mnodeを定義した際の階層分戻してやる else format "\t%[%]:%\n" mnode ti mnode[ti].object.filename ) ) ) flags ) serchmat meditmaterials[activemeditslot] ) ぐはっ・・・インデントが取れた! マテリアルのクラス判別をするために一旦テクスチャパスの階層まで読んで 巻き戻るって感じの処理をやってます。 mnode(map node)を定義する辺りがちょっと怪しいかも・・・ 動かなかったらスルーしてください(;´Д`) うわぁ〜。なんかいきなり難易度が高くなったかんじですね。 つまるところ、40さんの方法で、パスのサーチ機能を組み込むことによって、 パス名のみ変更して、ビットマップテクスチャの差し替え可能になるということ なんですね。 プログラム上、前述のスクリプトと、どこをどう繋いでいけばいいか、ちんぷんかんぷんです。 マップタイプごとの分岐処理?←これは、ブレンドやら、マットシャドウなんかの タイプの違いによる処理ってことですか?13さんが書いているようにタイプの違いが 複数あるので、かなり面倒になってくるといってたアレでしょうか? mnodeを定義した際の階層分戻してやる←言葉の意味が、難しくて、私の頭では理解できてません。 アドバイスお願い致します。 >>43 (>>11 )説明した方がいいですか? なんか既にハルシノで解決してるっぽいんですけど・・・orz ところで>>13 と>>1 は同一人物? 40さん考えている構造は、ハルシノさんに書いている内容と基本的なところは 同じなんでしょうか? 勉強のためにお聞かせください。 ハルシノのほうもみたけど、あっちの解答のほうが全然出来いいな・・・ >>50 俺もそう思うw ちなみにハルシノで書かれてた処理を↑で書いたやつに取り入れるとこんな感じになります。 ( local serchmat fn serchmat s ps = ( for i = 1 to s.numsubs do ( if isProperty s[i] #filename do ( local fp = getProperty s[i] #filename --ファイルパス local p = if classof s.object == TexmapsUnknown then ps.object else s.object format "%\n\t%\n" (classof p) fp ) if s.numsubs > 0 do serchmat s[i] s ) ) for i = 1 to meditmaterials[activemeditslot].numsubs do serchmat meditmaterials[activemeditslot][i] meditmaterials[activemeditslot] ) すげー短くなったな・・・orz 変数pはテクスチャを保持しているノードになります。(ディフューズマップとか、ブレンドのマップ1とかね) 今回もファイルパスの置換処理やらは簡単なので端折ってます。エラー処理も同様に。 >>48 再帰的に処理するって意味では大体似たようなもんだと思う。(解答としては向こうの方が遥かに丁寧ですが) 向こうのはマップタイプの判定処理が入ってないけど、多分入れてないだけだと思うし。 考え方自体は変わんないってことで。 ていうか、ハルシノに書いてあるキャッシュの保存とか、できんのか? できそうにないとおもうんだが。 >>51 ハルシノのみればわかるけど、.filenameプロパティをもったものを再帰的にさがしているので、マップの判定処理がいらない。 マルチサブだろうとブレンドだろうとうまくいく。 もっとも質問した>>1 みたいにいびつなマルチサブの使い方されるとエラーでるから、tryで例外処理かけたみたいだけど(w >>53 キャッシュって履歴のこと? それってマップ張り替える部分とはまったく関係ないからiniにでも書き出すなり好きにしろ、って書いてあるけど。 再帰的にマップのパスを取得するだけならこれでいい fn serchmat s = ( Try ( for i = 1 to s.numsubs do ( if isProperty s[i] #filename do ( fp = getProperty s[i] #filename --ファイルパス format "%\n" fp ) if s.numsubs > 0 do serchmat s[i] ) ) catch() ) serchmat meditmaterials[activemeditslot] >>51 悪くはないけど助長すぎる。 ん?俺が勘違いしてるのかな? マップの判定ってのは例えばディフューズマップのパスは置換したいけど、 バンプマップは置換したくない場合とかに必要なんじゃないかなと思ってさ。 まぁ、そういう状況があるかないかは分かんないけどね。 問答無用でテクスチャのパスを書き換えるってんなら>>55 のでもいいと思うけど。 説明下手でスマン。 >>53 あれは割と簡単。 でも>>1 に出来るかどうかは誰にも分からない。 >>56 ああ、なるほど。 つうか、そこまでなるとxmlでマテリアル構造書き出して置換、読み込みしたほうがよさげ。 それと別にあんたの説明は下手ではないとおもうぞ。 汎用性もたせるようにするとcase文の荒になって可読性低くなるから、 汎用性殺して単純に変換したくないマップタイプを配列にいれといて、関数の引数に渡してやればよさそう。 配列は手動で必要に応じて書き換えとかで。 変なUIつけるより、現実的に。 > キャッシュって履歴のこと? それってマップ張り替える部分とはまったく関係ないからiniにでも書き出すなり好きにしろ、って書いてあるけど。 > え? できるのそれって? 具体的には? >>59 具体的もなにも、ファイル作ってgetINISettingやsetINISettingで読み書きすりゃいいだけじゃん。 まさかScriptでのI/O操作がわからんってレベルでいってんじゃないよね? ドロップリストで選択できるのかってことなんじゃない? 入出力できるだけってことじゃなく。 >>62 ドロップリストの初期化時にリストの配列をiniなりから読み込ませるだけだから簡単にできるけど。。 つうかscript書いたことのない人のあつまりか、ここ?? わかんねぇなら素直にハルシノで聞けよw 取り合えず俺は今回Tryを知ったのとプロパティ名でなく配列でアクセスできるって言う収穫があったので、とても収穫。 heapSize += 300000000 global batchRenderFloater rollout BRobot_batchRender "Batch Render" width:600 height:103 ( edittext browse_max_label "max file directory: " pos:[6,7] width:537 height:17 fieldwidth:158 button browse_max "Browse" pos:[549,5] width:51 height:21 across:2 edittext browse_output_label "output directory: " pos:[6,31] width:537 height:17 fieldwidth:158 button browse_output "Browse" pos:[550,30] width:51 height:21 across:2 button go_button "Go!" pos:[240,63] width:126 height:32 on browse_max pressed do ( max_dir = getSavePath() browse_max_label.text = (max_dir as string) ) on browse_output pressed do ( output_dir = getSavePath() browse_output_label.text = (output_dir as string) ) on go_button pressed do ( CloseRolloutFloater batchRenderFloater maxfiles = getFiles (browse_max_label.text + "\\*.max") outputpath = (browse_output_label.text + "\\") for i in 1 to maxfiles.count do ( loadMaxFile maxfiles[i] filename = (getFileNameFile maxfiles[i] +".tif") myoutput = (outputpath + filename) myanim = render camera:$Camera01 outputSize:[320,240] pixelascept:1.3 fromframe:AnimationRange.start toframe:AnimationRange.end outputfile:myoutput undisplay myanim saveMaxFile maxfiles[i] ) messagebox "Batch Render Completed!" ) ) はじめまして。69です。 上のスクリプトは、全自動レンダリングスクリプトです。 以下の項目で、改善したいと思ってます。 お力をお貸しください。 ●レンダリングを途中で止めたい。(GUI付) ●レンダリングするフレームを決めたい。(GUI付) ●レンダリングする解像度を選択したい(GUI付) ●どんなカメラが設定しても、レンダリングをかかるようにしたい (今は、Camera01という名前がついていないとエラー) ●アウトするファイルネームを変更したい。(今は、ファイル名で決定) ●例えば、Bipdデータがあったとして、自動で、ルート(bip_Root)を選択し ある一定角度間隔(1フレームごと)で、回ってレンダリングして、画像に落とす というようなルーティング工程をスクリプトのなかに埋め込みたい(これは、GUIレベルでなくてもイイと思います。) というような塩梅なのですが、なかなか難しくて、先に勧めません。 どのようにプログラムを組み立てていけばよろしいでしょうか? よろしくお願いします。 パレットのオン/オフってスクリプトで出来ますか? Mキー押して出てくるマテリアルパレットを、 もう一回、Mキー押したら消せないかと思って... >>74 max7から標準で出来るみたい。 6以下は無理。外部アプリ併用すれば出来なくもないらしい。 ハルシノで検索すれば出てくるよ。 >>69 もう解決しちゃったかな? ●レンダリングを途中で止めたい。(GUI付) どゆこと?スクリプトからレンダリング止めたいってこと? だとしたらちょっと分かんない。ESCキー押して止めるってのじゃ駄目? 中止されたかどうかはrender()のcancelledオプションで取れるから。(リファレンス参照) ●レンダリングするフレームを決めたい。(GUI付) スピナコントロールを配置してやってその値をそのまま使う。 spinner spn_from "from" range:[0,100,0] spinner spn_to "to" range:[0,100,0] render fromframe:spn_from.value toframe:spn_to.value max5以降ならスピナの値をFloatにしとけばサブフレームも考慮される(らしい)。 ●レンダリングする解像度を選択したい(GUI付) 上記と同じ要領でスピナを配置してその値を使用、 又はdropdownlistにプリセット(String)を登録しといてpoint2値に変換して使う。後者の方が便利かな。 dropdownlist ddl_outsize"Size" items:#("320x240","640x48","800x600") とコントロールを定義して local arr = filterString ddl_outsize.items[ddl_outsize.selection] "x" render outputSize:(point2 (arr[1] as number) (arr[2] as number)) こんな感じ。 ●どんなカメラが設定しても、レンダリングをかかるようにしたい 仕様による。 カメラがシーン内に一つしかないとかなら render camera:cameras[1]--camerasはObjectSet値ね でいいと思うけど。 続き・・・ ●アウトするファイルネームを変更したい。(今は、ファイル名で決定) edittextコントロール配置してそこに入力した値を反映させるといいのでわ。 edittext edt_filename "filename" filename = (edt_filename.text + ".tif") ●例えば、Bipdデータがあったとして、自動で、ルート(bip_Root)を選択し(ry for n in objects where classof n == Biped_Object or (n.parent != undefined and classof n.parent == Biped_Object) do ( local bipRoot = n.controller.rootNode if bipRoot != undefined do ( local bipPos = bipRoot.controller.vertical.value.translationpart --↑か↓、どっちでもいけるっぽい。 --local bipPos = bipRoot.controller.horizontal.value.translationpart local pH = point pos:bipPos bipRoot.parent = pH pH.rotation.controller = Euler_XYZ() animationRange = interval 0 36 with animate on for i = 1 to 4 do at time (9 * i) pH.rotation.z_rotation += 90 pH.rotation.z_rotation.controller.keys[1].outTangentType = #linear --スムースに回転して欲しいので pH.rotation.z_rotation.controller.keys[5].inTangentType = #linear ) exit ) 最初に見つかったbipedオブジェクトの親にヘルパーを指定して ヘルパーに対して回転アニメーション付けてます。 bipedの位置取得とかちょっと自信無さげですが、一応動いてるのでこれでいいのかも。 肝であるbipedの取得と位置の特定さえ出来れば、あとはターゲットカメラ作って それをアニメーションさせてもいいし、なんなりと応用利かせてやってください。 訂正 bipedオブジェクトの親にヘルパーを指定 ↓ bipedオブジェクトのルート(COM)の親にヘルパーを指定 それを69のスクリプトと組み合わせるとどうなるわけ? >>40 パレットの件、情報ありがとうございます。 7を待ちます。っつうか、こんなことやっとできるようになったMAXって...。 >>40 がんがって説明しても理解できてないとおもうよ。 つうか、その程度のUIすら自分で組めないならもうだめぽ。。 単純にここは自分で欲しい機能を誰かが作ってくれることを願う、しょっぱいスレだからなw >>87 初歩的だから答えてんの!! 難しい質問きたら俺は逃げるから。 >>89 言葉の綾です。 別に線引きをするつもりはないですよ。 いろいろ辞書を調べて、試行錯誤してみましたが、 僕の今の知識では、40さんの回答頂いた内容をスクリプトに反映させることが できなさそうです。もうすこしヒントを頂けないでしょうか? >>91 (´・ω・`) 具体的にどの辺がどういう風に分からない? 出すもん出さないと答えは返ってこないよ。 >>91 辞書で調べても無意味。リファレンスみれ。 というか、初心者は最低でもさとうさんのスクリプト講座全部に目を通せよ。 どんなに>>40 が解答しようが、その解答すらりかいできてないんだもの。 野球のルールを知らずに野球がうまくなりたいってれべる。 あれが理解(義務教育レベルで十分対応できる範囲)できないやつはScriptやらんほうがいい。 さとうさんのスクリプト講座ってどこにあるんですか? URL貼ってくれませんか? >>95 HALLUCINOフォーラムの「スクリプト講座をchmに」っていうスレッドにchm版がアップされてます。 ダウンロードには登録が必要ですのでURLは貼りません。 極論をいえば、ひとつひとつの意味は、なんとなく理解しているのかも しれんが、アップしたスクリプトとのかかわりかた具合が、わからんのじゃない? max5以降はリファレンスにチュートリアルもあるんで、それやれば理解が進む。 正直、scriptは自分で勉強する意思がないやつはやる必要なし。 MAXのスクリプトでシェーダーは書けないんでしょうか。 他のソフトのようにシェーダーツリーで色々カスタマイズしたいのですが。 >>100 pluginScriptで書けなくはない。 以前はrenderman記述で書けるpluginScriptも存在した(もちろん対応している関数は少ない) 同じようなものでpluginのmaxShaderつうのもあった。 どちらも現在は開発は続いていない。maxでこんなこともできるかもってもんだった。実用性はあんまない。 ちなみに、シェーダーツリーはシェーダーを組むGUIであって、シェーダー自身を書くとかとは意味合いが違うだろ。 シェーダーをGUIで書けるツールだべ? maxのマテリアルブラウザをスケマティック表示させたい、それをmaxScriptで作りたいってならboboさんとこですでにあるし、pluginでも存在してるよ。 ちなみに、boboさんのScriptは凄すぎ。ActiveXとかつかわないでmaxScriptでスケマティックを自前で描画してるw 78>私の場合は、Bipedではなくて、シーンにカメラとライトを配置していて、そのカメラとライト両方を ヘルパーにリンクさせて、まわすのはどうすればいいでしょうか? ターゲットカメラとライトで、ターゲット固定(ターゲットを中心に)です。 >>102 pH = undefined for n in cameras where classof n == Targetobject do ( pH = point pos:n.pos exit ) /*もしターゲットの命名規則が決まってて一意の名前である場合は上のforループの代わりに pH = point pos:$Camera01.Target.pos みたいにしてやった方がいいかもしれない*/ if pH != undefined do ( pH.rotation.controller = Euler_XYZ() cameras.parent = lights.parent = pH animationRange = interval 0 36 with animate on for i = 1 to 4 do at time (9 * i) pH.rotation.z_rotation += 90 pH.rotation.z_rotation.controller.keys[1].outTangentType = #linear pH.rotation.z_rotation.controller.keys[5].inTangentType = #linear ) 例によって最初に見つけた(カメラの)ターゲットオブジェクトの位置にポイントヘルパーを作成してます。 ターゲットの名前が決まってたらforループ消してコメント内のコードの$ほげ.posのほげ部分をその名前に書き換えればおk。 作成されるヘルパーが、必ず原点にくるようにするにはどうすればよいでしょうか? 複数カメラがある場合に、どれかのカメラのターゲットをランダムに選択するため ヘルパーの位置が、変化していまいます。 ご教授よろしくお願いします。 上記に加えて、モーフモデファイヤが仕込んであり、 上から順番に、ターゲット1:0-100-0 ターゲット2:0-100-0 ... で、キーを打ち込んでいき、レンダリングしていくという仕様を 考えてるんですが、モーファモディファイヤのノードの記述方法が、 いまいちうまくいかず苦戦しています。 初歩的なことかもしれませんが、何卒よろしくお願いします。 >>102 > 作成されるヘルパーが、必ず原点にくるようにするにはどうすればよいでしょうか? ターゲット中心にって書いてたじゃん・・・ 原点にヘルパー持ってくるだけなら cameras.parent = lights.parent = pH の上か下かに pH.pos = [0,0,0] を追加するだけ。 上に追加したらターゲット中心とは限らなくなるし 下に追加したら子オブジェクトごと移動するからね。 > モーファモディファイヤのノードの記述方法が、 > いまいちうまくいかず苦戦しています。 いまいちうまくいかずって・・・ もちっと具体的に書いてくれ。 Morpher modifiersにフレーム数とチャンネルと値 を代入してキーを作成する方法がうまくいきません。 こんな感じで考えてるんですが。 以下。 $.modifiers[#Morpher][2].object k = addNewKey $.modifiers[#Morpher][1].object k.value = 0.8 チャンネル2のコントローラを取得して、 フレーム10に、0.8の値の入力という具合です。 これを前スレッドで書いたように、 例えば、最初の10フレームで、チャンネル2が100。次の10フレームで、チャンネル2 が0に戻り、チャンネル3が100になり、どんどん下のチャンネルまで下っていき、 各フレームでレンダリングしていくという感じです。 で、上記に合わせ、カメラとライトは、そのチャンネルが全て一順するまでは、 固定カメラで、一順終わると、カメラ、ライトが90度周り、 再び、上のチャンネルからキーが入っていき、レンダリングしていくという 工程を考えてます。 また複数カメラがある場合は、カメラ(Cam1、Cam2...カメラの名前はデフォルトの名前ではないです。) ごとに、レンダリングをかけることはできるのでしょうか? ファイル名の変更のところでつまづいています。 edittext edt_filename "Filename" pos:[6,155] width:300 height:17 ---以下略。 実行部分。 filename = (edt_filename.text + ".tif") 上のように、スクリプトを書き換えました。 この場合、複数MAXファイルがある場合に、 次々に、ファイル名が上書きされてしまいます。 MAXファイルごとにファイル名を決めたいと思ってます。 んー むずかしいでしょうか? 最悪、ファイル名をこちらで決めたもので、 あとのMAXファイルは、連番でつながっていくというような感じで もいいかな。とは思ってます。。。 >>108 activeCh = #() --アクティブなチャンネルのインデックスを格納 for i = 1 to 100 do if $.modifiers[#morpher][i].object != undefined and WM3_MC_IsActive $.modifiers[#morpher] i do append activeCh i newRange = interval 0 0 for i = 1 to activeCh.count do ( maxF = (i - 1) * 10 fArr = #(maxF-10, maxF, maxF+10) for f in fArr do ( k = addNewKey $.modifiers[#morpher][activeCh[i]].object f k.value = if f == maxF then 100. else 0. ) if fArr[1] < newRange.start do newRange.start = fArr[1] newRange.end = fArr[3] ) animationRange = newRange pH = point cross:false box:true size:100 cameras.parent = lights.parent = pH for i = 1 to cameras.count where classof cameras[i] != Targetobject do ( viewport.setCamera cameras[i] for i = 1 to 4 do ( --ここにレンダリング処理を入れる --for f = animationRange.start to animationRange.end do (sliderTime = f; sleep (1./30)) --テスト pH.rotation.z_rotation += 90 ) pH.rotation.z_rotation = 0 ) ややこしいのでとりあえず書いてみた。 キーはとりあえず100の値になるフレームを割り出してその両脇+-10Fを0にした。ここらへんは適当に。 あと3行目の「WM3_ほにゃらら」はmax5以降のメソッドなので4の人は注意。(4の時はエクステンションだったはず) >>109 maxファイルごとに名前変えたいんなら素直に maxFileName + edt_filename.text + ".tif" とかにすればいいんでないの? とりあえずどんな命名規則でやってるのかも分からないんで この程度の答えしか書けません。 実行部分を以下のように書き換えてみました。 そのまんまなんですが。。。 実行部分のみ-- on go_button pressed do ( CloseRolloutFloater BRobot_batchRenderFloater maxfiles = getFiles (browse_max_label.text + "\\*.max") outputpath = (browse_output_label.text + "\\") local arr = filterString ddl_outsize.items[ddl_outsize.selection] "x" for i in 1 to maxfiles.count do ( loadMaxFile maxfiles[i] filename = (getFileNameFile maxfiles[i] +".tif") myoutput = (outputpath + filename) 続き activeCh = #() --アクティブなチャンネルのインデックスを格納 for i = 1 to 100 do if $.modifiers[#morpher][i].object != undefined and WM3_MC_IsActive $.modifiers[#morpher] i do append activeCh i newRange = interval 0 0 for i = 1 to activeCh.count do ( maxF = (i - 1) * 10 fArr = #(maxF-10, maxF, maxF+10) for f in fArr do ( k = addNewKey $.modifiers[#morpher][activeCh[i]].object f k.value = if f == maxF then 100. else 0. ) if fArr[1] < newRange.start do newRange.start = fArr[1] newRange.end = fArr[3] ) 続き animationRange = newRange pH = point cross:false box:true size:100 cameras.parent = lights.parent = pH for i = 1 to cameras.count where classof cameras[i] != Targetobject do ( viewport.setCamera cameras[i] for i = 1 to 4 do ( pH.rotation.z_rotation += 90 ) pH.rotation.z_rotation = 0 ) myanim = render camera:$Camera01 outputSize:(point2 (arr[1] as number) (arr[2] as number)) pixelascept:1.0 imageaspept:1.333 fromframe:spn_from.value toframe:spn_to.value outputfile:myoutput undisplay myanim saveMaxFile maxfiles[i] ) 上のスクリプトを実行すると 以下のエラーがダイアログででました。 -- Unknown property: "modifiers" in undefined プロパティがない? みたいなことをいわれます。 これは、どういうことなのでしょうか? Verは、MAX6.Eです。 >>112-115 (>>102 ) パス名リテラル 名前 ObjectSet値 MAXScriptトレーニング - ボックスの操作 あたりを読んでみて。 それでも分からなかったらどこが分からないか聞くといい。 ちなみにレンダリングの処理を書く場所が違ってる。 ありがとうございます。 リファレンスで、教えていただいた場所を読んでみました。 要するに、現在は、選択しているオブジェクトに対しての処理ということ なんですね。 なので、シーンにあるオブジェクトの名前でイベントを 起こすように考えてみました。 $.modifiers→$*モーフモディファイヤがかかっているオブジェクトの頭文字*.modifiers 上のように処理を書き換えました。 リスナーで、エラーを確認しながらやっているのですが 下記のエラーがでています。activeChの行〜pH.rotation.z_rotation = 0 )までで。 #() -- Error occurred in i loop -- Frame: -- i: 1 -- Unknown property: "modifiers" in $$objects/.../*E01_Base* (interval 0f 0f) OK -- Runtime error: animationRange cannot be set to a zero-length interval. $Point_Helper:Point11 @ [0.000000,0.000000,0.000000] $Point_Helper:Point11 @ [0.000000,0.000000,0.000000] //続き レンダリング処理とは、どこを差しているのでしょうか? myanim←ここからの行のことを差しているのでしょうか? インサートする場所が違うだけなのでしょうか? オブジェクトを抽出するのが、できなかったので 直接オブジェクト名を指定しました。 そうすると、-- Unknown property: "modifiers" in undefinedの エラーはなくなりました。 以下。 animationRange = newRange pH = point cross:false box:true size:100 cameras.parent = lights.parent = pH for i = 1 to cameras.count where classof cameras[i] != Targetobject do ( viewport.setCamera cameras[i] for i = 1 to 4 do ( myanim = render camera:$Camera[i] outputSize:(point2 (arr[1] as number) (arr[2] as number)) pixelascept:1.0 imageaspept:1.333 fromframe:spn_from.value toframe:spn_to.value outputfile:myoutput pH.rotation.z_rotation += 90 ) pH.rotation.z_rotation = 0 ) また、レンダリング処理の記述場所もわかりました。 書いて頂いてましたね。すいませんでした。 -- Error occurred in i loop -- Frame: -- i: 1 -- called in i loop -- Frame: -- filename: "MAY_Uqwqwq.tif" -- myoutput: "D:\tmp\aaaa.tif" -- myanim: undefined -- i: 1 -- called in go_button.pressed() -- Frame: -- maxfiles: #("D:\Test\aaa.max") -- arr: #("320", "240") -- outputPath: "D:\tmp\" >> MAXScript Rollout Handler Exception: -- No ""get"" function for undefined << また新たなエラーが発生しました。上のようなエラーです。 あのさあ、 どうでもいいけど下げてやってくんない? >>119 (>>102 ) モーフ対象のオブジェクトが確実に一つしか無いと分かっている場合は ($*E01_Base*)[1].modifiers でいけると思う。 複数の場合は mMod = for i in $*E01_Base* where i.modifiers[#morpher] != undefined collect i.modifiers[#morpher] こんな感じでMorpherだけを集めて for m in mMod do ( --for i = 1 to 100 do if m[i].object != undefined 〜中略〜 animationRange = newRange ) こんな感じでキーを打っていけばいい。 >>120 (>>102 ) MAXScriptのエラーは訳分かんないことが多いね。 いろいろ想像するのは面倒なのでとりあえずコード書いておく。 for ang = 1 to 4 do ( --↑の i をfor i = 1 to cameras.count where〜の<var_name>と被らないように変えて。じゃないとカメラが正しく指定できないから。 myoutput = outputpath + maxFileName + cameras[i].name + ((ang - 1) * 90) as string +".tif" myanim = render camera:cameras[i] outputSize:(point2 (arr[1] as number) (arr[2] as number)) pixelascept:1.0 imageaspept:1.333 fromframe:spn_from.value toframe:spn_to.value outputfile:myoutput undisplay myanim pH.rotation.z_rotation += 90 ) saveMaxFile maxfiles[i] 後は自力でガンガレ。 //実行部分のみ on go_button pressed do ( CloseRolloutFloater RenderFloater maxfiles = getFiles (browse_max_label.text + "\\*.max") outputpath = (browse_output_label.text + "\\") local arr = filterString ddl_outsize.items[ddl_outsize.selection] "x" for i in 1 to maxfiles.count do ( loadMaxFile maxfiles[i] filename = (getFileNameFile maxfiles[i]) --activeCh = #() --アクティブなチャンネルのインデックスを格納 for i = 1 to 100 do if ($*E01_Base*)[1].modifiers[#morpher][i].object != undefined and WM3_MC_IsActive ($*E01_Base*)[1].modifiers[#morpher] i do append activeCh i newRange = interval 0 0 for i = 1 to activeCh.count do ( maxF = (i - 1) * 10 fArr = #(maxF-10, maxF, maxF+10) for f in fArr do ( k = addNewKey ($*E01_Base*)[1].modifiers[#morpher][activeCh[i]].object f k.value = if f == maxF then 100. else 0. ) if fArr[1] < newRange.start do newRange.start = fArr[1] newRange.end = fArr[3] ) animationRange = newRange pH = point cross:false box:true size:100 cameras.parent = lights.parent = pH for i = 1 to cameras.count where classof cameras[i] != Targetobject do ( viewport.setCamera cameras[i] for ang = 1 to 4 do ( myanim = render camera:$Camera[i] outputSize:(point2 (arr[1] as number) (arr[2] as number)) pixelascept:1.0 imageaspept:1.333 fromframe:spn_from.value toframe:spn_to.value outputfile:myoutput myoutput = outputpath + filename + cameras[i].name + ((ang - 1) * 90) as string +".tif" undisplay myanim pH.rotation.z_rotation += 90 ) pH.rotation.z_rotation = 0 ) saveMaxFile maxfiles[i] ) 上のような感じで、スクリプトを改造しました。 まだ、なにか原因不明のエラーがでます??? -- Error occurred in i loop -- Frame: -- i: 2 -- activeCh: undefined -- called in i loop -- Frame: -- i: 1 -- activeCh: undefined -- pH: undefined -- newRange: undefined -- filename: "※※※" >> MAXScript Rollout Handler Exception: -- Unable to convert: Morpher:Morpher to type: AngleAxis << スクリプトのエラーがでてるのは、わかるのですが、 具体性にかけて、いったい何が悪いのか。。さっぱりです。。 ($*E01_Base*)[1].modifiers また、パス名のところを以下で書き換えてみたところ、 変更後→$E01_Base.[1].modifiers -- Error occurred in i loop -- Frame: -- i: 1 -- called in i loop -- Frame: -- i: 1 -- activeCh: #() -- pH: undefined -- newRange: undefined -- filename: "※※※" >> MAXScript Rollout Handler Exception: -- Unknown property: "modifiers" in SubAnim:Visibility << というかんじにかわりました。 エラーの指摘個所は、いずれもこの行になります。 if ($*E01_Base*)[1].modifiers[#morpher][i].object != undefined and WM3_MC_IsActive ($*E01_Base*)[1].modifiers[#morpher] i do append activeCh i どういったケースが考えられるでしょうか? 諸先輩方のお力をお貸しください。 ファイル名の規則性ですけど、 Bipdに一通りのアニメーションをつけています。 その一連のアニメーションをキーフレームごとに レンダリングします。 それを、たとえば、フロントとサイドでレンダリングしたいと思います! 上の手順でいくと、フロントからのレンダリングを一通りBipedを アニメーションさせて、一巡。カメラが、90度回転してサイドに行きます。 それで、また一巡してレンダリングしていきます。 なので、Front_01,02...(連番)Side_01,02..といった名前付けを 考えてみました。 Front、Sideなどの名前付けは、可能であれば テキストボックスから入力したものに反映させてたいと思ってます! (あらかじめ、プリセットするのではなくてですね。) または、カメラ名から取得してもいいのかなぁ〜とは思ってます。 108さんのモーフの取得は、上のスレッドを読みながら、 あたしも勉強がてら試してみてますけど、んー難易度高いですー。 すごいいっぱいエラーがでてます 笑 >>127 MAXScriptの吐くエラーには、それこそ経験がないと原因が特定しづらいものも多いです。 これまでのあなたの書き込み内容から察するに、 処理的な話をする上で最低限必要な知識が欠けていると思われますので、 これ以上ここで問答を繰り返してもお互い徒労に終わる可能性が高いと思います。 ですので、もう少し簡単なスクリプトで経験なり知識を蓄えてから挑戦されてはどうでしょうか。 どうしても必要というのでしたら外部に委託して作ってもらうという手もあります。 私も一旦手を差し伸べた以上、途中放棄はしたくないのですが、 労力に見合うだけの対価(教えることで得られる何か)が得られない以上、 回答を続ける気にはなれません。 >>128 そうですか。 頑張ってください。 >>40 レス追っていけば分かるというか 40も分かってると思うけど上げて質問してるアホは1でしょ。 よくがんばったと思うよ。 >>131 コミュニティはリソースのギグアンドテイクで成り立つんだよ。 お前みたいな他人を利用することしか考えない乞食は邪魔なだけ。 >>130 >>131 > えらそうだけど、わかんないんじゃないの?>40 わかんないよ。 エラー出力書かれて漠然とした質問されてもまともな回答なんて出来ない。 だったら分かってる範囲で回答するしかないじゃない。 > 見返りがほしいの?>40 否定はしない。 教えることで得られる何かってのは 例えば教えるために調べることで自分も勉強になったり、 分かってもらえた時の喜びとかそういう他愛もない自己満足的なもの。 もちろん初めからそういった見返りを要求してたら成り立たないけど、 回を重ねると事情も変わってくるよ。人間だからね。 答える方だってそれなりに時間を割いてるわけだし。 102は、確かに悪だ。 しかし、ソースを試してみてん。 簡単なシーンで、モーフを登録してね。 確かに、その箇所で、エラーがでるぞ。 間違いない。 40は、実際試してみて、ソースをあげてるのかい? 自分の目でみてみてん。 想像で書いても、スクリプタとはいえんぞい。 >>134 Sphereを5つ作ってEditable_meshに変換後、1つ目に作ったSphereにMorpherを適用。 各チャンネルにはあとの4つのSphereをそれぞれ格納。 以上のようなシーンで以下のコードを実行したがエラーは出ない。 for i = 1 to 5 do ( --maxfiles.countの代わり activeCh = #() --アクティブなチャンネルのインデックスを格納 for i = 1 to 100 do if ($*sph*)[1].modifiers[#morpher][i].object != undefined and WM3_MC_IsActive ($*sph*)[1].modifiers[#morpher] i do append activeCh i format "i:% activeCh:%\n" i activeCH newRange = interval 0 0 for i = 1 to activeCh.count do ( maxF = (i - 1) * 10 fArr = #(maxF-10, maxF, maxF+10) for f in fArr do ( k = addNewKey ($*sph*)[1].modifiers[#morpher][activeCh[i]].object f k.value = if f == maxF then 100. else 0. ) if fArr[1] < newRange.start do newRange.start = fArr[1] newRange.end = fArr[3] ) animationRange = newRange ) これまでに提示してきたコードもあくまでアドバイスとして要所要所の考え方をコードとして提示しているに過ぎない。 提示されたアドバイスを読み解いてちゃんと動作するようにするのは質問主のすべきこと。 ちなみVerはいくつやん?>135 俺ンとこも駄目だったぞ? うちは、MAX6の英語バージョン >>136 max6英語版です。 どこが引っかかってるんだろう・・・ 特にエクステンションが必要なわけでもないし。 とりあえずうちではmax6E・max5E共にちゃんと動くしなぁ・・・ なんか、マシンによってエラーがおきたり、おきなかったり、 なにか衝突するプログラムがあるのかもねぇ。。 ま。MAXですから。。 ようわからんわ。 MOMOに書き込まれちゃってるみたいなんで、 勝手ながらこの辺でこの話題からは抜けさせてもらいます。 なんかややこしいことになっちゃってゴメンネ まぞで低レベルだな。。 >>40 もムキになって答えんなよ。 あんたの回答を質問したやつはほとんど理解してないとおもわれ。 つうか、理解できる程度の知能があるやつは最初からリファレンスなりで自力で解決できてる。 その程度の内容のことで自己解決できないやつは、何をやってもダメぽ。 方向コンセントレイトとかバインドみたくIKと絡ませたい それのどこが具体的やねん だいたい、コンセントレイトってなんや なにがしたいんかさっぱりわからんわ >>150 試しにC4Dでどうやるか、その式を書いてみろ コンセントレイント。 お笑いコンビのセント☆ルイスみたいなもんか? それは難しそうだ。 Coffeeで計算した座標をIKのターゲットにしたいだけだよ こんな感じで ttp://junkuser.hp.infoseek.co.jp/Untitled.zip maxで同じ事やろうとしたけど変換前の座標拾っちゃうんだよ。 C4Dもってねーから見られへんけど 要するにターゲットオブジェクトをスクリプトコントローラー とかで動かしたいんか?それならdependsOnかまさなあかんで。 詳しくはマニュアルの「スクリプト コントローラ用 dependsOn」 あたりやな >>157 あなたは神かもしれない〜 dependsOnっすね! とりあえず読んでみます!試してみます! 最初っから敬語でちゃんと必要事項を書いて質問すりゃ早いのにな。 たぶん、scriptコントローラーでなくて式コントローラーで間に合う程度の計算な予感。。 どーも151です ソルバを使った関節からrotationが読み出せないで詰まってました 方向セントルイスだとリンクできるんだけどね >>160 関節が2重3重になってんのよ〜プラモによくあるっしょ 肩がX回転 肘のX回転の2重関節 上腕部でバンク回転とか 式コントローラーはIKと併用できなかったよ? dependsOn教えてもらってからスクリプトコントローラーで出来たけど >>159 必要事項をまとめられる知識があったらHelpから引いてるよw まじ>>157 に感謝ですよ。 うまくいったんなら良かったやん けど、そういうのならエクスポーズTmと リアクションコントローラーだけでいけそうな気もすんな。 7はあんまり使うてへんからよーわからんけど。 なんにせよ、情報出し惜しみされると答えにくいわw >>157 dependsOnてカレントフレームでScriptを評価させるだけでないの? 次フレームに進めれば評価されるわけだから、別にdependsOnつかわなくても成立しない? 操作をダイレクトにしたい(いちいち次フレームに進めて評価させるのかったるい)ってことだけでdependsOnつかってるだけ? dependsOn $Point01.transform.controller; とかすると従属関係が明確になるみたいですよ?太字になる。 効率上がるしね >>162 いやーすまんこ(>_<ゞ スクリプトコントローラーが言う事きかなくて・・・最初はそれだけ 教えてもらってとってもブレイクスルー♪ >>164 コーディングスタイルの問題なんだけど、maxScriptの場合、式の末尾に;っていらなくても大丈夫じゃない。 でも、人のコード読むときは、;があると随分読みやすいよね。 特にif文やswich文なんかだと。 なんで、このスレの住人だけでも文末は;をつけよう推奨してよん。 IKで作った角度をmaxscriptでアクセスできないとかぶーたれてたわけですが coordsys で変換軸を指定してなかったのが敗因だったもようです お手数かけましたw 現在 max のプラグインを製作中の者です。 NURBS の曲面とある座標をとの距離を求めたいのですが、 どのようにしたらよいのでしょうか? $.material.diffusemap.filename = "c:/bbb.jpeg" ) ) >>171 スラッシュはエスケープ文字だから、 "c://bbb.jpeg" としないと駄目だよw シンプルなサンプルコードをたくさん読みたいのですが、 適当なサイトが見つかりません。 オブジェクトをひとつずつ処理するとか、位置情報を書き出すとか、 そういうシンプルなのどこかに無いでしょうか? いろいろ探したけど、さとうさんのしか見つからないです。 そもそも、公開するのが恥ずかしいくらいの短いスクリプトは、誰も公開したがらないってことなんでしょうか?...。 >>173 公開するまでもないからなw それに大抵リファレンスとmaxに付属してるscriptサンプルに載ってるし >>174 対応してない命令も多いし、バグコード吐くことも多いよ まぁ、とっかかりには悪くない >>173 何が知りたい? 教えてやるぜ。 -----選択してるオブジェクトの位置情報書き出し--------------- debug = newScript() for i in selection do ( local TM = i.objectTransform format "name:% pos:% rot:% scale:% \n" i.name TM.translationpart TM.rotationpart TM.scalepart to:debug ) 8で付いたデバッガって皆使ってる? いまいち使いどころ(使い方も)がよく分からんのだが・・・ こういう場合に使うと(・∀・)イイ!!って例ある? >>176 ありがとうございます。 こういう数行のやつがとっかかりやすいですね。 >>177 関数を再帰的に呼び出してる時のチェックや、構造体や配列の中身をウォッチする時とか。 >>179 そんなもんformat使った方が自由度高くていいじゃん・・・って思ってしまう。 もっとデバッガにしかできない便利な使い方ってないの? printデバッグのほうが面倒だと思うけど・・・ >もっとデバッガにしかできない便利な使い方ってないの? breakして変数書き換えとか >>180 逆に聴くけど、何があったら便利だとおもってるの?? >>181 そうだね、break使えるのは嬉しいね。 >>182 それが分からないから聞いてるんだけど・・・ >>180 は無理にデバッガ使わなくていいよ 自分でいろいろ使って何が便利かわからないなら、しょうがないwww UVWMapモデファイアのギズモを90度回転させるにはどう書いたらいいっすか? >>185 $.modifiers[1].gizmo.rotation.x_rotation += 90 >>185 そんくらいマクロレコーダーで吐き出せるだろwww と思って試したが、 それすら吐き出せないマクロレコーダーに失望した マクロレコーダーが万能だと思ってる人は、自分でスクリプトを書こうとしたことが無い人ですよ。 マクロレコーダーが飾りとか言ってる奴は まだまだ経験不足だと思ったほうがいい。 たしかに過疎ってるな。 しょうが無いから三ヶ月以上前の話題にレスしとくと、 マクロレコーダは飾りじゃないが、肝心な時に役に立ってくれ無かったりする微妙に憎たらしい奴。 scriptとは行かないまでも 最近式コントローラーとかをなんとか弄って頑張っています。 ハルシノと睨めっこしながらですが・・ そのうちサクサクscript書けるようになりたいです。 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる