20191215

Shade3Dで画面スクロールするスクリプト

やったこと

​ Shade3D ver.16 professionalを使い続けています。毎バージョンの最終アップデートで、画面のスクロールができなくなって困っていたので、画面移動のスクリプトを書きました。

Shade3Dは次のバージョンが出ると画面のスクロールができなくなる。

​ 初めて触った3Dソフトがshade(今はshade3D)なので、自分はshadeが好きです。

​ 只、このソフトは、新しいバージョンが出るたびに画面のスクロールができなくなるupdateを配布して、ソフトの利便性を壊してしまいます。多分、意図して?かしないでか?わざと?指定座標位置に移動するようなスクリプトの紹介記事だけ、スクリプト配布か排除されているくらいの徹底ぶり。

​ 現在はサブスクリプションに変わったので、こういうことをしないと思います。amazonで前のバージョンの購入はできないようになってしまいました。フォトショとか3DCGのソフトって、大きな機能のアップデートがないと、新しく買ってもらえなくなる。だから、サブスクリプション形式の売り方になるんだと思っている。もう、あっと驚く機能の追加はないのかぁ。

導入方法、使用方法、欠点など

​ そこで、やや利便性は劣りますが、最後にクリックした位置に画面を移動させるpythonスクリプト(一行)を書いてみました。

  • 導入手順は下の通りになります。
  1. 下記スクリプトをテキストファイルとして、適当な場所に「scroll.py」などという名前で保存する。
xshade.scene().scroll(xshade.scene().cursor_position)
  1. Shade3Dを立ち上げて、表示(V)>ショートカット(R)と選択し、ショートカット画面を開きます。

  2. ショートカットを設定したいボタンをクリックして、スクリプト(S)>参照…と選択する→ファイルダイアログ開く。

  3. 先ほど書いた「scroll.py」を選択する。
  • 使用方法は、

クリック→設定したショートカットキーで実行されるはず。

  • 欠点は、

すべての図形ウィンドウが動いてしまうことです。つまり四面図の内、レンダリングのカメラ画面以外は全て移動されてしまいます。

画像は、著作権とか怖そうなので貼らないことにしました。そういう怖さがあるから、商用ソフトの使用方法ってネットに情報が載ってないんだと思う。この記事もアウトなんだろうか。

posted by yuchan at 19:00 | Comment(0) | Shade

20170109

Shadeスクリプト 「図面を選択形状に合わせる」ができなかったので、重心座標を利用して対応した。

引き続き、Shadeのメモ。

選択形状に合わせるか、図面に合わせるか。

図形ウィンドウに、形状が表示されるけど、デフォルトの四面図で表示すると、

  • 形状が小さい。
  • モニタが小さいと、目が疲れる。
  • というか表示が小さすぎると、作業にならない。

という問題がありますので、拡大縮小するわけですが、単に拡大縮小すると、

  • 目的の形状がフレームアウトした。
  • 中心は、もっと…こう…右に、ああ行き過ぎた!

となる。

  • 選択形状に合わせる
  • 図面に合わせる

を利用すると、いい具合にズームしてくれる。

「選択形状に合わせる」(もしくは「図面に合わせる」)は、カメラメークの中に入っている。(GUI)

図形ウィンドウのカメラマーク>選択形状に合わせる(もしくは>図面に合わせる)を押せば、形状の表示が、図形ウィンドウにフィットしてくれる。
20170109.png

xshade.scene().fit_to_window()で、図面に合わせる。(CUI)

xshade.scene().fit_to_window()

は、図形ウィンドウを、図面に合わせてくれる。

fit_to_window()は、中に引数が入れられる。
省略されているときは、「図面に合わせる」と同じ挙動。

fit_to_window()が、効かなかった

xshade.scene().fit_to_window()が、効かなかった。

長いスクリプトの最後の方で、「図面を選択形状に合わせる」がしたかった。
しかし、なぜかできない。
仕方がないので、バウンディングボックスの中心で、拡大縮小しようと思ったが、やはりできない。
似たような挙動になる。

「図面を選択形状に合わせる」は、バウンディングボックスを利用して、拡大縮小しているのではないかと思った。

バウンディングボックスの中心座標がおかしい。

バウンディングボックスの中心座標が、スクリプトが終わるまで、更新されていなかった。
スクリプトの実行中に、

# 凄く長いコード
xshade.scene().select_parent(-1)
print xshade.scene().active_shape().center_position
  1. #凄く長いコードの部分に、z軸の+側のみにたくさん形状を作っている
  2. select_parent(-1)で、ルートパート選択。
  3. ルートパートのバウンディングボックスの、中心座標を、center_positionを使って、printで、標準出力に表示する。

とすると、なぜか(0,0,0)が返ってくる。

一旦全部消して、同じ処理をする。

# 一旦全部消して、下記のみ同じ処理
xshade.scene().select_parent(-1)
print xshade.scene().active_shape().center_position

すると、ちゃんとした数値が返ってきた。なんなの。

諦めて、「じゃあ、ここでスクリプトを一旦区切って使えばいい。」とはならない。
全部、全自動にする。一つのスクリプトで。

解決策 形状の重心座標で代用。

バウンディングボックスの中心座標は、なぜか、更新されない事がある。これはもう、原因が分からないので放っておく。
形状の重心座標を使って縮小したら、期待通りの結果になったので、そちらを使った。

centre = xshade.scene().active_shape().center_point
xshade.scene().select_all()
xshade.scene().fit_to_window()
xshade.scene().shrink(centre)
posted by yuchan at 07:00 | Comment(1) | Shade

20170108

Shadeスクリプト オブジェクトの削除(名前を指定して)

オブジェクトの削除

shadeスクリプトにはまっているので、引き続き、試している。
今回は、オブジェクトの削除について、スクリプトでやってみた。

ブラウザで右クリック→削除(GUI)

まずは、スクリプトを使用せず、通常のオブジェクトの削除の仕方。タイトルの通りなので、書くまでもないが、下の図のような感じになっている。
20170108.png


ブラウザで選択>右クリック>削除を左クリック。


削除自体は、簡単すぎて、文章にならない。(CUI)

スクリプトで、オブジェクトを削除するには、

xshade.scene().active_shape().remove()

の、一行で終わってしまう。
簡単すぎて、文章にならない。
しかし、自分がアニメーション作るときには、もう少し、工夫する必要があった。

消したいものだけを消したい。

上の一行で、オブジェクトを消すのであれば、前もって、消したいオブジェクトを選択していなければならない。
なので、どうやって、消したいものだけを選択するのかという問題がある。

  • うまい具合に、そのオブジェクトを選択できる
  • そもそもシーン全体に、オブジェクトが一つしかない

なら、上の一行だけでもいい。
しかし、無数にオブジェクトがある場合、しかも、それがパート(フォルダ)別に分かれていない場合は、慎重に、消したいものを選択する必要がある。

remove()するために、選択する必要はあるだろうか。

実は、選択する必要は、ない。
GUIでは、選択する必要があったが、CUIでは、必ずしも選択する必要は、ない。

そもそも、上の一行を使う際、選択する必要があるのは、xshade.scene().active_shape()を使って、形状を取得しているからだ。

  • xshade.scene().active_shape()で、選択状態にある 形状が返ってくる。
  • その形状のメソッドに、remove()とか、surface.diffuseとかいろいろなものがある

だから、形状に色々な情報が付加できる。だから、選択する必要があった。
ただの、オブジェクト指向のやつですね。

形状が返ってくる変数は、xshade.scene().active_shape()だけじゃない。
xshade.scene().active_shape()では、選択している必要があるけど、それ以外はそうでもない。

選択しなくてもいい形状の操作のためには

xshade.scene().active_shape()以外の”形状を返す”操作のメソッドとして、remove()すればいい。
(例)形状.remove()
こんな感じで。
とはいえ、shadeリファレンス内部は、ほとんどすべて、xshade.scene().active_shape()を使って説明されている。
他の方法は、あまりやられていない。

とりあえず、形状を返すコマンドを、リファレンスから拾い読みしてみた。
これらのコマンドを使えば、選択しないで、削除(以外の操作も)できる。

表 形状を返すコマンド。
コマンド名説明1説明2
active_shape()代表例。選択されている形状を返す 
get_shape_by_name指定した名前を持つ形状を返す1個目の引き数で文字列で名前((例)”object”)。第二引数にブール(TrueもしくはFalse)がいる。デファルトで設定される名前を指定する場合には、Trueを設定する必要がある。
get_shape_by_ordinal序数で指定された形状を返すルートパートを0として、パート等含め、パートを全部展開したときの、ブラウザの上からの順序。3つ位作ってprint xshade.scene().get_shape_by_ordinal(3).nameとかやれば、形状の名前が返ってくるはず。
get_shape_by_positionブラウザ上の位置から形状を返す引数にリストをとれる。パート内部の込み入った順序を、リストの形で表現できる。[3,2,3]とか。ちなみに[3,0]や、最後よりも一つ多い場合、当然、sentinel(番兵)が返ってくる。2つ以上多い場合はエラー。-1以下の場合、パートが返ってくる。
get_shape_by_uuiduuidで指定された形状を返すuuidを指定する。uuidは、文字列みたいに、クォーテーションマーク(もしくはダブルクォーテーション)で囲む。
get_shapes_by_name指定された名前を持つ形状のタプルを返すこれだけ、shapes と複数形なのに注意。球(デファルト名)を複数作ってから、全部選択せずに、操作したい場合、print xshade.scene().get_shapes_by_name(‘球’,True)[0].surface.diffuseとか書く。あくまでも、タプルなので、インデキシングしないとだめ。全部まとめていっぺんに処理できない。forなどされたし。
memorized_shape記憶されている形状を返すxshade.scene().memory()とセットで使う。(記憶したい形状を選択中に、)xshade.scene().memory()を実行。他の形状を選択した後、(スクリプトをいったん全部消して)xshade.scene().memorized_shape().activate()を実行すると、さっき記憶した形状が選択されているはず。

当然ではありますが、xshade.scene().active_shape()のように、xshade.scene() を付けて使う。

xshade.scene()自体を、変数名で宣言したっていい。そうして説明している部分も、リファレンス内にあった。

  • 変数名(オブジェクト名?)をつけて削除
  • オブジェクトに名前を付けて削除

色々やってみた。
その結果、「remove()をつかって削除」、というよりも、「各オブジェクトに、どうやって名前を付けるか」という内容になってしまった。

前もって、変数として宣言しておくタイプ

object01 = xshade.scene().active_shape()
#途中、色々、処理をしてから…
object01.remove()

前もって、変数にしておけば、自分のコード内で、作ったものを管理できる。
この変数名を使えば、いちいち選択しなくても、そのオブジェクトに変更を施せる。
例えば、

  1. 透明度をどんどん上げながら
  2. レンダリング
  3. 保存

する時に、a.で処理するオブジェクトを指定できる。
もはや、remove()は関係ないが、

import os

a = xshade.scene().active_shape()

for i in range(10):
#拡散反射色毎回同じなら、ループに入れる必要ないが。
a.surface.diffuse = 1.0
a.surface.diffuse_color = (0,0,0)
#透明
a.surface.transparency = float(i)/10.0
a.surface.transparency_color = (0,1,0)

xshade.scene().rendering.render()
file_path = os.environ["HOMEPATH"] +"\\%05.f.png"%i
xshade.scene().rendering.image.save(file_path)

a = xshade.scene().active_shape()となっているので、現在選択中のshapeが変わったら、そちらの方が処理されるのではという心配はいらない。
きちんと、a = xshade.scene().active_shape()を処理した時点で、active_shape()だったものが処理される。
これなら、一旦宣言してしまえば、選択状態なんか気にしなくてもいつでも呼び出して使える。

removeについて、書こうとしているのに、removeを使っていない。

あれ、このオブジェクト、何て名前だったっけ?→print globals()

