Bounding Box

オブジェクトのバウンディングボックスを取得したいと思い、ノード共通プロパティのmax/minで取得してみたのですがどうも結果がよろしくない。あ、ちなみに3dsmax9(まだ使ってます)の話。

target = selection[1]
BBoxMax = target.max
BBoxMin = target.min
myBox = box width:(BBoxMax.x - BBoxMin.x) \
		length:(BBoxMax.y - BBoxMin.y) \
		height:(BBoxMax.z - BBoxMin.z)
myBox.center = target.center

オブジェクトに回転が入っていない場合は正確なものが得られるのですが、回転が入っているとバウンディングボックスのバウンディングボックスを取得してしまっている模様。2Dであらわすと次の通り。

BBox Problem in maxscript

そんな値が欲しいと思いますか?とAutodeskに電話入れたい気分。
「in coordsys local」で取得するとさらにわけ分からん値が戻ってきました。

全ての頂点を精査してmax/min出せばなんとかなるんですが、頂点数の多いオブジェクトになるとすごく重くなりますねぇ。

以下のスレッドを探し当てましたが、僕が考えたのと同じく、全頂点の位置をソートしてみればってことでした。
Align min/max correctly with maxscript?[cgsociety.org]

あれ?ところで点線で描いたワールド座標じゃないバウンディングボックスはどうやって取得するんだろ?


StructureSynth 書き出し

ポッキー&プリッツの日だそうで。だからと言ってポッキー食べたわけじゃないですけど。中学1年のときの名簿が11組11番だったので全授業で指名された悲惨な一日を思い出します。

さて、公開するのを忘れてました。「Structure Synth」から「3dsmax」へデータを持ってくスクリプトです。書き出し用テンプレートとmaxscriptをセットで使用します。

Download→ss2max.zip

詳しくは書きませんが「3dsmax.rendertemplate」は「StructureSynth¥misc¥」へ入れファイルへ書き出します。「readStructureSynth.ms」は適当なところに。後はMaxから「スクリプトの起動」です。

書き出しできるプリミティブはBoxとSphereのみです。Grid等を使用している.scファイルではその項を削除するかBoxで置き換えるかしてください。

上は「ArcSphere.sc」を書き出してV-rayでレンダリングした例ですが使いもんにならないくらい重いです。約3万個のボックスです。インスタンスで配置されていますがビューポート操作はひたすら重い!

パーティクルを使用したりしてレンダリング時にジオメトリに置き換えることができればいいのですが、PFlowをmaxscriptで操作する方法をよく分かってないんです。


Structure Synth 続き

Structure SynthのサンプルについているBall2というモデルをオレオレフォーマットで書き出し3dsmaxへ読み込んでみました。

マテリアルを読み込む部分は未実装ですが、だいたい持ってこれました。ボックスのピボット位置がStructure Synthと異なるため完全ではないです。

親子関係なんかも持ってこれればアニメーションとかできていいんでしょうけど、そこまでするならもはやStructureSynthは関係なく、自前でCFDGのパーサを書けよってことになります。

書き出し用テンプレートと読込み用maxscriptはまたそのうちアップします。


Importing Clifford attractor to max9

昨日のGoogle Analytics統計を受けて、今日はクリフォード・アトラクタを3dsmax内で再現してみるの巻。

max内で計算させずに以前Proce55ingで作ったものを改良をしてポイントデータを出力するようにし、maxscriptを使ってメッシュデータとして読み込みました。といってもポリゴン情報の無い頂点オンリーのメッシュデータですが。

cliffordattractor.jpg
Proce55ingでの描画

左右反転してますがmax9に読み込んだ結果です。

さて、ここからBlobMesh合成オブジェクトを使って感じの壁紙でも作りますかぁ。とテンションあがったのですが、BlobMeshが重すぎて話しになりません。やや物足りない20,000点のポイントデータなのですが残念ながらこの方法は断念。

商用ですがPWrapperと言うパーティクルをメッシュ化するプラグインがあるみたいです。速いのかどうかは分からないですが、次回はパーティクルとして読み込んで再チャレンジです。いつになるか分かりませんが、、、

以下参考までにポイントデータと読込み用maxscriptです。
続きを読む “Importing Clifford attractor to max9”


平面にテクスチャをダッ〜っと貼る

昨年末はコレを人にやってもらったのですが、スクリプトがあっけなく出来ちゃったので、楽できます。

automap.jpg

GUIつけるのメンドくさいので、相変わらず決め打ちです。getFiles()のところで適当なテクスチャへのパスを書いて下さい。見つかった分だけ貼っ付けます。平面は先に用意しておいてください。配列コピーなり、群衆スキャッタなりで。あとは平面を複数選択して実行。

-- autoMaptex.ms by hTaka
numOfObj = selection.count;
files = getFiles "F:¥¥YOUR_TEXTURE_PATH¥¥sceneassets¥¥images¥¥*.jpg";
numOfBitmaptex = files.count;
matArray =#();
for i = 1 to numOfBitmaptex do
(
	matArray[i] = standard diffuseMap:(bitmaptexture filename:files[i]) showInViewport:true;
)
j = 1;
for i = 1 to numOfObj do
(
	selection[i].material = matArray[j];
	j = j + 1;
	if j > numOfBitmaptex do j = 1;
)

ランダムに貼付けるなら、

selection[i].material = matArray[(random 1 numOfBitmaptex)];

です。後はマテリアルの作成部分を書き換えるなりご自由に。