日々適当

hibitekitou

Softimageでのワイヤーフレームレンダリング

xsi |2014-02-08


SIでワイヤーフレームのレンダリングを行おうとする時、ちょっと困った気分になると思います。ビューポーとキャプチャをしてみたり、リアルタイムレンダラーでやってみたり。けれども、mentalrayには該当する項目はありません。お金をかけれるなら、Arnoldを入れちゃうといいでしょう。そのものずばりなシェーダがあるようですから。

で、mentalrayには無いと描きましたけど、SDKのサンプルとしてシェーダが納められてはいるようです。SDKの中のワークグループを指定するとそれをシェーダとして選ぶことが出来ますが、正常に動きません。コードのサンプルも入っているんで、コンパイルすることの出来る環境を持っているなら、動作するシェーダを作成可能かもしれませんね。でも、その環境を持っていないので、それは諦めます。

すると、Toonを利用する事になります。このやり方、Twitterで@JunkiTheJunkieさんに教えてもらって、ほぅ、となりました。感謝です。
やり方は簡単で、Toon_HostのSeams→Unblendのgroupにポリゴンごとに違う値を入れてやる、という物です。違う値を入れるに当たって、テクスチャを利用する(そのために適切なUVを設定しておく)方法を教えてもらいました。指定した所にインクラインを引くための機能を利用しているわけですね。