テキストエディタでファイルを編集して、それを読み込んで実行する時は、こんな事は、起こりえないけど、
インタプリタに、直接書き込んだりしていると…
どこかで書き間違えてエラー起こる。
→ 同じ処理を避けるために、前に書いた分を消す。
などして、自分で宣言した変数名を忘れてしまう事があるかもしれない。

print globals()

で、定義した変数名一覧が見れた。

(自分だけではないと思いますが。)
(一応、テキストエディタで書いて、保存してから、やっていますが。)

オブジェクトに名前を付けて、削除。

これは、GUIのブラウザから見れる名前なので、忘れても心配がいらない。

#文字列クォーテーションか、ダブルクォーテーションで、文字を囲む。
xshade.scene().active_shape().name="オブジェクト"
xshade.scene().get_shape_by_name('オブジェクト',True).remove()

インタプリタならでは。

「自分で宣言した変数名を忘れて大変」とか、インタプリタ言語ならではだ。
コンパイルするようなやつは、忘れたら、書いてあるから、思い出すまで読めばいいわけだし。

(書いてあるはずなのに…書いてあると思ってたのに…書いてない事も結構あるけど…バージョン管理の問題なのか、消しちゃったのかなんなのか。)

posted by yuchan at 07:00 | Comment(0) | Shade

20170107

Shadeスクリプト レンダリングする・しないを、pythonスクリプトで操作する。

レンダリングする・しないは、render_flagを使う。

CUIでは、render_flagを使って、レンダリング対象をオン・オフ切り替える。

スクリプトで、レンダリング対象の入・切を、設定できれば、

  1. 先に、オブジェクトを全部作っておいて、
  2. 必要に応じてオンする
  3. 画像として保存(もしくは、アニメの1フレームとして追加)
という事ができる。
もちろん、1フレーム毎に、新しいオブジェクトを作ったり消したりという操作でもいいけど、そんなことはどうだっていいだろ!俺はオン・オフしたいんだよっ!

スクリプトで、レンダリングすると、選択したもののみがレンダリングされる。だから、選択対象がオンだろうがオフだろうが、関係ないと思った。

しかし実際には、いちいちレンダリング対象を選択するスクリプトを作るのは大変なので、レンダリングする前に、ルートパートを選択しながらレンダリングするので、この設定は、大事。

ブラウザの、水色の球をクリックして、レンダリング設定(GUI)

まずは、GUIから。
ブラウザの、水色の球をクリックすると、レンダリングの設定ができる
20170107.png
写真の状態では、継承。親パートが、レンダリングされるのであれば、されるし、レンダリングされないのであればされない。
デフォルトでは、この状態。

表1
球の色説明
水色継承(デフォルト)。親パートが、レンダリングするならするし、レンダリングしないならしない。
灰色レンダリングしない。レンダリング対象から外れている。
水色+黄色いチェック常にレンダリング。親パートが、レンダリング対象から外れていても、レンダリングされる。

render_flagで、スクリプトから、レンダリングをオン・オフする。(CUI)

xshade.scene().active_shape().render_flag = -1
xshade.scene().active_shape().render_flag = 0
xshade.scene().active_shape().render_flag = 1

引数は三種類ある。

表2
引数(整数型)説明
-1継承(デフォルト)。親パートが、レンダリングするならするし、レンダリングしないならしない。
0レンダリングしない。レンダリング対象から外れている。
1常にレンダリング。親パートが、レンダリング対象から外れていても、レンダリングされる。

hide()では、図形ウィンドウ上で見えなくなるだけ。

hide()では、図形ウィンドウ上で見えなくなるだけで、レンダリングされてしまう。

xshade.scene().active_shape().hide()

hideの操作は、GUIでの操作でいうと、目のマークのあれの事。

20170107-2.png




posted by yuchan at 07:00 | Comment(0) | Shade

20170106

shadeスクリプト レンダリングの画像サイズを変える

レンダリング画像のサイズを変える

CGをレンダリングする際、前もって出来上がるサイズを指定している。
画像の大きさによって、レンダリング時間変わる。
大は小を兼ねる場合が多いが、大きい画像は時間がかかる。

