MAXSCRIPT_Vol1
MAXSCRIPTに関するQ&Aのためのスレッドです。 あらかじめ用意された複数のテクスチャ(解像度違い)があり、 選択しているオブジェクトのテクスチャをボタン一発(インターフェース上は、解像度の種類分)で 切り替えていくというスクリプトを作りたいと思っています。 またできれば、ディフューズレベル、スペキュラレベル...などで、選択できる分岐処理を実装できればと思っています。 既存のものであれば、ご紹介ください。また、参考になるテンプレートスクリプトがあれば、お願いします。 たしかに過疎ってるな。 しょうが無いから三ヶ月以上前の話題にレスしとくと、 マクロレコーダは飾りじゃないが、肝心な時に役に立ってくれ無かったりする微妙に憎たらしい奴。 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 ) ) messageBox "保守" title:"名無しさん@お腹いっぱい。" age:true messageBox "保守2" title:"名無しさん@お腹いっぱい。" age:true 最近maxscriptを触り始めたばかりなのですが、 ttp://kazu001.blog66.fc2.com/blog-entry-146.html に記載されている 「親ボーンを曲げたら子ボーンも自動的に同じ角度だけ曲がるようにしておけば便利」 が、どのようにすればうまくいくのかが分かりません 分かる方、いっらしゃいましたら教えて下さい >>205 細かい点ですが、 ×いっらしゃいましたら → ○いらっしゃいましたら 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をからじっくり探って行こうと思います。 レスくれて感謝です。 ちょっと端的に聞いてみるけれど、モーションデータにオブジェクトを同調させるスクリプト知らまいか? コード ( struct hoge (this) local foo = hoge() foo.t = foo foo ) 出力 (hoge this:<<recursive Struct:hoge>>) 上記コードでメンバ変数 this はメモリ上ではどういう状態なんでしょうか? プラグインスクリプトの this みたいなのが構造体にもあれば便利だと思うんですが 上記の方法だとメモリの状態がよく分からないので不安です。 訂正 ×:foo.t = hoge() ○:foo.this = hoge() if rot > 0 then ( rot*2 ) else ( 0 ) rotが0より大きいときにx2してそれ以外は0って感じなんだけど、 これに「rotが90以上の時も0」って加えたいんだけど どう書けばいいでしょうか? 「rotが90以上の時も0」を加えるんじゃなくて 「rotが0より大きいとき」じゃなくて「rotが0より大きく尚且つrotが90より小さい」 ってすればよい。 if rot > 0 then ↓ if rot > 0 and rot < 90 then ありがとうございます! 仮に、 rot < 90 のときは rot*3 など、結果を3パターン以上出したい時は どうすればいいでしょうか? 自己解決しました。 else以下にまたif文を入れればよかったのですね。 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 ありがとうございます! 凄い助かります!! http://foxrenderfarm.jp/ http://yaplog.jp/foxrenderfarm/archive/11 セルフレンダーファーム会社でございます 価格は驚きほど安いです。使い方もすごく簡単です はじめてご利用して頂く方にはまた割引差し上げますので ぜひ一度弊社のホームページをご覧下さいね ボーン(biped以外)の表示非表示を切り替えたいんだけど、 ( on execute do ( case of ( (hideByCategory.bones == true): (hideByCategory.bones = false) (hideByCategory.bones == false): (hideByCategory.bones = true) ) ) ) こうするとBipedまで対象になってしまうのですが、どうカテゴリ分けすればいいでしょうか? (表示フロータに2つあるボーンオブジェクトの下だけ適用した感じにしたい) hideByCategoryだと無理っぽい気が。 showPropertiesで見てもチェックボックスの有る分のプロパしか見当たらないし。 下のボックス内と追加で出る分のカテゴリ非表示はスクリプトからは無理なんかね。 自前でループさせてclassofでチェックしてボーンだけ非表示になるスクリプトを組むとか。 カテゴリ非表示ほどレスポンスは良くないだろうけど。 Bipedの表示カテゴリはむかしジオメトリだったのが最近はボーンに変わったんだっけ? しかもそれが選択フィルタのカテゴリと食い違ってたり 色々面倒だから、最近はカテゴリ表示・非表示よりレイヤーで分類して管理する方法で慣れちゃったなあ モーフモデファイヤについて質問です。 選択した複数のモーフオブジェクトの、特定のチャンネルを一括で変更したいのですが、 色々試しても、複数選択した内の一つにしか適用されません。 試したスクリプトです。(チャンネルの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値 条件次第で同じ動作をするけど明確に異なる値です 異なる値かどうかとか、全く質問と関係ないですよね。 複数のスクリプトのバージョンまとめて更新したいんだけど、なんかいい方法ある? 今のとこ一つずつビューポートに投げるしか方法思い浮かばなくて。 事故解決しますた。 AppDataのほうにスクリプトあるとmacroscriptsに入れても更新されないのね。 基本設定の自動バックアップのチェックのオンオフをスクリプトで制御したいのですが、 どこにアクセスしたら良いでしょうか? ( ( 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 レイヤーマネージャーのボタンのように、一回押すとオレンジになり もう一回押すと戻るようなマクロスクリプトはどのように書いたらよいでしょうか? オブジェクトプロパティの「フリーズをグレーで表示」をボタンにしたいのですが、 マクロレコーダーに出た$.showFrozenInGray = onだけでは反映されません。 何か足りないのがあるのでしょうか? いけるはずだけど。 $は選択オブジェクトを表してるから、オブジェクトが選択されてないか、 もしくは複数選択されてるとか。 >>267 単体で試したら確かにいけました。 複数選択時はまた違うのでしょうか? これなら選択なし/単体/複数でも対応可能 selection.showFrozenInGray = true $は現在の選択を表す「PathName値」 selectionは現在の選択を表す「ObjectSet値」 どちらも配列の一種で似てるけど微妙に違う 試しに何も選択せずにリスナーに $ と selection を打って戻り値を確認するといいよ どういう違いなのかなんとなく分かるはず へ〜、selectionってプロパティの代入はループさせなくても複数一気にいけるんだ。 一個賢くなった。>>268 じゃないけどdクス >>269 ありがとうございます! いろいろ応用したいと思います 何度もすいません…。 下記のようにしてif文にしたところ、2010では動作しましたが2012では動作しないようです。 仕様が若干変わっていたりするのでしょうか? ( for i in selection do ( if (i.showFrozenInGray == on) then (i.showFrozenInGray = off) else (i.showFrozenInGray = on) ) ) スクリプトを勉強し始めた初心者です。 ヘルプにあるビューポートの再描画コールバックについて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を一人前に出来るようになるまで どれくらい時間が必要なんでしょうかね。本人次第の所はありますが。。。 Introduction to MaxScript - Creating a Voxel Tree - Part 1 https://www.youtube.com/watch?v=ZoIY5lT6IV4 Introduction to MaxScript - Creating a Voxel Tree - Part 2 https://www.youtube.com/watch?v=NxI-ru5yAa0 >>279 ただのBoxで構成された木を作る動画 ボクセルツリーという言葉に期待した人は残念でした また活発になってほしい... それかpython版作ろうよ いい加減Qtに移行したいけどpythonで完結できないことが多くて 結局maxscriptが必要になるならmaxscript一本でいいやとなって移行できない BonesProをmaxscriptから操作したいと思って試したのですが、上手くいかず困ってます。 http://doc.bonespro.com/MAXScript.html 【概要】 ボーン選択をmaxscriptで選択したい <void> BonesPro.bone_select_name <name> <select> <void>と <name> <select>のところが同様になっていると良いのかが良くわかっていません。 クラスとかパラメータとか調べてみたのですが、上記のメソッド関係が動いてくれません。 どうしたらいいのかアドバイス頂ける幸いです。 よろしくお願いいたします。 テストで探ってた際のログ 【実行】 showproperties $.modifiers[BonesProDemo] 【結果】 .use_inertia : boolean .use_oscillation : boolean .use_stack : boolean .use_parabones : boolean .use_dual_quaternion : boolean .use_linked : boolean on off .bone_sync : boolean .mirror_plane : integer .mirror_flip : boolean .mirror_offset : float .mirror_threshold : float .soft_selection : boolean .soft_radius : float .use_edge_distance : boolean .edge_distance : integer false 【それを元にパラメータは操作できました】 $.modifiers[#BonesProDemo].use_stack = off 【実行】 $.modifiers[#BonesProDemo].category $.modifiers[#BonesProDemo].classID 【結果】 #3d_io_Plugins #(1623534534, 1946828630) >>286 この手のドキュメントは <戻り値>関数名 <引数名または型> みたいに書かれてることが多い 型は説明文に書かれてる場合がある 戻り値のvoidってのは意味のある値は返さないって意味 ちょっと不親切なドキュメントだけど読めなくもない >>288 解説ありがとうございます。何となくな理解だったので助かりました。 あれから色々試していくつか分かってきたのですが、根本的に合っているのか謎で手探り状態なのですが、ご報告します。 ・Nameはstringにしろとエラー文で言われました。maxscriptのヘルプ通り、文字列 string値でした。 ・Bone選択は描画を更新しないと反映されないようで、以下のような処理が必ず実行されます。http://doc.bonespro.com/MAXScript.html の関数説明文にそのようなことが書いてありました。 【必ずBone選択時に実行される処理】 $.modifiers[#BonesPro].use_oscillation = on max views redraw ・また、Boneの操作のためにはLayerにアクセスする必要がありそうでした。実行:$.modifiers[#BonesPro].BonesPro.num_bones()結果:場所は <MixinInterface:BonesPro>と表示されます。 http://help.autodesk.com/view/3DSMAX/2016/JPN/?guid=__files_GUID_78B79975_7BA5_4A03_8FEF_27E78D14B575_htm $.modifiers[#BonesPro].BonesPro.num_bones()のように単純にやるだけではダメで、Layerの方も考慮しないといけないぽく、立ち止まってます。 >>288 以下はテスト時のログ [実行] $.modifiers[#BonesPro].BonesPro.num_bones() ---------------------------------------------------------- $.modifiers[#BonesPro].BonesPro.bone_select_all() ---------------------------------------------------------- BonesPro.bone_select_all() ---------------------------------------------------------- BonesPro.bone_select_all(1) [結果] -- 未知のプロパティ : "num_bones()" 場所は <MixinInterface:BonesPro> ---------------------------------------------------------- OK ---------------------------------------------------------- -- 引数のカウント エラー : bone_select_all には 1 が必要です、0 を受け取りました ---------------------------------------------------------- -- ランタイム エラー: オブジェクトにこのインタフェースが実装されていません : BonesPro >>289 MixinInterfaceってのは簡単に言えばA(BonesProインタフェース)に実装された関数num_bonesを別のB(モディファイア)でも共有して利用するための仕組みのこと A └num_bones B(Aを継承) プラグイン内部をこんな感じで実装すると B.num_bones こんな感じでmaxscriptではAとBの違いを意識せずに使える 手元にプラグインがないから推測になるけど $.modifiers[#BonesPro].bone_select_all() みたいに書けばいいはず $.modifiers[#BonesPro].bone_select_all()でBone全選択行けました。 http://www.bonespro.com/download-order/ からデモ版でやっていたので、それで出来なかったっぽいです。ライセンス版の方で動きました。ありがとうございます。 名前選択の方も、-- 変換できません : "Bone001" 入力: Boolean といったエラーメッセージをもとにtrue or false を入れてみたら動きました。 名前の指定で選択 $.modifiers[#BonesPro].BonesPro.bone_select_name "Bone001" true 名前の指定で選択解除 $.modifiers[#BonesPro].BonesPro.bone_select_name "Bone001" false ありがとうございます。 この"Bone001"を配列に置き換えてfor文でループ処理して複数でも行けるようにしてみました。 A = #("Bone001","Bone002") print A[1] for i = 1 to 2 do ( $.modifiers[#BonesPro].BonesPro.bone_select_name A[i] true ) ありがとうございます。大変勉強になりました。 >>291 MixinInterfaceの解説はヘルプ見てもチンプンカンプンだったので、ありがとうございます。 まだ何となくですが、分かった気がしますw 色々ありがとうございました。 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 T7Y1UVEC4V read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる