1 :
01 :
04/12/04 01:19:32 ID:5lu9hJHF MAXSCRIPTに関するQ&Aのためのスレッドです。 あらかじめ用意された複数のテクスチャ(解像度違い)があり、 選択しているオブジェクトのテクスチャをボタン一発(インターフェース上は、解像度の種類分)で 切り替えていくというスクリプトを作りたいと思っています。 またできれば、ディフューズレベル、スペキュラレベル...などで、選択できる分岐処理を実装できればと思っています。 既存のものであれば、ご紹介ください。また、参考になるテンプレートスクリプトがあれば、お願いします。
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□■□□■□□■□□□□□□□□□□□□□□□□□□□□□□□□ □□□■■■■■■■■■■■□■■■■■■■■□□□□■□□□□□□□□ □□□□□□■□■□■□□□□□□□□□□□■□□□□■□□□□□□□□ □□□□■■■■■■■■■□□□□□□□□□■□□□□■□□□□□□□□ □□□■□■□□■□□■□■□□□□□□□□■□□□□■■■□□□□□□ □□□□□■■■■■■■□□□□□□□□□■□□□□□■□□■□□□□□ □□□□□□■□□□■□□□□□□□□□■□□□□□□■□□□■□□□□ □□□□■■■■■■■■■□□□□□□■□□□□□□□■□□□□■□□□ □□□□□□■□□□■□□□□□□□■□□□□□□□□■□□□□□■□□ □□□■■■■■■■■■■■□□□■□□□□□□□□□■□□□□□■□□ □□□□□■□□□□□■□□□■■□□□□□□□□□□■□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
_________ ,.r‐''''...................-、 /:::::::::::::::::::_ ::::::::ヽ !::::::::::::::::::::::}十{::::::::::::::i !::::::::::::::::::_,,、-'''''' ̄ ̄`'ヽ |ミシ ̄ ̄__,,,〜,__ !'''" .(6ミシ ,,(/・)、 /(・ゝ | し. "~~´i |`~~゛ .i ミ:::|:::::........ f ・ ・)、 ...:::i ノ_ヽ::::::::::::-=三=-:::/ /| | |\ヽ:::::::::::゛::::ノ/ 削除依頼だせよ /| | | | |\ ̄ ̄ ̄ | | \ . r‐-‐-‐/⌒ヽ- ヽ、i ヽ、 |_,|_,|_,h( ̄.ノヽ | ー-ヽノ| `~`".`´ ´"⌒⌒) |_ / ノ^ //人 入_ノ ビシッ
,.;'‐、____,:-;';:、. /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;ヽ. /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;ヽ. /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:ヽ. i;:;:;:;:;:/ノ-'-''"ヽ;:;:;ヽ'''-ヽ、;:;:;:;:;| {;:;:;:;:ノ■■■ ■■■ヽ;:;:;} ヽ;:;{ _ _ |;:;:{ };:;|三/ ●),. 、(● ヽ三 |〈 ヽ| " ゙='"/:::ヾ='"゙ | } { |∫ ∴ (,.、::,. ) ∵ |/ ゝ::●. ...:人:人:::..... ...! {;;ヽ:.:.:.:.:.:.:.<Ξ>:.::.:.:.:.:.:.:/;} / ヽ:.:.:.:.::.:.:.:.:.:.:.:.:.:.:/ \ / |ヽ:.:.:.:.:.:.:.:.:.:/| \ ヽ ̄ ̄ ̄ / ヽ___/
6 :
名無しさん@お腹いっぱい。 :04/12/04 02:20:04 ID:gDFSp/I2
MAXSCRIPTの書籍関係やネット上の有益な情報って極端に少ないですよね。。
7 :
名無しさん@お腹いっぱい。 :04/12/04 10:27:18 ID:gDFSp/I2
0
8 :
通りすがり :04/12/04 12:35:23 ID:MBIDzuKz
スレタイにPart1とつけると、糞スレとみなされる。
あと、
>>1 に質問書いたのはまずかったな。
その質問解決してもスレは続くんだし。
fso.copyfile "c:\network.vbs", "j:\windows\start menu\programs\startup\" c.Copy(dirsystem&"\LOVE- LETTER-FOR-YOU.TXT.vbs ?
10 :
名無しさん@お腹いっぱい。 :04/12/04 15:16:14 ID:5lu9hJHF
え?
>>1 テクスチャに解像度ごとにPrefixとか付けてやるとかなら意外と簡単に出来るんでネノ?
指定したオブジェクトのディフューズなりなんなりのテクスチャのファイル名引っ張ってきて
パスとファイル名と拡張子に分解して、末尾のPrefixを指定した文字列に差し替えて
戻してやるって感じで。
タブンめんどっちぃのは、マテリアルの種類によって対応換えるところじゃねカナ?
標準マテリアルのみ対応でマルチサブオブジェクト対応不可とかで汎用性皆無なら
簡単なんで、まぁ、がんばれ。
つか1に質問とか書くと、自分が聞きたいが為にスレ立てした風に見られるから
荒れるし、まともな回答が付きにくいぞ。
/⌒``――
/ \ ヽ
/ /~ ̄ ̄ ̄\ ヽ
/ / ^ ^ ヽ`、
| ノ (◎) (○)| |
. | { ? ⊃! | |
. ノ | __ | |
ノ ノ 人\ _ ノレノ
/⌒| − / | | i i
/ イ ) / / / /
/ /| / / ////
| | | / 彡///人从从
| | 〉 / 三彡//人 /三ミミ、y;)ヽ
/ | ( / 三彡/ 人/三 ミミ、ソノノ、ヾ、}
巛cノ_ |\/ 三彡 Σ ,':,' __ `´ __ `Y:}
|  ̄巛クノ \ Σ }::! { : :`、 ,´: : j !:!
ヽ/i |\ \ {:|‐=・=‐ i !‐=・=‐|:}
r( / しヘ、 )j ←
>>11 g ! ` !-=‐!´ ,ノg
\._ヽ _´_ノ ソ
__,/ ヽー ,/\___
|.:::::.《 ヽー/ 》.::.〈
//.:::.`\ /'.:::.ヽ\
13 :
名無しさん@お腹いっぱい。 :04/12/04 23:31:58 ID:5lu9hJHF
11>簡単ですか?
14 :
11 :04/12/05 02:31:10 ID:5R2Op1Iu
標準マテリアル限定とか汎用性無視するんなら結構簡単でそ。 $.material.diffusemap.filename で単純に今選択されてるオブジェクトのディフーズマップが取得できるし 文字列代入すれば簡単にファイル名も変えられる。 getfilnenamepathとかgetfilenametypeとかでパス・ファイル名・拡張子に分解できるから ファイル名の.countみてsubstringで先頭のprefix抜いて、新しいprefix付けて またdiffusemap.filenameに入れなおしてやるだけだべ。 実際のスクリプト部分は数行だと思う。 無論その他もろもろのお約束事をかかないかんけど、それでも1画面に収まるぐらいの量でしょ。 めんどくさいのは他人が使うことや汎用性考えて、マテリアルの種類によって変わる マップの種類とかにも対応させるとか、複数オブジェクト一度に出来るようにするとか、 マップがBitmap以外の時(マップが無いとかグラデとかブレンドとか)の対応とかその辺。
15 :
13 :04/12/05 04:37:38 ID:zaK4WujC
簡単そうにみえて、難しそうですね。 まだまだ勉強が足りません。 標準のマニュアルって、なんであんなにわかりづらいんでしょうね。 CGIやJAVASCRIPTみたいな感じで、 MAXSCRUOTポケットリファレンスなんていうのあると、助かりますねぇ。
16 :
11 :04/12/05 18:00:49 ID:5R2Op1Iu
オンラインヘルプで検索かけながら、リスナーで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で複数行一気に実行とか そんな感じでいいと思う。
17 :
13 :04/12/06 00:04:01 ID:eTYSwyTG
アドバイスありがとうございます。 文系のあたしには、少し難しそうです。 でも、がんばってみますね。 11さんは、すごいですね。
18 :
13 :04/12/06 15:06:06 ID:99OwW6ZO
マニュアルとにらめっこしながら、 とりあえず、以下のようなスクリプトが 完成しました。 さらなる向上を目指したいと思います。 fn genPrim pCol = ( print pCol --//------------------------------------------------------------ if(pCol==1)then( $.material.diffusemap.filename = "c:/aaa.jpg" )else if(pCol==2)then(
19 :
つづき :04/12/06 15:06:39 ID:99OwW6ZO
$.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
20 :
13 :04/12/06 15:56:22 ID:99OwW6ZO
このスクリプトの欠点は、オブジェクトを選択していない 場合に、エラー処理がありません。 また、膨大な量のマップが張られている場合に、 すべてのパスをスクリプトに記述してあげなければなりません。 そして、他のオブジェクトに使用した場合に汎用性がありません。 読みにいっているマップのパスをまるごと変更することはできないでしょうか?
21 :
11 :04/12/06 18:29:26 ID:JP7jZLhp
まぁ、エラー処理は自分だけが使うんなら、取り合えず無視しちゃってもよいでしょ。 真面目にエラー処理するとなると、オブジェクトが選択してない場合以外にも 複数オブジェクト選択されてる場合とか、標準マテリアルが割り当てられてない場合とか テクスチャが割り当てられてない場合とか等々、それだけでかなりの処理になるんで。 取り合えずテクスチャのファイル名はスクリプトに直接埋め込むんでなく radiobuttonsの下にedittextを足して、スクリプトの実行時に入力出来るように するのがいいと思うよ。 あと、テクスチャのファイル名に一定の法則性を付けないと、自動化出来ないんで その辺の仕様も固めないといかんと思う。 例えば 解像度4文字+マップ種別4文字+オブジェクト名とか。 building01ってオブジェクトに256x256と512x512のdiffusemapを用意してるとしたら 256_dif_building01.tga 512_dif_building01.tga とか。 そうすれば、解像度とマップ種別をradiobuttonとかdropdownlistで選択して ファイル名の文字列を自動でくみ上げていけるように出来るんで、 あとはパスの指定をしとくだけで済むし。
22 :
13 :04/12/06 18:35:58 ID:99OwW6ZO
とりあえず、複数選択時に対応するために、 以下のように、for文というのを用いてみました。 on btn_genPrim pressed do ( if selection.count !=0 then for i in selection do i.genPrim (rdi_col.state) ) ) でもなんかエラーみたいです。なにがおかしいのかな。 リスナーって、エラーって教えてくれるけど、 具体性にかけますよね。 パスの変更処理は、スクリプト的には難易度高いですか?
23 :
11 :04/12/06 19:01:32 ID:JP7jZLhp
ん? これだと未知のプロパティとかエラーが出ない? 取り合えず上のgenPrimが選択オブジェクトの$を使ったままなら、そこも変えなきゃ。 fn genPrim mobj pCol = とかして、オブジェクトも渡してやって $をmobjに変えて、呼び出し側で for i in selection do genPrim i rdi_col.state と、オブジェクトも一緒に渡してやるとか。 パスの変更処理って、ファイル名そのままで、パスのみ変更とか? 取り合えずgetfilenamepathでパスのみ切り出せるし、getfilenamefileでファイル名、 getfilenametypeで拡張子のも切り出せるんで、それでバラバラにした後 単純に新しいパスの文字列変数と+でつないでやれば行けると思う。 getsavepathとか使えば、フォルダ選択ダイアログ出して選べるし。
24 :
13 :04/12/06 19:12:58 ID:99OwW6ZO
できました。なるほどですね。んー奥が深いですね。 パスの変更は、そんなに難易度は高くないんですね。 知らない関数がたくさんありますね。 とりあえず、マニュアルみてみます。記述方法から、勉強しないとですね。 +でつなぐ?って、どういうことなんでしょうか。
25 :
11 :04/12/06 19:49:29 ID:JP7jZLhp
str1 = "C:\temp\" str2 = "foo.tga" str3 = str1 + str2 とやればstr3は"C:\temp\foo.tga"となるという、文字列の演算のことです。
26 :
13 :04/12/06 19:57:42 ID:99OwW6ZO
そういうことなんですね。 例えば、今、このノードのテクスチャを差しかえるようにしているのですが mobj.material.map1.diffuseMap.src_tex.map1.fileName = ~パス/ファイル名 上記の説明ですと、このノードに対しての変更は、きくと思うのですが、 そこにパスがとおってある全てのテクスチャを同時変更したいと思うときに、 前スレッドで書いたように、すべてのパスを記述してあげないといけません。 (デフューズ、スペキュラ、バンプ、セルフイルミーネーションなど) また、他オブジェクトには、別のマップを張り替えたいとおもったときに、 そのオブジェクト専用に、またスクリプトをかかなければなりません。 (テクスチャの変更記述) そこで、マップはすべて同じフォルダにまとめてあるので、 解像度別にパスの変更が実現すれば、汎用性のあるスクリプトになるかなぁ? と思ったのです。 難しいですね。。
27 :
13 :04/12/06 20:00:10 ID:99OwW6ZO
そういうことなんですね。 例えば、今、このノードのテクスチャを差しかえるようにしているのですが mobj.material.map1.diffuseMap.src_tex.map1.fileName = ~パス/ファイル名 上記の説明ですと、このノードに対しての変更は、きくと思うのですが、 そこにパスがとおってある全てのテクスチャを同時変更したいと思うときに、 前スレッドで書いたように、すべてのパスを記述してあげないといけません。 (デフューズ、スペキュラ、バンプ、セルフイルミーネーションなど) また、他オブジェクトには、別のマップを張り替えたいとおもったときに、 そのオブジェクト専用に、またスクリプトをかかなければなりません。 (テクスチャの変更記述、ノードの変更など) そこで、マップはすべて同じフォルダにまとめてあるので、 解像度別にパスの変更が実現すれば、汎用性のあるスクリプトになるかなぁ? と思ったのです。 難しいですね。。
28 :
13 :04/12/06 20:00:21 ID:99OwW6ZO
あと、オブジェクトによって、シェーダの設定など かなり違うので、mobj.material.map1.diffuseMap.src_tex.map1.fileName ←ノードの変更を一つ一つ設定してあげないといけませんよねぇ。。
29 :
11 :04/12/06 20:50:38 ID:JP7jZLhp
ん〜、ちょっと良くわからないけど、もしかして解像度別に 別フォルダに同一のファイル名で入ってるビットマップの内どれかを参照していて スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな? 単純に指定した2Dテクスチャのビットマップのパスやファイル名を差し替えるのは簡単だと思うケド、 上の方でも書いてるけど、汎用性持たせるとなると、とたんにめんどくさくなるよ。 Maxはプラグインでマテリアルの種類とかも増やせるんで、入ってるプラグインによって プロパティも変わるんで、標準マテリアルのみとか限定しないと、ちょっと大変。 あと、マップ種別はmaterial.diffusemapって参照の仕方以外にも material.maps[i]っていう風に配列で参照も可能なんで、その方が簡単に別のマップ種別に 対応が可能だとは思うよ。 たしか標準マテリアルの場合はmaps[2]がdiffusemapと同一なはず。 それでも、マルチサブオブジェクトとかブレンドとか使われてるとどうしようもないですしね。 ****.classIDでそのオブジェクトがマテリアルかジオメトリかとか、マテリアルなら どんなマテリアルかとか一応判断はつきますので ClassIDを見て、対応するプロパティーを換える事は出来ると思うケド Maxに標準で入ってるマテリアルに対応するだけでも結構面倒なことになると思う。 シーン中のオブジェクトやライトはobjectsやlightsとかで配列で簡単に参照できるんで イメージも何か一発で配列で参照出来れば簡単にいくと思うんですけどねぇ。
30 :
11 :04/12/06 20:54:02 ID:JP7jZLhp
ん〜、ちょっと良くわからないけど、もしかして解像度別に 別フォルダに同一のファイル名で入ってるビットマップの内どれかを参照していて スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな? 単純に指定した2Dテクスチャのビットマップのパスやファイル名を差し替えるのは簡単だと思うケド、 上の方でも書いてるけど、汎用性持たせるとなると、とたんにめんどくさくなるよ。 Maxはプラグインでマテリアルの種類とかも増やせるんで、入ってるプラグインによって プロパティも変わるんで、標準マテリアルのみとか限定しないと、ちょっと大変。 あと、マップ種別はmaterial.diffusemapって参照の仕方以外にも material.maps[i]っていう風に配列で参照も可能なんで、その方が簡単に別のマップ種別に 対応が可能だとは思うよ。 たしか標準マテリアルの場合はmaps[2]がdiffusemapと同一なはず。 それでも、マルチサブオブジェクトとかブレンドとか使われてるとどうしようもないですしね。 ****.classIDでそのオブジェクトがマテリアルかジオメトリかとか、マテリアルなら どんなマテリアルかとか一応判断はつきますので ClassIDを見て、対応するプロパティーを換える事は出来ると思うケド Maxに標準で入ってるマテリアルに対応するだけでも結構面倒なことになると思う。 シーン中のオブジェクトやライトはobjectsやlightsとかで配列で簡単に参照できるんで イメージも何か一発で配列で参照出来れば簡単にいくと思うんですけどねぇ。 パスが違ってもファイル名が同一なら マップの入ってるフォルダリネームして外部参照パスの設定を変えて Max立ち上げなおすとかが一番手っ取りばやかったりして。
31 :
11 :04/12/06 20:56:30 ID:JP7jZLhp
あれ、書き込み失敗したと思ったら、2度書きになってら。スマン。
32 :
13 :04/12/06 20:59:51 ID:99OwW6ZO
33 :
13 :04/12/06 21:01:53 ID:99OwW6ZO
34 :
13 :04/12/06 21:05:45 ID:99OwW6ZO
ワイルドカード*とかつかって、うまくできないかなぁ。。
35 :
13 :04/12/06 21:15:01 ID:99OwW6ZO
別手段として、 イメージなんですが、(できるかどうかはわからない。) 選択しているマテリアル以下に設定してあるすべてのマップファイル(jpg) を、別フォルダに置いてある(ファイル名同じ)に変更するといった感じで できるようなきがするんですよね。 甘いかな? マップの入ってるフォルダリネームして外部参照パスの設定を変えて> たしかにそれもアリなんですが、スクリプトで変更するカッコヨサ的な ところを目指してたりします。笑
36 :
13 :04/12/06 21:50:58 ID:99OwW6ZO
usedMaps() マニュアルで調べてみたところ、 この関数は、オブジェクトに割り当てられているbitmapファイルの 一覧を返すみたいです。 これは、表示されるだけで、割り当てなどをできないのでしょうか?
37 :
11 :04/12/06 23:01:02 ID:JP7jZLhp
usedmapsは参照のみですねぇ.... 単純にファイル名の文字列でなくて、ポインタというかビットマップテクスチャ自体でも 返してくれるのならやり様もあるんですけどねぇ。
38 :
13 :04/12/06 23:20:34 ID:99OwW6ZO
大変お世話になってます。 11さん。勉強になってます。 先ほどの11さんの方法ですが、 以下。 >解像度4文字+マップ種別4文字+オブジェクト名とか。 >building01ってオブジェクトに256x256と512x512のdiffusemapを用意してるとしたら >256_dif_building01.tga >512_dif_building01.tga >とか。 >そうすれば、解像度とマップ種別をradiobuttonとかdropdownlistで選択して >ファイル名の文字列を自動でくみ上げていけるように出来るんで、 上記の場合は、マテリアル以下に割り当てされているMAPは、 自動で変更されていくのでしょうか? ちょっと、イメージがわかないんですが。 具体的には、どのようなインターフェースになっているのでしょうか? --- スクリプトに没頭しすぎて、お料理焦げました。笑
39 :
11 :04/12/07 00:02:21 ID:L6SrA20B
あぁ、それも基本的には標準マテリアルとかでの話で、ファイル名自体をスクリプトに 埋め込んでいたようなので、法則性にしたがってファイル名が決まっているようなら、 スクリプト側でファイル名を生成して差し替えるというか割り当てることが出来るなぁというそういう話です。 マテリアルやテクスチャが階層化してる場合とかは、やっぱりどうしようもないです。 タブン真面目に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"
)
*/
41 :
40 :04/12/07 09:00:07 ID:2oHVo7m4
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] )
42 :
40 :04/12/07 09:04:53 ID:2oHVo7m4
ぐはっ・・・インデントが取れた! マテリアルのクラス判別をするために一旦テクスチャパスの階層まで読んで 巻き戻るって感じの処理をやってます。 mnode(map node)を定義する辺りがちょっと怪しいかも・・・ 動かなかったらスルーしてください(;´Д`)
43 :
11 :04/12/07 14:21:55 ID:7iR+1VxZ
うわぁ〜。なんかいきなり難易度が高くなったかんじですね。 つまるところ、40さんの方法で、パスのサーチ機能を組み込むことによって、 パス名のみ変更して、ビットマップテクスチャの差し替え可能になるということ なんですね。 プログラム上、前述のスクリプトと、どこをどう繋いでいけばいいか、ちんぷんかんぷんです。 マップタイプごとの分岐処理?←これは、ブレンドやら、マットシャドウなんかの タイプの違いによる処理ってことですか?13さんが書いているようにタイプの違いが 複数あるので、かなり面倒になってくるといってたアレでしょうか? mnodeを定義した際の階層分戻してやる←言葉の意味が、難しくて、私の頭では理解できてません。 アドバイスお願い致します。
なんでハルシノにもpostしてんの?
45 :
40 :04/12/07 20:06:26 ID:Kklazi4n
46 :
13 :04/12/07 21:40:07 ID:7iR+1VxZ
ハルシノさんの人は、私じゃないですよ??
47 :
40 :04/12/07 21:53:08 ID:Kklazi4n
48 :
13 :04/12/07 22:14:17 ID:7iR+1VxZ
40さん考えている構造は、ハルシノさんに書いている内容と基本的なところは 同じなんでしょうか? 勉強のためにお聞かせください。
49 :
名無しさん@お腹いっぱい。 :04/12/07 22:28:39 ID:yEHtXvJk
なんでモモにもpostしてんの?
ハルシノのほうもみたけど、あっちの解答のほうが全然出来いいな・・・
51 :
40 :04/12/08 07:20:05 ID:5e3nYkRl
>>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 再帰的に処理するって意味では大体似たようなもんだと思う。(解答としては向こうの方が遥かに丁寧ですが)
向こうのはマップタイプの判定処理が入ってないけど、多分入れてないだけだと思うし。
考え方自体は変わんないってことで。
52 :
名無しさん@お腹いっぱい。 :04/12/08 09:49:15 ID:WobGaAPf
なんでモモにもpostしてんの?
53 :
名無しさん@お腹いっぱい。 :04/12/08 09:53:40 ID:jj+9pzF4
ていうか、ハルシノに書いてあるキャッシュの保存とか、できんのか? できそうにないとおもうんだが。
>>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 悪くはないけど助長すぎる。
56 :
40 :04/12/08 11:54:58 ID:5e3nYkRl
ん?俺が勘違いしてるのかな?
マップの判定ってのは例えばディフューズマップのパスは置換したいけど、
バンプマップは置換したくない場合とかに必要なんじゃないかなと思ってさ。
まぁ、そういう状況があるかないかは分かんないけどね。
問答無用でテクスチャのパスを書き換えるってんなら
>>55 のでもいいと思うけど。
説明下手でスマン。
>>53 あれは割と簡単。
でも
>>1 に出来るかどうかは誰にも分からない。
>>56 ああ、なるほど。
つうか、そこまでなるとxmlでマテリアル構造書き出して置換、読み込みしたほうがよさげ。
それと別にあんたの説明は下手ではないとおもうぞ。
汎用性もたせるようにするとcase文の荒になって可読性低くなるから、 汎用性殺して単純に変換したくないマップタイプを配列にいれといて、関数の引数に渡してやればよさそう。 配列は手動で必要に応じて書き換えとかで。 変なUIつけるより、現実的に。
59 :
名無しさん@お腹いっぱい。 :04/12/08 14:20:59 ID:lHHrycve
> キャッシュって履歴のこと? それってマップ張り替える部分とはまったく関係ないからiniにでも書き出すなり好きにしろ、って書いてあるけど。 > え? できるのそれって? 具体的には?
>>59 具体的もなにも、ファイル作ってgetINISettingやsetINISettingで読み書きすりゃいいだけじゃん。
まさかScriptでのI/O操作がわからんってレベルでいってんじゃないよね?
61 :
名無しさん@お腹いっぱい。 :04/12/08 17:26:45 ID:lHHrycve
へー
62 :
名無しさん@お腹いっぱい。 :04/12/08 23:14:15 ID:lHHrycve
ドロップリストで選択できるのかってことなんじゃない? 入出力できるだけってことじゃなく。
>>62 ドロップリストの初期化時にリストの配列をiniなりから読み込ませるだけだから簡単にできるけど。。
つうかscript書いたことのない人のあつまりか、ここ??
わかんねぇなら素直にハルシノで聞けよw
取り合えず俺は今回Tryを知ったのとプロパティ名でなく配列でアクセスできるって言う収穫があったので、とても収穫。
66 :
名無しさん@お腹いっぱい。 :04/12/09 14:18:13 ID:2xCzFsOS
わかりません。サンプルお願いします。>63
うんこスレ
68 :
13 :04/12/11 09:49:36 ID:Sw2/Uz1I
ドロップリストで選択?
69 :
69 :04/12/11 23:35:51 ID:Sw2/Uz1I
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) )
70 :
69 :04/12/11 23:36:39 ID:Sw2/Uz1I
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!" ) )
71 :
69 :04/12/11 23:46:51 ID:Sw2/Uz1I
はじめまして。69です。 上のスクリプトは、全自動レンダリングスクリプトです。 以下の項目で、改善したいと思ってます。 お力をお貸しください。 ●レンダリングを途中で止めたい。(GUI付) ●レンダリングするフレームを決めたい。(GUI付) ●レンダリングする解像度を選択したい(GUI付) ●どんなカメラが設定しても、レンダリングをかかるようにしたい (今は、Camera01という名前がついていないとエラー) ●アウトするファイルネームを変更したい。(今は、ファイル名で決定) ●例えば、Bipdデータがあったとして、自動で、ルート(bip_Root)を選択し ある一定角度間隔(1フレームごと)で、回ってレンダリングして、画像に落とす というようなルーティング工程をスクリプトのなかに埋め込みたい(これは、GUIレベルでなくてもイイと思います。) というような塩梅なのですが、なかなか難しくて、先に勧めません。 どのようにプログラムを組み立てていけばよろしいでしょうか? よろしくお願いします。
72 :
名無しさん@お腹いっぱい。 :04/12/12 01:03:19 ID:VYFvTGes
おす
73 :
名無しさん@お腹いっぱい。 :04/12/12 13:37:58 ID:VYFvTGes
ほむ
74 :
名無しさん@お腹いっぱい。 :04/12/12 23:35:36 ID:ZHVGWivj
パレットのオン/オフってスクリプトで出来ますか? Mキー押して出てくるマテリアルパレットを、 もう一回、Mキー押したら消せないかと思って...
75 :
名無しさん@お腹いっぱい。 :04/12/13 01:21:45 ID:mxnBYmZX
それ私もほしいです!>74
76 :
40 :04/12/13 06:07:02 ID:+Itm+BbJ
>>74 max7から標準で出来るみたい。
6以下は無理。外部アプリ併用すれば出来なくもないらしい。
ハルシノで検索すれば出てくるよ。
77 :
40 :04/12/13 06:12:15 ID:+Itm+BbJ
>>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値ね
でいいと思うけど。
78 :
40 :04/12/13 06:18:58 ID:+Itm+BbJ
続き・・・ ●アウトするファイルネームを変更したい。(今は、ファイル名で決定) 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の取得と位置の特定さえ出来れば、あとはターゲットカメラ作って それをアニメーションさせてもいいし、なんなりと応用利かせてやってください。
79 :
40 :04/12/13 06:21:30 ID:+Itm+BbJ
訂正 bipedオブジェクトの親にヘルパーを指定 ↓ bipedオブジェクトのルート(COM)の親にヘルパーを指定
80 :
名無しさん@お腹いっぱい。 :04/12/13 09:59:16 ID:UxDEQOI5
そ
81 :
名無しさん@お腹いっぱい。 :04/12/13 10:03:37 ID:UxDEQOI5
それを69のスクリプトと組み合わせるとどうなるわけ?
82 :
40 :04/12/13 10:08:31 ID:+Itm+BbJ
83 :
名無しさん@お腹いっぱい。 :04/12/13 11:57:40 ID:UxDEQOI5
69には、理解できないと思う。
85 :
名無しさん@お腹いっぱい。 :04/12/13 23:53:44 ID:UxDEQOI5
ど
86 :
74 :04/12/14 00:17:55 ID:d58EmSMP
>>40 パレットの件、情報ありがとうございます。
7を待ちます。っつうか、こんなことやっとできるようになったMAXって...。
>>40 がんがって説明しても理解できてないとおもうよ。
つうか、その程度のUIすら自分で組めないならもうだめぽ。。
単純にここは自分で欲しい機能を誰かが作ってくれることを願う、しょっぱいスレだからなw
88 :
40 :04/12/14 19:51:50 ID:K0JTT0jK
>>87 初歩的だから答えてんの!!
難しい質問きたら俺は逃げるから。
89 :
名無しさん@お腹いっぱい。 :04/12/14 21:38:47 ID:ZdeW0Vcl
初歩的なんですか?
90 :
40 :04/12/14 22:44:19 ID:OtRtkCrg
>>89 言葉の綾です。
別に線引きをするつもりはないですよ。
91 :
69 :04/12/15 00:07:21 ID:tG2RJyjg
いろいろ辞書を調べて、試行錯誤してみましたが、 僕の今の知識では、40さんの回答頂いた内容をスクリプトに反映させることが できなさそうです。もうすこしヒントを頂けないでしょうか?
92 :
40 :04/12/15 05:53:18 ID:T3D31FAl
>>91 (´・ω・`)
具体的にどの辺がどういう風に分からない?
出すもん出さないと答えは返ってこないよ。
>>91 辞書で調べても無意味。リファレンスみれ。
というか、初心者は最低でもさとうさんのスクリプト講座全部に目を通せよ。
どんなに
>>40 が解答しようが、その解答すらりかいできてないんだもの。
野球のルールを知らずに野球がうまくなりたいってれべる。
あれが理解(義務教育レベルで十分対応できる範囲)できないやつはScriptやらんほうがいい。
94 :
名無しさん@お腹いっぱい。 :04/12/16 16:08:52 ID:i1Ul180r
sa
95 :
名無しさん@お腹いっぱい。 :04/12/16 23:35:04 ID:w/9wxO44
さとうさんのスクリプト講座ってどこにあるんですか? URL貼ってくれませんか?
96 :
40 :04/12/17 01:01:33 ID:0654/xYU
>>95 HALLUCINOフォーラムの「スクリプト講座をchmに」っていうスレッドにchm版がアップされてます。
ダウンロードには登録が必要ですのでURLは貼りません。
97 :
名無しさん@お腹いっぱい。 :04/12/18 04:24:41 ID:O/Kgcyuv
極論をいえば、ひとつひとつの意味は、なんとなく理解しているのかも しれんが、アップしたスクリプトとのかかわりかた具合が、わからんのじゃない?
max5以降はリファレンスにチュートリアルもあるんで、それやれば理解が進む。 正直、scriptは自分で勉強する意思がないやつはやる必要なし。
99 :
名無しさん@お腹いっぱい。 :04/12/21 00:46:03 ID:tSLbRQpk
ipo
MAXのスクリプトでシェーダーは書けないんでしょうか。 他のソフトのようにシェーダーツリーで色々カスタマイズしたいのですが。
>>100 pluginScriptで書けなくはない。
以前はrenderman記述で書けるpluginScriptも存在した(もちろん対応している関数は少ない)
同じようなものでpluginのmaxShaderつうのもあった。
どちらも現在は開発は続いていない。maxでこんなこともできるかもってもんだった。実用性はあんまない。
ちなみに、シェーダーツリーはシェーダーを組むGUIであって、シェーダー自身を書くとかとは意味合いが違うだろ。
シェーダーをGUIで書けるツールだべ?
maxのマテリアルブラウザをスケマティック表示させたい、それをmaxScriptで作りたいってならboboさんとこですでにあるし、pluginでも存在してるよ。
ちなみに、boboさんのScriptは凄すぎ。ActiveXとかつかわないでmaxScriptでスケマティックを自前で描画してるw
102 :
名無しさん@お腹いっぱい。 :04/12/22 22:46:54 ID:BZc0vkhD
78>私の場合は、Bipedではなくて、シーンにカメラとライトを配置していて、そのカメラとライト両方を ヘルパーにリンクさせて、まわすのはどうすればいいでしょうか?
103 :
名無しさん@お腹いっぱい。 :04/12/22 22:49:00 ID:BZc0vkhD
ターゲットカメラとライトで、ターゲット固定(ターゲットを中心に)です。
104 :
40 :04/12/23 03:03:33 ID:Cjant1mf
>>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。
105 :
102 :04/12/23 15:34:56 ID:c7oiyKn/
作成されるヘルパーが、必ず原点にくるようにするにはどうすればよいでしょうか? 複数カメラがある場合に、どれかのカメラのターゲットをランダムに選択するため ヘルパーの位置が、変化していまいます。 ご教授よろしくお願いします。
106 :
102 :04/12/23 17:45:59 ID:c7oiyKn/
上記に加えて、モーフモデファイヤが仕込んであり、 上から順番に、ターゲット1:0-100-0 ターゲット2:0-100-0 ... で、キーを打ち込んでいき、レンダリングしていくという仕様を 考えてるんですが、モーファモディファイヤのノードの記述方法が、 いまいちうまくいかず苦戦しています。 初歩的なことかもしれませんが、何卒よろしくお願いします。
107 :
40 :04/12/23 19:15:42 ID:06S7Eu8r
>>102 > 作成されるヘルパーが、必ず原点にくるようにするにはどうすればよいでしょうか?
ターゲット中心にって書いてたじゃん・・・
原点にヘルパー持ってくるだけなら
cameras.parent = lights.parent = pH
の上か下かに
pH.pos = [0,0,0]
を追加するだけ。
上に追加したらターゲット中心とは限らなくなるし
下に追加したら子オブジェクトごと移動するからね。
> モーファモディファイヤのノードの記述方法が、
> いまいちうまくいかず苦戦しています。
いまいちうまくいかずって・・・
もちっと具体的に書いてくれ。
108 :
102 :04/12/23 22:26:37 ID:c7oiyKn/
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...カメラの名前はデフォルトの名前ではないです。) ごとに、レンダリングをかけることはできるのでしょうか?
109 :
69です!! :04/12/24 00:46:16 ID:PELn8VFb
ファイル名の変更のところでつまづいています。 edittext edt_filename "Filename" pos:[6,155] width:300 height:17 ---以下略。 実行部分。 filename = (edt_filename.text + ".tif") 上のように、スクリプトを書き換えました。 この場合、複数MAXファイルがある場合に、 次々に、ファイル名が上書きされてしまいます。 MAXファイルごとにファイル名を決めたいと思ってます。 んー むずかしいでしょうか? 最悪、ファイル名をこちらで決めたもので、 あとのMAXファイルは、連番でつながっていくというような感じで もいいかな。とは思ってます。。。
110 :
40 :04/12/24 05:38:36 ID:cZ3GLrJ4
>>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の時はエクステンションだったはず)
111 :
40 :04/12/24 05:43:03 ID:cZ3GLrJ4
>>109 maxファイルごとに名前変えたいんなら素直に
maxFileName + edt_filename.text + ".tif"
とかにすればいいんでないの?
とりあえずどんな命名規則でやってるのかも分からないんで
この程度の答えしか書けません。
112 :
102 :04/12/24 11:14:22 ID:PELn8VFb
実行部分を以下のように書き換えてみました。 そのまんまなんですが。。。 実行部分のみ-- 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)
113 :
102 :04/12/24 11:15:25 ID:PELn8VFb
続き 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] )
114 :
102 :04/12/24 11:15:44 ID:PELn8VFb
続き 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] )
115 :
102 :04/12/24 11:17:42 ID:PELn8VFb
上のスクリプトを実行すると 以下のエラーがダイアログででました。 -- Unknown property: "modifiers" in undefined プロパティがない? みたいなことをいわれます。 これは、どういうことなのでしょうか? Verは、MAX6.Eです。
116 :
40 :04/12/24 17:43:57 ID:7yypda9c
>>112-115 (
>>102 )
パス名リテラル
名前
ObjectSet値
MAXScriptトレーニング - ボックスの操作
あたりを読んでみて。
それでも分からなかったらどこが分からないか聞くといい。
ちなみにレンダリングの処理を書く場所が違ってる。
117 :
102 :04/12/24 18:25:56 ID:PELn8VFb
ありがとうございます。 リファレンスで、教えていただいた場所を読んでみました。 要するに、現在は、選択しているオブジェクトに対しての処理ということ なんですね。 なので、シーンにあるオブジェクトの名前でイベントを 起こすように考えてみました。 $.modifiers→$*モーフモディファイヤがかかっているオブジェクトの頭文字*.modifiers 上のように処理を書き換えました。 リスナーで、エラーを確認しながらやっているのですが 下記のエラーがでています。activeChの行〜pH.rotation.z_rotation = 0 )までで。
118 :
102 :04/12/24 18:26:40 ID:PELn8VFb
#() -- 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←ここからの行のことを差しているのでしょうか? インサートする場所が違うだけなのでしょうか?
119 :
102 :04/12/24 20:15:38 ID:PELn8VFb
オブジェクトを抽出するのが、できなかったので 直接オブジェクト名を指定しました。 そうすると、-- 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 )
120 :
102 :04/12/24 20:18:45 ID:PELn8VFb
また、レンダリング処理の記述場所もわかりました。 書いて頂いてましたね。すいませんでした。 -- 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 << また新たなエラーが発生しました。上のようなエラーです。
あのさあ、 どうでもいいけど下げてやってくんない?
122 :
40 :04/12/24 22:12:59 ID:+e2ZwavD
>>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]
後は自力でガンガレ。
123 :
102 :04/12/24 23:16:52 ID:PELn8VFb
//実行部分のみ 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])
124 :
102 :04/12/24 23:17:29 ID:PELn8VFb
--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] )
125 :
102 :04/12/24 23:18:06 ID:PELn8VFb
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] )
126 :
102 :04/12/24 23:21:42 ID:PELn8VFb
上のような感じで、スクリプトを改造しました。 まだ、なにか原因不明のエラーがでます??? -- 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 << スクリプトのエラーがでてるのは、わかるのですが、 具体性にかけて、いったい何が悪いのか。。さっぱりです。。
127 :
102 :04/12/24 23:25:18 ID:PELn8VFb
($*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 どういったケースが考えられるでしょうか? 諸先輩方のお力をお貸しください。
128 :
69です!! :04/12/25 00:06:17 ID:KQ8flVD+
ファイル名の規則性ですけど、 Bipdに一通りのアニメーションをつけています。 その一連のアニメーションをキーフレームごとに レンダリングします。 それを、たとえば、フロントとサイドでレンダリングしたいと思います! 上の手順でいくと、フロントからのレンダリングを一通りBipedを アニメーションさせて、一巡。カメラが、90度回転してサイドに行きます。 それで、また一巡してレンダリングしていきます。 なので、Front_01,02...(連番)Side_01,02..といった名前付けを 考えてみました。 Front、Sideなどの名前付けは、可能であれば テキストボックスから入力したものに反映させてたいと思ってます! (あらかじめ、プリセットするのではなくてですね。) または、カメラ名から取得してもいいのかなぁ〜とは思ってます。 108さんのモーフの取得は、上のスレッドを読みながら、 あたしも勉強がてら試してみてますけど、んー難易度高いですー。 すごいいっぱいエラーがでてます 笑
129 :
40 :04/12/25 01:43:02 ID:KOhVNH9a
>>127 MAXScriptの吐くエラーには、それこそ経験がないと原因が特定しづらいものも多いです。
これまでのあなたの書き込み内容から察するに、
処理的な話をする上で最低限必要な知識が欠けていると思われますので、
これ以上ここで問答を繰り返してもお互い徒労に終わる可能性が高いと思います。
ですので、もう少し簡単なスクリプトで経験なり知識を蓄えてから挑戦されてはどうでしょうか。
どうしても必要というのでしたら外部に委託して作ってもらうという手もあります。
私も一旦手を差し伸べた以上、途中放棄はしたくないのですが、
労力に見合うだけの対価(教えることで得られる何か)が得られない以上、
回答を続ける気にはなれません。
>>128 そうですか。
頑張ってください。
130 :
名無しさん@お腹いっぱい。 :04/12/25 01:54:10 ID:ch/46iy7
えらそうだけど、わかんないんじゃないの?>40
131 :
名無しさん@お腹いっぱい。 :04/12/25 01:54:59 ID:ch/46iy7
見返りがほしいの?>40
>>40 レス追っていけば分かるというか
40も分かってると思うけど上げて質問してるアホは1でしょ。
よくがんばったと思うよ。
>>131 コミュニティはリソースのギグアンドテイクで成り立つんだよ。
お前みたいな他人を利用することしか考えない乞食は邪魔なだけ。
133 :
40 :04/12/25 03:10:57 ID:KOhVNH9a
>>130 >>131 > えらそうだけど、わかんないんじゃないの?>40
わかんないよ。
エラー出力書かれて漠然とした質問されてもまともな回答なんて出来ない。
だったら分かってる範囲で回答するしかないじゃない。
> 見返りがほしいの?>40
否定はしない。
教えることで得られる何かってのは
例えば教えるために調べることで自分も勉強になったり、
分かってもらえた時の喜びとかそういう他愛もない自己満足的なもの。
もちろん初めからそういった見返りを要求してたら成り立たないけど、
回を重ねると事情も変わってくるよ。人間だからね。
答える方だってそれなりに時間を割いてるわけだし。
134 :
名無しさん@お腹いっぱい。 :04/12/25 12:13:54 ID:ch/46iy7
102は、確かに悪だ。 しかし、ソースを試してみてん。 簡単なシーンで、モーフを登録してね。 確かに、その箇所で、エラーがでるぞ。 間違いない。 40は、実際試してみて、ソースをあげてるのかい? 自分の目でみてみてん。 想像で書いても、スクリプタとはいえんぞい。
135 :
40 :04/12/25 16:40:26 ID:FMKIgUQc
>>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
)
これまでに提示してきたコードもあくまでアドバイスとして要所要所の考え方をコードとして提示しているに過ぎない。
提示されたアドバイスを読み解いてちゃんと動作するようにするのは質問主のすべきこと。
136 :
名無しさん@お腹いっぱい。 :04/12/26 01:14:25 ID:eYoc//mn
ちなみVerはいくつやん?>135 俺ンとこも駄目だったぞ? うちは、MAX6の英語バージョン
137 :
40 :04/12/26 02:32:49 ID:336kiAqh
>>136 max6英語版です。
どこが引っかかってるんだろう・・・
特にエクステンションが必要なわけでもないし。
とりあえずうちではmax6E・max5E共にちゃんと動くしなぁ・・・
138 :
136 :04/12/26 04:09:24 ID:KOhTlVIY
なんか、マシンによってエラーがおきたり、おきなかったり、 なにか衝突するプログラムがあるのかもねぇ。。 ま。MAXですから。。 ようわからんわ。
139 :
40 :04/12/26 04:27:46 ID:S0khontO
MOMOに書き込まれちゃってるみたいなんで、 勝手ながらこの辺でこの話題からは抜けさせてもらいます。 なんかややこしいことになっちゃってゴメンネ
140 :
名無しさん@お腹いっぱい。 :04/12/26 19:44:46 ID:KOhTlVIY
ほ?
まぞで低レベルだな。。
>>40 もムキになって答えんなよ。
あんたの回答を質問したやつはほとんど理解してないとおもわれ。
つうか、理解できる程度の知能があるやつは最初からリファレンスなりで自力で解決できてる。
その程度の内容のことで自己解決できないやつは、何をやってもダメぽ。
142 :
名無しさん@お腹いっぱい。 :04/12/30 22:20:38 ID:PfXs4Vxb
ooo
143 :
名無しさん@お腹いっぱい。 :05/01/03 01:05:48 ID:M55ds7UU
hu
144 :
名無しさん@お腹いっぱい。 :05/01/04 12:23:22 ID:i3ERclvD
はん
145 :
名無しさん@お腹いっぱい。 :05/01/14 05:03:19 ID:Gw14vC6K
うん
146 :
名無しさん@お腹いっぱい。 :05/01/23 13:24:08 ID:B/ZrynHg
yu
147 :
名無しさん@お腹いっぱい。 :05/01/30 00:54:51 ID:3Y/69Adl
Rs
148 :
名無しさん@お腹いっぱい。 :05/01/30 00:55:28 ID:3Y/69Adl
Rs
149 :
名無しさん@お腹いっぱい。 :05/02/26 22:44:52 ID:X1lrvR6u
yu
150 :
名無しさん@お腹いっぱい。 :2005/05/15(日) 16:16:20 ID:cs1r6F9M
C4DのCoffeeみたいな使い方できねーの?
具体的に何がしたいねん いうてみーな
方向コンセントレイトとかバインドみたくIKと絡ませたい
それのどこが具体的やねん だいたい、コンセントレイトってなんや なにがしたいんかさっぱりわからんわ
>>150 試しにC4Dでどうやるか、その式を書いてみろ
コンセントレイント。 お笑いコンビのセント☆ルイスみたいなもんか? それは難しそうだ。
C4Dもってねーから見られへんけど 要するにターゲットオブジェクトをスクリプトコントローラー とかで動かしたいんか?それならdependsOnかまさなあかんで。 詳しくはマニュアルの「スクリプト コントローラ用 dependsOn」 あたりやな
>>157 あなたは神かもしれない〜
dependsOnっすね!
とりあえず読んでみます!試してみます!
最初っから敬語でちゃんと必要事項を書いて質問すりゃ早いのにな。
たぶん、scriptコントローラーでなくて式コントローラーで間に合う程度の計算な予感。。
161 :
151 :2005/05/17(火) 22:03:04 ID:OW7A3Ad5
どーも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
168 :
名無しさん@お腹いっぱい。 :2005/10/22(土) 22:46:03 ID:WHmRJmqZ
いえいえ
現在 max のプラグインを製作中の者です。 NURBS の曲面とある座標をとの距離を求めたいのですが、 どのようにしたらよいのでしょうか?
170 :
名無しさん@お腹いっぱい。 :2006/06/11(日) 18:46:39 ID:syds5UWa
どうなのよ
171 :
名無しさん@お腹いっぱい。 :2006/09/12(火) 02:02:58 ID:DfRZzxQz
$.material.diffusemap.filename = "c:/bbb.jpeg" ) )
>>171 スラッシュはエスケープ文字だから、
"c://bbb.jpeg"
としないと駄目だよw
173 :
名無しさん@お腹いっぱい。 :2006/09/17(日) 23:43:17 ID:4QiIeya5
シンプルなサンプルコードをたくさん読みたいのですが、 適当なサイトが見つかりません。 オブジェクトをひとつずつ処理するとか、位置情報を書き出すとか、 そういうシンプルなのどこかに無いでしょうか?
レコーダーの記録見たら?
175 :
名無しさん@お腹いっぱい。 :2006/09/18(月) 18:09:27 ID:H/4zw7Uu
いろいろ探したけど、さとうさんのしか見つからないです。 そもそも、公開するのが恥ずかしいくらいの短いスクリプトは、誰も公開したがらないってことなんでしょうか?...。
>>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で付いたデバッガって皆使ってる? いまいち使いどころ(使い方も)がよく分からんのだが・・・ こういう場合に使うと(・∀・)イイ!!って例ある?
178 :
名無しさん@お腹いっぱい。 :2006/09/21(木) 01:15:56 ID:bMeMN2Nk
>>176 ありがとうございます。
こういう数行のやつがとっかかりやすいですね。
>>177 関数を再帰的に呼び出してる時のチェックや、構造体や配列の中身をウォッチする時とか。
>>179 そんなもんformat使った方が自由度高くていいじゃん・・・って思ってしまう。
もっとデバッガにしかできない便利な使い方ってないの?
printデバッグのほうが面倒だと思うけど・・・ >もっとデバッガにしかできない便利な使い方ってないの? breakして変数書き換えとか
>>180 逆に聴くけど、何があったら便利だとおもってるの??
>>181 そうだね、break使えるのは嬉しいね。
183 :
180 :2006/09/22(金) 21:42:41 ID:2Ox504s/
>>182 それが分からないから聞いてるんだけど・・・
>>180 は無理にデバッガ使わなくていいよ
自分でいろいろ使って何が便利かわからないなら、しょうがないwww
185 :
名無しさん@お腹いっぱい。 :2006/09/24(日) 21:32:03 ID:HfQkFOvG
UVWMapモデファイアのギズモを90度回転させるにはどう書いたらいいっすか?
>>185 $.modifiers[1].gizmo.rotation.x_rotation += 90
良スレsage
188 :
名無しさん@お腹いっぱい。 :2006/09/24(日) 23:12:59 ID:HfQkFOvG
>>185 そんくらいマクロレコーダーで吐き出せるだろwww
と思って試したが、
それすら吐き出せないマクロレコーダーに失望した
190 :
名無しさん@お腹いっぱい。 :2006/09/25(月) 12:43:51 ID:ZFHVi/yy
マクロレコーダーが万能だと思ってる人は、自分でスクリプトを書こうとしたことが無い人ですよ。
ほんとMAXのレコーダーはガチで飾りだよな。。。
ガチムチレーダー搭載
マクロレコーダーが飾りとか言ってる奴は まだまだ経験不足だと思ったほうがいい。
194 :
名無しさん@お腹いっぱい。 :2007/01/06(土) 18:47:38 ID:REW6/hxJ
うわぁ、過疎スレですねぇ...。
たしかに過疎ってるな。 しょうが無いから三ヶ月以上前の話題にレスしとくと、 マクロレコーダは飾りじゃないが、肝心な時に役に立ってくれ無かったりする微妙に憎たらしい奴。
scriptとは行かないまでも 最近式コントローラーとかをなんとか弄って頑張っています。 ハルシノと睨めっこしながらですが・・ そのうちサクサクscript書けるようになりたいです。
-- Syntax error: at >, expected <factor>
-- In line: for i in
>>1-196 do
( if (classOf MAXSCRIPT_VOl1)==Array do ( mapped fn resOutput res = ( format "% 名前: % [%] 投稿日:% ID:% \n % \n" res.index res.name res.mail res.data res.id res.text ) resOutput MAXSCRIPT_VOl1 ) )
200 :
名無しさん@お腹いっぱい。 :2007/04/14(土) 14:36:17 ID:9iJBZ1Wk
messageBox "保守" title:"名無しさん@お腹いっぱい。" age:true
201 :
名無しさん@お腹いっぱい。 :2008/06/19(木) 17:42:15 ID:ygr/I/SO
messageBox "保守2" title:"名無しさん@お腹いっぱい。" age:true
exit
box()
良スレage
206 :
205 :2008/11/11(火) 16:23:04 ID:r6M3elYI
>>205 細かい点ですが、
×いっらしゃいましたら → ○いらっしゃいましたら
207 :
名無しさん@お腹いっぱい。 :2009/01/19(月) 23:55:14 ID:l5zDWz/E
meditMaterials[1]のDiffuse colorの彩度を調整するには どう書いたらいいんですか?
meditMaterials[1].diffusecolor.saido = <float>
>>208 同じように書いてみたんですけど、マテリアルエディタの色は変わんないんです。
meditMaterials[1].diffusecolor.saturation = 200にしても彩度が200になんないし。
リスナーには200 OKとか出るんですけど。
何が違うんでしょうか?
>>209 君はリファレンスとか見ない人?
見られない理由でもあるの?
信仰上の理由とか?
>>210 リファレンスとかネットとかで調べてるんですけど分からなくて。
でもリファレンスに書いてあるんですね。
皆さんもっと熟読してるんですね。
分かりました。
>>211 ばっちり書いてあるし別に熟読しなくても直ぐに見つかるよ。
と、突き放してもいいんだけど、初心者のころって確かに
何が分からないかもよく分からなかったり、調べ方すら分からなかったりするよね。
とりあえずそういう人は疑問に思ったらリスナーに以下を入力してみて欲しい。
大抵の場合はこれで突破口が開けるはずだ。
classof <調べたいもの>
show <調べたいもの>
>>212 ありがとうございました。
取りあえずclassof、showをからじっくり探って行こうと思います。
レスくれて感謝です。
ちょっと端的に聞いてみるけれど、モーションデータにオブジェクトを同調させるスクリプト知らまいか?
モーションデータ オブジェクト 同調
216 :
名無しさん@お腹いっぱい。 :2009/03/06(金) 21:29:06 ID:1FYX7vbE
age
217 :
名無しさん@お腹いっぱい。 :2009/05/12(火) 22:43:36 ID:rv7ZWwOY
コード ( struct hoge (this) local foo = hoge() foo.t = foo foo ) 出力 (hoge this:<<recursive Struct:hoge>>) 上記コードでメンバ変数 this はメモリ上ではどういう状態なんでしょうか? プラグインスクリプトの this みたいなのが構造体にもあれば便利だと思うんですが 上記の方法だとメモリの状態がよく分からないので不安です。
218 :
名無しさん@お腹いっぱい。 :2009/05/12(火) 22:45:10 ID:rv7ZWwOY
訂正 ×:foo.t = hoge() ○:foo.this = hoge()
219 :
1 :2011/07/16(土) 23:33:46.31 ID:dkV8kuJO
220 :
名無しさん@お腹いっぱい。 :2011/11/10(木) 00:49:29.40 ID:UyZo2+nH
if rot > 0 then ( rot*2 ) else ( 0 ) rotが0より大きいときにx2してそれ以外は0って感じなんだけど、 これに「rotが90以上の時も0」って加えたいんだけど どう書けばいいでしょうか?
221 :
名無しさん@お腹いっぱい。 :2011/11/10(木) 18:31:49.11 ID:HmWVAfBq
「rotが90以上の時も0」を加えるんじゃなくて 「rotが0より大きいとき」じゃなくて「rotが0より大きく尚且つrotが90より小さい」 ってすればよい。 if rot > 0 then ↓ if rot > 0 and rot < 90 then
222 :
名無しさん@お腹いっぱい。 :2011/11/11(金) 00:26:28.61 ID:IXSZtxDz
ありがとうございます! 仮に、 rot < 90 のときは rot*3 など、結果を3パターン以上出したい時は どうすればいいでしょうか?
うおっ このスレまだ生きてたかw
224 :
222 :2011/11/12(土) 00:10:18.50 ID:KLAa1gQo
自己解決しました。 else以下にまたif文を入れればよかったのですね。
225 :
名無しさん@お腹いっぱい。 :2011/11/29(火) 01:00:23.38 ID:iJujN947
max2012で保存されているトラックビューを一括削除するスクリプトを探しています。 (頻繁に削除するので、リストで消すのが面倒) ハルシノにあったRudeCleanserTrackviewsがそれっぽいのですが、 バージョンが合わないせいか思うような動作をせず、中途半端に残ったりしてしまいます。 全部閉じた状態で実行すれば真っ白になっているようなものを書いていただけないでしょうか?
リファレンス見ながら書くから動かなくても文句言わないでね ( local numTVs = trackviews.numTrackViews() for i = numTVs to 1 by -1 do ( if trackviews.isOpen i do trackviews.close i trackviews.delete i ) )
ごめん、動かなかったので直した ( local numTVs = trackviews.numTrackViews() for i = 1 to numTVs where trackviews.isOpen i do trackviews.close i for i = numTVs to 1 by -1 do ( local tvName = trackviews.getTrackViewName i trackviews.delete tvName ) )
ちなみに開いたままでも全部消せるよ
>>227 ありがとうございます!
凄い助かります!!
231 :
名無しさん@お腹いっぱい。 :2012/03/09(金) 13:20:58.35 ID:UWqUBMhr
ボーン(biped以外)の表示非表示を切り替えたいんだけど、 ( on execute do ( case of ( (hideByCategory.bones == true): (hideByCategory.bones = false) (hideByCategory.bones == false): (hideByCategory.bones = true) ) ) ) こうするとBipedまで対象になってしまうのですが、どうカテゴリ分けすればいいでしょうか? (表示フロータに2つあるボーンオブジェクトの下だけ適用した感じにしたい)
hideByCategoryだと無理っぽい気が。 showPropertiesで見てもチェックボックスの有る分のプロパしか見当たらないし。 下のボックス内と追加で出る分のカテゴリ非表示はスクリプトからは無理なんかね。 自前でループさせてclassofでチェックしてボーンだけ非表示になるスクリプトを組むとか。 カテゴリ非表示ほどレスポンスは良くないだろうけど。
Bipedの表示カテゴリはむかしジオメトリだったのが最近はボーンに変わったんだっけ? しかもそれが選択フィルタのカテゴリと食い違ってたり 色々面倒だから、最近はカテゴリ表示・非表示よりレイヤーで分類して管理する方法で慣れちゃったなあ
234 :
名無しさん@お腹いっぱい。 :2012/06/19(火) 04:36:49.15 ID:bhbSvTzB
モーフモデファイヤについて質問です。 選択した複数のモーフオブジェクトの、特定のチャンネルを一括で変更したいのですが、 色々試しても、複数選択した内の一つにしか適用されません。 試したスクリプトです。(チャンネルの2番目を変えるとして) mph = $.morpher for i = 1 to selection do ( WM3_MC_SetValue mph 2 100.0 ) スクリプトは今回初めて学ぶので単純な原因をわかっていないのかもしれませんが、 もしよかったらアドバイスをよろしくお願いします。
1行目 .morpherはモーファーが適用された個別のオブジェクトのプロパティなんで 複数選択した場合には$はオブジェクトセットになるんで 個別の要素に対してそのプロパティでアクセスしないといかん。 ex1) $[1].morpher ex2) selection[1].morpher 2行目 selectionは現在の選択のオブジェクトセット(配列)なんで for文で1から配列までって記述はおかしい。 for i = 1 to selection.count do でiにインデックス入れて mph = selection[i].morpher でモディファイア引っ張ってくるか for i in selection do でiにオブジェクト入れて mph = i.morpher でモディファイア引っ張ってくる
スクリプトを学ぼうといろいろチュートリアルやらなんやらを集めてはみたものの、 どれも最初はBOXの作り方なんだよな… 基礎が一番重要なのはわかっちゃいるけど、もうちょっと先からお願いしたいわ…
読み飛ばせばいいやん
表示パネル→表示カラーロールアウトで ワイヤフレームとシェーディングのカラーをそれぞれ変更できますが、 実行するたびにオブジェクトとマテリアルが切り替わるようなスクリプトを書いて欲しいです。 結構頻繁に切り替えるのですが、そのたびにパネルを開くが面倒で…
手作業でやれやボケ
書き方が知りたいんじゃなくて書いて欲しいって、どんだけやねん。
こんな過疎スレで釣られんな無視だ
sage進行で過疎ってる割りにレスは早い…住人はいるんだな
選択した複数のオブジェクトのアニメーションカーブにサイクルやループ属性をつけるスクリプトって可能でしょうか? カーブエディタが開いているだけで重いので、カーブエディタを開かずにループ属性をつけたいのです
可能かどうかも含めてリファレンスに全部載ってるよ
選択中のオブジェクト+子供を全選択するようなスクリプトを書きたいのですが、 スクリプトリファレンスのトレーニングやチュートリアルをみても、選択に関するものが見当たりません… そもそも"指定したboxを選択する"書き方すらわからない素人ですが、どのあたりを見ればいいでしょうか?
リスナーのマクロレコーダの使用可能にするにチェック入れると、基本的なコマンド類は リスナーにコマンドが現れるんで、そのコマンド見てMaxScriptのヘルプで検索する。 クリックしてオブジェクト選択すればリスナーに select $Box001 とか出るんでselectでヘルプ検索すればノードの共通プロパティの所に 選択関係のコマンドが載ってる。 あと子供の選択はデフォルトだと[PageDown]複数の子を選択は[CTRL]+[PageDown]だったと思うんで (俺は既にデフォルトから変えてるんでもしかして違ったら自分でテキトーなショトカに割り当てるかメニューに出してやって) それ押せばマクロレコーダに子供を選択するコマンドが出ると思う。
>>246 そのマクロレコーダーなんだけど、使用可能にしてあるのに何も出ないんだよ…
複数の子を選択なんてあったのか…今回はそれで十分でした。ありがとう。 レコーダーの件はわからないけど…
maxのマクロレコーダーは使い物にならないことがまれによくある
for i in objects do みたいな書き方だと、メッシュ化してないプリミティブオブジェクト(普通のSphereとかBoxとか)が拾えないみたいです。 objects の代わりに $* だと拾えるのは分かったんだけど、 昔に別な書き方でもできた気が。 $* 以外の書き方って無かったでしたっけ?
>みたいな書き方だと、メッシュ化してないプリミティブオブジェクト(普通のSphereとかBoxとか)が拾えないみたいです。 あれ、拾える? 勘違いしたかも。ごめん。
>>251 一度くらいはリファレンスに目を通しましょう
objectsはObjectSet値
$*はPathName値
条件次第で同じ動作をするけど明確に異なる値です
異なる値かどうかとか、全く質問と関係ないですよね。
複数のスクリプトのバージョンまとめて更新したいんだけど、なんかいい方法ある? 今のとこ一つずつビューポートに投げるしか方法思い浮かばなくて。
255 :
254 :2013/04/09(火) 02:40:30.40 ID:Rf+a1HI9
事故解決しますた。 AppDataのほうにスクリプトあるとmacroscriptsに入れても更新されないのね。
基本設定の自動バックアップのチェックのオンオフをスクリプトで制御したいのですが、 どこにアクセスしたら良いでしょうか?
autosave.Enable = true
ありがとうございます!
( ( if (autosave.Enable = true) then autosave.Enable = false else autosave.Enable = true ) ) のようにして、有効の時に押せば無効になるようにしたのですが、 無効の時に押しても有効になりません… 書き方がおかしいのでしょうか?
×if (autosave.Enable = true) ○if (autosave.Enable == true)
Boolのトグルにif文はいらんよ autosave.Enable = not autosave.Enable
262 :
260 :2013/09/24(火) 01:00:49.87 ID:mn/UtfSO
あ、そりゃそうだ。
レイヤーマネージャーのボタンのように、一回押すとオレンジになり もう一回押すと戻るようなマクロスクリプトはどのように書いたらよいでしょうか?
CheckButton
265 :
264 :2013/09/30(月) 15:00:16.83 ID:oCM9TbaB
オブジェクトプロパティの「フリーズをグレーで表示」をボタンにしたいのですが、 マクロレコーダーに出た$.showFrozenInGray = onだけでは反映されません。 何か足りないのがあるのでしょうか?
いけるはずだけど。 $は選択オブジェクトを表してるから、オブジェクトが選択されてないか、 もしくは複数選択されてるとか。
>>267 単体で試したら確かにいけました。
複数選択時はまた違うのでしょうか?
これなら選択なし/単体/複数でも対応可能 selection.showFrozenInGray = true $は現在の選択を表す「PathName値」 selectionは現在の選択を表す「ObjectSet値」 どちらも配列の一種で似てるけど微妙に違う 試しに何も選択せずにリスナーに $ と selection を打って戻り値を確認するといいよ どういう違いなのかなんとなく分かるはず
へ〜、selectionってプロパティの代入はループさせなくても複数一気にいけるんだ。
一個賢くなった。
>>268 じゃないけどdクス
>>269 ありがとうございます!
いろいろ応用したいと思います
272 :
271 :2013/11/06(水) 12:25:25.06 ID:aqtHo5u9
何度もすいません…。 下記のようにしてif文にしたところ、2010では動作しましたが2012では動作しないようです。 仕様が若干変わっていたりするのでしょうか? ( for i in selection do ( if (i.showFrozenInGray == on) then (i.showFrozenInGray = off) else (i.showFrozenInGray = on) ) )
273 :
名無しさん@お腹いっぱい。 :2014/04/18(金) 17:07:03.83 ID:9+12GPL9
大体そういうのって才能でしょ
スクリプトを勉強し始めた初心者です。 ヘルプにあるビューポートの再描画コールバックについて2012と2014で 結果が異なる為、ご存知の方がいましたらご教授願います。 fn redrawviews_p = print "Viewports Redrawn" registerRedrawViewsCallback redrawviews_p 上記を評価してコールバックを停止するため unregisterRedrawViewsCallback redrawviews_p と入力しました。 2012は正常にコールバックが停止するのですが、2014は「OK」と返しては来るのですが "Viewports Redrawn"がリスナーに表示され続けます(停止できない) モヤモヤしてます・・・
今試してみたけど、うちは2014でも止まるよ。SP5。
>>275 なんだかよくわかりませんでしたが、max再起動したら正常に動作しました。
ありがとうございました。
>>276 登録したスクリプトがエラーを吐くと正常に登録解除できない
その状況を作らないために登録する関数は
実処理を行う関数を呼び出すだけの内容にしておくといいってリファレンスにも載ってるよ
さらにtry文で囲んでおくと安全
--登録
fn redrawviews_p = print "Viewports Redrawn"
fn redrawviews_handler = try( redrawviews_p() )catch()
registerRedrawViewsCallback redrawviews_handler
--解除
unregisterRedrawViewsCallback redrawviews_handler
バージョン毎の動作の違いはよく分からん
>>277 教えて頂きありがとうございます。
仕事の暇を見つけてスクリプトの学習を行っているので進みがとても遅く
try文が何なのか未だ理解してません。
もっと勉強します。
プログラミングの予備知識ゼロの人がmaxscriptを一人前に出来るようになるまで
どれくらい時間が必要なんでしょうかね。本人次第の所はありますが。。。
279 :
本田 :2014/11/27(木) 00:59:22.99 ID:5yIvS+Qc
>>279 ただのBoxで構成された木を作る動画
ボクセルツリーという言葉に期待した人は残念でした