目的のサイズが分かっているなら、絶対ジャストサイズで作った方がいい。

通常のレンダリングのイメージサイズを変えるための操作(GUI)

通常のレンダリングのイメージサイズを変えるための操作は、GUIでは、下の図のように、
20170106.png20170106-2.png20170106-3.png

レンダリング>レンダリング設定>イメージタブ
の順にボタンを押して行くと、幅、高さの設定ができる画面になる。

スクリプトで、イメージのサイズを変える(CUI)

CUIでは、
xshade.scene().rendering.image_size=[1920,1080]

とかでできる。スクリプトウィンドウにコピペして、実行すると、イメージウィンドウのイメージタブに、反映されるのが分かる。

四面図の透視図にも反映される。

引数は、リスト型で可。

print xshade.scene().rendering.image_size

すると、タプルで返ってくる。リストじゃないんだ…

xshade.scene().rendering.image_size=(777,777)

なぜか、タプルでも動く。どっちでもいいんだ…

ディスプレイサイズを横に3、縦に2で割った数値を当てはめてやってみた。shade13なら、多分動くはず。

displaySize = [1920, 1080]
displayDivided = [3,2]
imgSize = [displaySize[i] / displayDivided[i] for i in [0,1]]
xshade.scene().rendering.image_size=imgSize
posted by yuchan at 07:00 | Comment(1) | Shade

20170105

shadeスクリプト 背景を変える

背景の設定をGUIでやる。

背景というか、テクスチャパターンというものの設定ですが、GUIの操作では、下の絵の様に、
20170105.png

  1. 統合パレットから、背景を選び、
  2. 「無し」っ書いてあるところを、変える。
    というやり方でやる。

毎回やるのはたいして面倒ではないが、こういうちょっとしたことも積もり積もると、かなりの手間になる。
やり忘れたりもする。
これがまずい。

全てスクリプトでやっとけば、忘れない。
だから、全部スクリプトで書こうとする。
余計な時間がかかる。

まぁ、大丈夫でしょう。

テクスチャパターンを、background.background_layer(0).textureで、設定する。

#background
xshade.scene().background.background_layer(0).texture=6

6の以外には、整数で下の物が試せる。

index背景
0無し
1
2
3大理石
4スポット
5チェック
6
7イメージ

​イメージは、画像ファイル等々読み込んで使う。

​イメージは、

xshade.scene().background.load(file_path)

で読む必要がある。



posted by yuchan at 07:00 | Comment(0) | Shade

20170104

shadeスクリプト shadeスクリプトで、オブジェクトの選択、名前や、色の変更をやる。


オブジェクトの選択

xshade.scene().select_parent(-1)
xshade.scene().select_child()
xshade.scene().select_brother()
  1. ルートパートを選んで、
  2. そのすぐ下の階層 のパートもしくはオブジェクトを選んで、
  3. そのすぐ下のパートもしくはオブジェクトを選んでいる。

当然、最後に選択したものだけが、アクティブになっている。

オブジェクトの名前を指定して、選択(アクティブシェイプに)したい時。

xshade.scene().get_shape_by_name("閉じた線形状の掃引体",True).activate()

とかすれば、自分でつけた名前(勝手についた名前)でも、選択できる。
日本語もOK。

オブジェクトの名前を変える

xshade.scene().active_shape().name = "ホゲた形状"

オブジェクトの名前を連番で変えていく。

for i in range(3):
xshade.scene().active_shape().name = "%05.f"%(i)
xshade.scene().select_brother()

とかすれば、オブジェクトの名前を連番で変えていくことができる。
3つ未満だった場合、ブラザーがない(一つ下のオブジェクトがない)、最後のオブジェクトが、連続で名前が書き換えられ続け、00002になるはず。

# '3.000000'と表示される。
”%f”%3

# 'hoge'と表示される。
“%s”%”hoge”

とかの書き方は、python公式の文字列とバイト列オブジェクトを参照されたし。


name = "shape-" + str(i)

でもいい。

拡散反射色を変える。