ただ、テクスチャを用意したりUVを設定してやるのは面倒だなぁと思いまして…(^^;。 (UVについてはスクリプトを走らせるのかな)
ワイヤーフレームとしてだす場合には、全てのポリゴンが違う整数値になるようにしてやればいいわけですから、ICEのアトリビュートで指定できないかと考えました。

非常に簡単にできましたよ。

とりあえず、普通にインクラインが出るような設定をしておきます。CameraにはTook_Ink_Lensシェーダを適用しておくし、オブジェクトにのマテリアルにはToon_Hostシェーダを設定しておきます。



その上で、ワイヤーフレームを出力したいオブジェクトに以下のICE Treeを構築します。NodeToPolygonで得られるノードごとのポリゴンインデックスをカスタムアトリビュートとして記録しているだけですね。ただし、単なるインデックスではなく、ちょっと数字を足して大きめの値で記録しています。



ちなみに、記録したカスタムアトリビュートの名前はPolyIDとしています。
んで、その値をマテリアルに設定したToon_Hostのunblend_groupにぶち込んでやります。unblend_groupに0を入れるとこの機能は働かないそうなので、0を入れないようにICE Treeで大きめの値を足しました。



これだけ。難点はオブジェクト全てにこの設定をせねばならないと言うことですけど、そこはまぁ、うまくやってくださいw

なお、ここではNodeToPolygonを使いましたけど、PolygonIndexでもいけそうな感じです。Nodeを使ったのは、UVも操作しようと考えたからで、既存のUVを操作して、ポリゴンごとに違う色をというような効果を狙った物を作成可能です。



ICE Treeをこんな風に設定します。既存のTexture Projectionにたいして値をいじっている形になります。その結果、UVはポリゴンごとにグリッド状に並びました。



で、テクスチャの色を流し込みます。SIデフォルトのテクスチャを差し込んでます。



ということで、レンダリングするとこんな感じ。



まぁそんなわけで、ワイヤーフレームだしが必要な時にこのやり方を今後考慮してみようと思います。
コメント ( 0 )|Trackback ( )

アーカイブユーティリティの初期設定を見直したほうがいい

mac |2014-02-05


こーんな風に大量のzipファイルをまとめて選択し、ダブルクリックするとアーカイブユーティリティを使っての伸長処理が始まるわけですが、ファイルができ上がるたびに伸長されたファイルの存在するFinderウインドウをアクティブにするため、他の作業がほぼ出来ない状態に陥ります。
その処理をして、他の作業をするために他のソフトをアクティブにしても、Finderがすぐに前に出てきてしまい、他のソフトでの(あるいはFinderの別のウインドウを使っての)作業は不可能です。
んで、zipファイルの数が少なければ待てばいいのですけど、数百ファイルとかやるとかなり待たされることになるのです。

そこで、アーカイブユーティリティの初期設定を見直しすことにしました。
/System/Library/CoreServices
にあるアーカイブユーティリティを起動して、初期設定で「展開された項目をFinderに表示」のチェックを外してやります。



これで、バックグラウンドで伸長処理を行ってくれます(ウインドウが絶えず開閉するので見た目はうるさいですが…)。
まぁ安易にダブルクリックせずに、他のユーティリティやターミナルに投げるのも手ですけどね。
コメント ( 0 )|Trackback ( )

Skybox用テクスチャを書き出すためのスクリプト

cg |2014-02-05
というわけで、書いてみましたよ。といっても、Vueのスクリプトでバッチレンダリングに投げるコマンドが分からないので、普通にレンダリングを実行する Rennder() を使っています。その結果、ちょっとした処理が必要となりました。

まず、カメラを適切な位置に持って行きます。地面にめり込んだ位置とか、想定されるシーンよりもはるかに高い高度に置いても仕方がないでしょ、というぐらいの意味です。
次にレンダリングの設定をします。ここでレンダリングクオリティ、レンダリングサイズ他、必要な情報を一通り設定します。さらに、バッチレンダリングで回るように、Renderer部分を External にしておきます。もし、HyperVueが正しく動く設定になっていないなら、Editボタンを押してちゃんと動くように設定しておきませう。



そしたらスクリプトを実行します。ここの部分はAutomation→Run Python Script... からの実行なんでしょうね。下図は過去に実行してあるならって前提の時はこっちの方が楽だよね、って図。



そしたらバッチレンダリングの管理ウインドウが開きますが、これを閉じないと次に行きません。6枚レンダリングするので、この窓を6回閉じる作業が待っています。



後はレンダリングが終わるのを待つだけです。
スクリプトは以下の通り。ここの、dirPath の行とfileNameの行が出力する場所とファイル名になるので正しく指定してやりませう。
# -*- coding: utf-8 -*-
#Rendering Cube map
import math

dirPath = "/Users/username/Desktop"
fileName = "skycube"
extension = "tif"


def GetHFoV(HFoV):
	filmW = 36.0
	return filmW/(2 * math.tan(math.radians(HFoV)/2))

SelectByType(VuePython.VOT_Camera)
camObj = GetSelectedObjectByIndex(0)
cam = camObj.ToCamera()

oriFocal = cam.Focal()
oriExp = cam.Exposure()
oriHFilmShift = cam.HorizontalFilmShift ()
oriVFilmShift = cam.VerticalFilmShift ()

oriPos = camObj.Position()
oriRot = camObj.GetRotationAngles()

oriRenderOutPut = RenderOutput()
if oriRenderOutPut == 0:
	print("VuePython.RO_MainView")
elif oriRenderOutPut == 1:
	print("VuePython.RO_Screen")
elif oriRenderOutPut == 2:
	print("VuePython.RO_Disk")

print("Original Position: %f, %f, %f "%( oriPos[0],oriPos[1],oriPos[2] ) )
print("Original Rotation: %f, %f, %f "%( oriRot[0],oriRot[1],oriRot[2] ) )
print("Original Cam Value Focal:%f, Exposure:%f, Holi Film Shift:%f, Var Film Shift:%f "%(oriFocal, oriExp, oriHFilmShift, oriVFilmShift))

HFoV = GetHFoV(90.0)

cam.SetFocal(HFoV)
#cam.SetExposure(0.0)
cam.SetHorizontalFilmShift (0.0)
cam.SetVerticalFilmShift (0.0)

message = "Render -> External?"
msgRtn = Message(message,"Check!",4)

if msgRtn == 0:
	# set front
	camObj.SetRotationAngles( 90.0, 0.0, 180.0 )
	SetRenderOutput(VuePython.RO_Disk, dirPath +  "/" + fileName + "_front" + "." + extension)
	Render()
	
	print("Close Batch Rendering Window")
	
	# set left
	camObj.SetRotationAngles( 90.0, 0.0, 90.0 )
	SetRenderOutput(VuePython.RO_Disk, dirPath + "/" + fileName + "_left" + "." + extension)
	Render()
	
	print("Close Batch Rendering Window")
	
	# set right
	camObj.SetRotationAngles( 90.0, 0.0, 270.0 )
	SetRenderOutput(VuePython.RO_Disk, dirPath + "/" + fileName + "_right" + "." + extension)
	Render()
	
	print("Close Batch Rendering Window")
	
	# set back
	camObj.SetRotationAngles( 90.0, 0.0, 0.0 )
	SetRenderOutput(VuePython.RO_Disk, dirPath + "/" + fileName + "_back" + "." + extension)
	Render()
	
	print("Close Batch Rendering Window")
	
	# set up
	camObj.SetRotationAngles( 0.0, 0.0, 180.0 )
	SetRenderOutput(VuePython.RO_Disk, dirPath + "/" + fileName + "_up" + "." + extension)
	Render()
	
	print("Close Batch Rendering Window")
	
	# set down
	camObj.SetRotationAngles( 180.0, 0.0, 180.0 )
	SetRenderOutput(VuePython.RO_Disk, dirPath + "/" + fileName + "_down" + "." + extension)
	Render()
	
	print("Close Batch Rendering Window")
	
	# Restore Cam Data
	if oriRenderOutPut == 0:
		SetRenderOutput(VuePython.RO_MainView, dirPath + "/" + fileName)
	elif oriRenderOutPut == 1:
		SetRenderOutput(VuePython.RO_Screen, dirPath + "/" + fileName)
	elif oriRenderOutPut == 2:
		SetRenderOutput(VuePython.RO_Disk, dirPath + "/" + fileName)
	
	cam.SetFocal(oriFocal)
	cam.SetExposure(oriExp)
	cam.SetHorizontalFilmShift (oriHFilmShift)
	cam.SetVerticalFilmShift (oriVFilmShift)
	
	camObj.SetRotationAngles( oriRot[0], oriRot[1],oriRot[2] )
	camObj.SetPosition( oriPos[0],oriPos[1],oriPos[2], false, false )
	
	Message("Finish","OK")
else:
	Message("Cancel","OK")

そんな感じです。
コメント ( 0 )|Trackback ( )

UnityのSkybox用のテクスチャをVueから出力する

cg |2014-02-03
Skyboxes with Vue in ShiVa and Unity [YouTube]

ここのチュートリアルそのまんまだけど。ってか、なんでUnity触ってんだ、俺?

SkyboxはCube Mapの背景を作成しておいて、それを貼り付ければいいわけだけど、残念ながらVueの File → Export Sky... とかから一発で出力させることが出来ない感じです。なぜなら、Skyboxに貼り付けるテクスチャは6枚だから。具体的にはマニュアルによると「スカイボックスは、6 つのテクスチャの箱で、それぞれが主要な方向 (+/-X, +/-Y, +/-Z) に対応しています。」だそうです。
つまり、Z軸を正面にして、右、左、後、上、下の6面が必要というわけで。

ということで、Vue内でカメラを各方向に向けて6つ作ることになります。

作り方は、とりあえず正面のカメラを作成し、それを5つ複製して、各々の方向に向ける、という作業となります。
最初に作るカメラはスクリーンの形を正方形にして、画角を90度にしておきます。



その上で、複製して各々を適切な向きにします。



カメラ名を適切につけておくとたぶん幸せになれます。
でもって、レンダリングの設定をしておいて、レンダリング。地道に一枚ずつやってもいいのですけど、バッチレンダリングさせるのがたぶん簡単です(上のリンクのチュートリアルで初めて知った。バッチレンダリングの画面で、Add Currentってあんのね)。



残念ながらでき上がる画像ファイルには適切な名前がついていないので、Finderやらエクスプローラ上で適切な名前に変えた後、Unityにインポート。
でもって、Skybox用のマテリアルにそれらテクスチャを適用して終了です。



なお、テクスチャの設定(Wrap Mode)をRepeatにしとくと継ぎ目が見えちゃうので注意。


また、上の絵で面ごとに色が違っちゃっているのは、Vueの設定を間違っているから。



Auto-exposureがオンになっているのはよろしくないですね。
まぁ、そんな感じです。

この、カメラを作成してバッチレンダリングを回すっての、スクリプトで自動化できそうなもんだけど、どうなもんだろ…
コメント ( 0 )|Trackback ( )

MODO ★ Beginners

book |2014-02-02
MODOの初めての解説書という触れ込みで1月末に発売された本。とりあえず購入してみました。
「MODOの基礎の基礎」と書かれている通り、本当にモデリング、ライティング、レンダリング、アニメーションの基礎部分だけという内容ですね。という風に書くと、つまり俺には不要なものだったのか?、というとそんなことはなく、非常に有用な内容でした。



基本的にチュートリアル形式で内容が進んでいきます。モデリング、ライティング、アニメーションはそのチュートリアルで「はと時計」を作成する過程で学んでいくという形式で、特にモデリングとライティングに多くのページが割かれています(7つの章のうち、6までがモデリングとライティング。最後の7章でアニメーションをちょっと学ぶ感じ)。
それもあって、非常に丁寧に各工程が説明されています。個人的に白眉だと思うのは、数値指定可能なパラメータについては、全てその数字が記されていること。たとえば時計の針をワールドの原点に作成したとして、それを時計の文字盤の位置に合わせるときに、「文字盤の中央、表面に来るように移動させる」というような、いい感じに調整してって説明ではなく、「エレメントは選択せずに「移動」ツールを起動し、ツールプロパティの「位置Z」に「10mm」と入力して手前に移動させます。」という風に書かれている。ツールを覚えるためのチュートリアルで大切なことは、ツールの使い方とモデリングならその手順(リズムと言ってもいいか)だと思うので、いい感じに見えるように微調整する工程というのは無駄と言えば無駄なんです。だから、そこいら辺の試行錯誤をする必要がない説明は非常にありがたかった。

で、一通りやったのですけど、大変ためになりました。それなりに長く触っているツールではあるので、当然知っているよって内容がほとんどなんですけど、メインツールがmodoではないので、これまでつまみ食い的な使い方しかしてなかったわけで、故にmodoのある意味独特な部分に微妙になじめない感じがあったのが、本に書かれた手順を読み進めることで、こーいう感覚で触っていけばいいんだと感じられたのは大変な収穫であったと思います。このあたりの感覚ってのは、マニュアルを読んでいるだけだとよく分からないのですよね。また、ビデオチュートリアルだと手順を確認して自分で実行して次の手順を確認してと逐次やっていくのが微妙につらかったりもします。

というわけで、この本、MODOを初めて使うという人や、modoはメインツールじゃないために断片的にしか使っていないって人にはとても良いんじゃないかって思いますですよ。それこそ、MODOに付属させてもいいんじゃないかってぐらいに思います。

一つだけ苦言を述べるなら、アイテム名やマテリアル名を付けるのに、日本語が使用されているってところでしょうか。
この手のアプリケーション内で使用する名前や、利用するアセット(シーンやテクスチャ他)のパスに日本語が存在することはトラブルの元だと思っているので、まぁ自分一人で完全に完結するのならいいんですけど、少しでも他の人、他の環境で使われる可能性があるのなら、半角英数字のみで名前を付けていって欲しいなぁって思っているもので…(ローマ字で日本語なのはいいけど…)。初心者には日本語使ってんじゃねぇって事を徹底させたいと思っているもので…。



でも、それ以外はとてもよい本だと思いましたよ、本当に。
コメント ( 0 )|Trackback ( )
  ・次ページ »