xshade.scene().active_shape().surface.diffuse = 1
xshade.scene().active_shape().surface.diffuse_color = (0,0,1)#R,G,B

GUIで設定する時も、下の2つを選んだと思う。

  1. 拡散反射色をどの位反映させるか
  2. 色の指定

20170104.png

チェックボックスは、どうやって指定するのかはしらない。必要ないし。

posted by yuchan at 07:00 | Comment(1) | Shade

20170103

shadeスクリプト rendering.render()は、選択形状しか、レンダリングしない

shade13のスクリプトで、レンダリングする。

3DCGのモデルを、レンダリングして、画像化する。

3DCGのモデルを、レンダリング方程式というのを解いて、画像にする。らしい。
しかし、ユーザーが、式を知らなくても、ボタン一つでやってくれる。
レンダリングという言葉自体は、DTM(デスクトップミュージックの略)でも使われている。
譜面から、音楽を作るときとか、レンダリングとかいう事もある。
日本語で書くと、「書き出し」だろうか。

GUIでは、
  • レンダリング>レンダリング開始
  • レンダリング>レンダリング設定>(出現したイメージウィンドウの)レンダリング

と押していけば、レンダリングできる。
201701032.png

レンダリングは、rendering.render()

xshade.scene().rendering.render()

を使って、レンダリングする。
これだけだと、イメージウィンドウに結果が表示されるだけで、画像の保存等は行ってくれない。

rendering.render()は、選択したオブジェクトのみしか、レンダリングしない。

rendering.render()は、選択したオブジェクトのみしか、レンダリングしていない。
通常、スクリプトウィンドウから操作するときだって、GUIと併用して操作するとは、思いますが、どうしてもCUIのみでやりたい人は、次のselect_parent(-1)を使うべき。

全て選択するには、select_parent(-1)

xshade.scene().select_parent(-1)
#xshade.scene().select_all

を使えば、ルートパートを選択してくれる。もちろん、レンダリング対象になっていないものは、レンダリングされない。

レンダリング結果の、イメージを保存する、rendering.image.save(ファイルパス)

xshade.scene().rendering.image.save(filePath)

画像の種類は、ファイルパス末尾の拡張子から自動的に判別される。

  • ファイル名だけではだめ。
    • ファイルパスである必要がある。

絶対参照で、”C:\”から、つらつら書いていくべきでしょう。

ファイルパスを間違えると、記録されない。

自分の認識では、

  • shadeは、ホームディレクトリ以下 か、外付けドライブにしか保存できない。
  • shadeは、Cドライブ直下とか、カレントディレクトリ(os.getcwd()で取得したパス)には、画像を保存できない。

間違ったパスに保存しても、メッセージ欄に、エラーが表示されない。(これが厄介。)

だから、ホームディレクトリに、”hoge.png”を保存したいときは、

import os
homePath = os.environ["HOMEPATH"]#ウィンドウズ版ではこうだった。mac版は知らない。
ext = ".png" #".jpg"とかでも可。
separator = "\\"
name = "hoge"
filePath = homePath + separator + name + ext

とするといいかもしれない。
homepathだけだと、フォルダ区切りのバックスラッシュ(もしくは円マーク)がないので、だめ。保存してくれない。
ウィンドウズ環境では、バックスラッシュは、¥マークになりますよ。二連続でバックスラッシュ(もしくは¥)なのは、エスケープ文字だから。

外付けHDDとか、USBメモリに保存したいときは、そのままできる。

仮に、F:に、USBフラッシュメモリ等が挿さっているとして、

extrnalDisc = "F:\\"
ext = ".png" #".jpg"とかでも可。
name = "hoge"
filePath = extrnalDisc + name + ext

で、使えると思う。

4つまとめて完成。

このスクリプトは、

  1. ルートパートを選択し、
  2. ホームディレクトリ直下の、ファイル名”hoge”(拡張子.png)のファイルパスを仮に用意し、
  3. 選択した部分をレンダリングし、
  4. イメージウィンドウに表示された、レンダリング結果を、2.で準備したファイルパスに保存する。
    スクリプトです。

2.は、外付けに保存したいときは、書き換えてほしい。

#1
xshade.scene().select_parent(-1)

#2
import os
homePath = os.environ["HOMEPATH"]#ウィンドウズ版ではこうだった。mac版は知らない。
ext = ".png" #".jpg"とかでも可。
name = "hoge"filePath = homePath + "\\" + name + ext

#3
xshade.scene().rendering.render()

#4
xshade.scene().rendering.image.save(filePath)
連番画像は文字列操作で。

shadeで、連番画像で保存するには、

#1
xshade.scene().select_parent(-1)

#2
import os
homePath = os.environ["HOMEPATH"]#ウィンドウズ版ではこうだった。mac版は知らない。
ext = ".png" #".jpg"とかでも可。
for i in range(10):
name = "hoge" + "-%02.f"%i
filePath = homePath + "\\" + name + ext
#ここら辺に、オブジェクトなどを変化させるコマンドを入力する。#

#3
xshade.scene().rendering.render()

#4
xshade.scene().rendering.image.save(filePath)

とかすればいいんじゃないかと思う。

20170224 アクセス解析画面で、見てくれた人がいたようなので、
  • マークダウンがが適用されていない部分を修正。
  • 文章で、間違えている個所を修正(ホームディレクトリ→ホームディレクトリ以下)
posted by yuchan at 07:00 | Comment(0) | Shade

20170102

shadeスクリプト shade13で、レンダリング手法を、スクリプトから指定する方法

pythonを使って、レンダリング手法を設定する。

shadeには、GUIでボタンなどを、マウス(ペンタブなど)で押して、操作する方法以外にも、CUI的に、pythonインタプリタ経由で操作する方法がある。
この方法で、レンダリング手法等を、変更してみる。

ちなみに、通常は、下の画像の様に、クリックするだけで変更できる。毎回同じ設定をちまちまやっていると、忘れてしまう事もあるので、全自動にしたい。

201701012.png

レンダラーの指定は、uuidの指定とか書いてあるけど、文字列。

レンダラーの指定は、文字列でuuidを指定して行う。uuid typeを自分で用意する必要は無い。

#レイトレ
xshade.scene().rendering.method_uuid="00000002-0000-0000-0000-000000000000"
#パストレ
xshade.scene().rendering.method_uuid="00000001-0000-0000-0000-000000000000"
#トゥーンレンダラ
xshade.scene().rendering.method_uuid="18473b78-6e0b-4beb-b514-3cc9bc31d80f"

こんな感じで書いたら、エラーが返ってこなかった。

pythonには、uuid取得のための、標準モジュールが付いているけど、使わない。
uuidって勉強するとっかかりにはなる。

rendering.image.saveで保存できない場合。

レンダリングしたはずの画像がない!

カレントディレクトリは、

import os
print os.getcwd()

で、C:\Program Files\e frontier\Shade 13 (64-bit)\binと出るんだが、ない。
Cドライブ全部検索したけど、出てこなかった。
相対参照じゃだめなの?と思ったが、多分、パーミッションの問題だと思います。
アドミニストレータ―(スーパーユーザー)じゃないから、使わせない系。

保存は、ホームディレクトリ以下へ。

import os
path = os.environ["HOMEPATH"]

で、カレントディレクトリ出る。

外部は?(外付けUSBとか)

…余裕でできた。カレントディレクトリの設定が面倒だったら、”F:\”とか、書いておけばいいかもしれない。

その他のパスに関する注意

shadeというか、pythonというか、パスを文字列表現する時全般に言えるけど、円マーク(バックスラッシュ)は、エスケープ文字だから、”C:\”としたかったら、

name = "C:\\"


ロー文字列にするとか工夫しないとダメ。
ちなみに、ロー文字列も、

r"C:\"

みたいに、\のすぐ後ろで終わる書き方は、できない。

xshade.scene().rendering.style_nameは、レンダリング手法の名前ではない。

‘’’
print xshade.scene().rendering.style_name
‘’’
で得られる文字列は、画像でいうと、この部分。

20170101.png

やりたかったのは、こっち

print xshade.scene().rendering.method_name

実際、使ってみた

ざっと、一通りのレンダラー(レンダリング手法)を試して、ホームディレクトリ直下に、「レンダラの名前.png」で保存するやつ。
『背景』や、『大域照明』を設定しなければ、パストレ、レイトレの画質は、一緒。

import os
path = os.environ["HOMEPATH"]
#path="F:"#外部に保存したい場合は、Fを、自分のUSBのドライブ文字に変えて、先頭の#をとって。

#レイトレ(ドラフト)
xshade.scene().rendering.method_uuid="00000000-0000-0000-0000-000000000000"
name = path + "\\" + xshade.scene().rendering.method_name + ".png"
xshade.scene().rendering.render()
xshade.scene().rendering.image.save(name)

#レイトレ
xshade.scene().rendering.method_uuid="00000002-0000-0000-0000-000000000000"
name = path + "\\" + xshade.scene().rendering.method_name + ".png"
xshade.scene().rendering.render()
xshade.scene().rendering.image.save(name)

#パストレ
xshade.scene().rendering.method_uuid="00000001-0000-0000-0000-000000000000"
name = path + "\\" + xshade.scene().rendering.method_name + ".png"
xshade.scene().rendering.render()
xshade.scene().rendering.image.save(name)

#トゥーンレンダラ
xshade.scene().rendering.method_uuid="18473b78-6e0b-4beb-b514-3cc9bc31d80f"
name = path + "\\" + xshade.scene().rendering.method_name + ".png"
xshade.scene().rendering.render()
xshade.scene().rendering.image.save(name)

"""
#CALLISTO 何か動かない。エラー。
xshade.scene().rendering.method_uuid="20301201-53b8-11d9-bcff-000a95baceb2"
name = path + "\\" + xshade.scene().rendering.method_name + ".png"
xshade.scene().rendering.render()
xshade.scene().rendering.image.save(name)
"""

#ワイヤフレーム
xshade.scene().rendering.method_uuid="31300000-53b8-11d9-bcff-000a95baceb2"
name = path + "\\" + xshade.scene().rendering.method_name + ".png"
xshade.scene().rendering.render()
xshade.scene().rendering.image.save(name)

一覧表

レイトレーシング(ドラフト)10.0.32 0 0 0
10.500000002-0000-0000-0000-000000000000 
レイトレーシング10.0.30 0 0 0
10.500000000-0000-0000-0000-000000000000 
パストレーシング10.0.31 0 0 0
10.500000001-0000-0000-0000-000000000000 
トゥーンレンダラ10.0.318473b78 6e0b4beb b5143cc9 bc31d80f
10.518473b78-6e0b-4beb-b514-3cc9bc31d80f
CALLISTO10.0.320301201 53b811d9 bcff000a 95baceb2
10.520301201-53b8-11d9-bcff-000a95baceb2
ワイヤフレーム10.0.331300000 53b811d9 bcff000a 95baceb2
10.531300000-53b8-11d9-bcff-000a95baceb2

 

他の3Dソフトは馬鹿みたいに高い。

開発にお金がかかったのでしょうか。倒産したとたんフリーになったBlenderみたいな例もあるので、イーフロが無くなったから、shadeもフリーになるのかなぁとか、ちらと思ったけど、そうはならなかった。

自分が、pythonを勉強し始めた理由が、shadeだし、shade信者と言ったら大袈裟ですが、まぁ、「その一歩手前」といったところでしょうか。

maya, 3dsmaxは、ハイスペックPCが、3台位買えちゃうお値段。
ソフトで60万とか100万とかってどういうことだよ。
とはいえshadeもグレードによっては、それなりのお値段ですが。
自分の中では、shade=奥浩也先生。といった印象。

shadeとほぼ同じ価格帯の、Lightwaveは、グローバルスタンダードな、エントリーモデル。
(ただし、座標系が左手系。)
ガンダムサンダーボルトの太田垣康男先生も使っているので、ちょっと欲しい。

posted by yuchan at 07:00 | Comment(0) | Shade