“FBX SDK” メモ (三角形化 KFbxGeometryConverter)

FBXファイルは四角ポリゴンも保持できるので、出力時に気をつけないと
三角と四角がごちゃごちゃになっちゃいます。

SDKには便利な事に、四角ポリゴンを三角ポリゴンへの変換が標準で備わってます。
なので、読み込み側でそこは統一をとることに。

[cc lang=”C++”]
if ( !_baseMesh->IsTriangleMesh() ) // KFbxMesh* _baseMesh
{
KFbxGeometryConverter _converter( _manager ); // KFbxSdkManager* _manager
KFbxMesh* _triangleMesh = _converter.TriangulateMesh( _baseMesh );
}
[/cc]

これで三角形化が完了します。

CopyMaxFileNameとResetViewportLayout

気がついたら、2011年になってました。。。
今年は、もう少しサイトの更新が出来ればなと
思っています。

そういう訳で、地味な “3ds max”用マクロスクリプト2点を公開

[CopyMaxFileName]
・クリップボードに現在開いているMaxファイル名をコピーする
マクロスクリプトです。
・”3ds max 2008″以降で使用してください。
・maxファイルに付随するファイルを保存するときとかに
いちいちファイル名をコピーするのが面倒なので
作ってみました。

ダウンロード:CopyMaxFileName_110114.zip
 
 
[ResetViewportLayout]
・ビューポートのレイアウトを標準に戻すマクロスクリプトです。
・他人の作ったファイル開いた時に、レイアウトが変わってると
凹むので作ってみました。

ダウンロード:ResetViewportLayout_110114.zip
 
 
 
ご意見、ご要望等がありましたら、コメントなりメール
ください。

DirectXでFBX 続きの続き

前回は単純にトランスフォーム行列を取得しただけですが、
実際に使うとなると座標系をDirectX基準に合わせなければなりません。

調べてみると “FBX SDK” には標準でこの変換が出きるようなので早速使ってみる

[cc lang=”C++”]
KFbxAxisSystem lSceneAxisSystem = lScene->GetGlobalSettings().GetAxisSystem()
KFbxAxisSystem lTargetAxisSystem(KFbxAxisSystem::DirectX)
if(lSceneAxisSystem != lTargetAxisSystem)
lTargetAxisSystem.ConvertScene(lScene);
[/cc]

これで、FBXのファイルが Y-Up だろうが Z-Up だろうが LeftHand だろうが
RightHand だろうが、シーンがDirectXの座標系(Y-up, RightHand)に変換されます。

LeftHand が欲しいときはどうすれば良いんだ? と見てみると
“KFbxAxisSystem” は個別で軸を指定できるようです。
ただ、自分の環境では上手く変換されませんでした。。。
とりあえず、Z軸に-1をかけて対処してますが、なんかスッキリしない。。。
使い方が悪いのかな?

ライトフィールドを考える

「ソニック・ワールド・アドベンチャー」グラフィックス講座

を読んで、ライトフィールドって物理的に正確じゃない空間の動的キャラクタへの
ライティングに使えるじゃないのかな? と思い試してみる

まずは、特定の空間を分割
そのポイントから全方位(とりあえず40本ぐらい)にレイを発射
レイがメッシュと衝突したらそこのUV座標を採取
採取したUV座標からテクスチャの色を取得
その後、飛ばしたレイの本数と衝突までの距離から空間ポイントでの
色(明るさ?)を算出

ざっくりとこんな感じで空間ポイントの色(明るさ?)を出せるのですが
問題は、その値をどうやって保存しておくか
せっかくなので、リアルタイムな環境でこの値を使いたいので
やっぱり、テクスチャとして保存したいと思うのが人情

で、三次元を二次元に効率よく収める方法を現在模索中
なんか良い方法ないかな?
やっぱ、テーブルデータとして保存した方がいいのかな?

DirectXでFBX 続き

前回FBX
(Lcl Scaling * (Lcl Rotation * PreRotation) * Lcl Translation )
な計算をしてトランスフォーム行列を出していたわけですが、
一発で取得出来たみたいですね。。。

[cc lang=”C++”]
KFbxAnimEvaluator* mySceneEvaluator = myScene->getEvaluator();
//Get node’s default TRS properties as a transformation matrix
KFbXMatrix& myNodeDefaultLocalTransform = mySceneEvaluator->GetNodeLocalTransform(myNode);
[/cc]

ちなみにこれは相対なトランスフォーム行列を取得する場合
絶対なトランスフォーム行列を取得する場合は

[cc lang=”C++”]
KFbxAnimEvaluator* mySceneEvaluator = myScene->getEvaluator();
//Get node’s default TRS properties as a transformation matrix
KFbXMatrix& myNodeDefaultGlobalTransform = mySceneEvaluator->GetNodeGlobalTransform(myNode);
[/cc]

どちらも便利便利^^
ドキュメントは隅から隅まで読むべきですね!!

DirectXでFBX

FBXの座標系がやたらめったらにややこしいので忘れないように、メモ
FBX2011.2を使用
出力ソフトは “3ds max”, “Softimage Mod Tool”, “Blender”

【Up軸】
・出力ソフトによって異なる
・KFbxGlobalSettings の GetAxisSystem().GetUpVector
で確認が出来る

【座標系】
・出力ソフトによって異なる
・KFbxGlobalSettings の GetAxisSystem().GetCoorSystem
で確認が出来る

【Y-up → Y-up】
・(Lcl Scaling * (Lcl Rotation * PreRotation) * Lcl Translation )(*1)

【Z-up → Y-up】
・(Lcl Scaling * (Lcl Rotation * PreRotation) * Lcl Translation )
* rotation(-90, 0, 0)(*1)

【左手 → 左手】
・特になにもせず

【右手 → 左手】
・(*1) * scale(1.0, 1.0, -1.0)
・UVとNormalのZの値が反転するのでそれぞれ符号を反転

本当はもっといろんなソフトで書き出したファイルをサンプルに
試さないとダメな気がするけど。。。
特にMayaで書き出したファイルを試してないのが大問題。。。

PhotoshopでDDS

“Photoshop” でDDS(DirectDraw Surface)形式ファイルに保存する場合、
NVIDIAが提供している“NVIDIA Plug-ins for Adobe Photoshop”
使えば簡単に保存することが出来ます。

が、

このプラグイン、困ったことにアルファチャンネルが存在すると、
使い方が悪いのか、DDSでファイルを保存することが出来なかった
りします。(出来る方法あったら教えてー)
大半の人は別に困らないかもしれませんが、個人的には大困り。。。

そう言うわけで、何となくDDS出力プラグイン作ってみました。

(Continue reading…)

maxscript と Twitter

max での作業中に直接つぶやいてみたり、TL確認したりとか
スクリーンショットを晒してみたりとか、夢は一杯広がるけど
技術が追いつかない。。。 Twitter APIが難しすぎる。。。
ログインとかそこら辺は何とかなりそうな予感
つぶやきが面倒くさそう
そこらへん上手いことやってくれるライブラリないかなー
まわりの目を気にしながら、日頃 Twitter を楽しんでる
maxユーザー(主に自分)のためを思うと頑張らないと!!

くれぐれも仕事は真面目に

テクスチャーレンダリングで、”縞ニーソ”

3ds max” でテクスチャーレンダリングと言えば、ライティングの
結果などををテクスチャにレンダリングしてそのまま使っちゃおう
という機能ですが、正直自分はこの使い方をしたことがありません
ですが、別の使い方でこの機能を使います。
それは、既存のマップチャンネルを用いて新規マップチャンネルの
テクスチャを焼き付けるといった使い方です。
自分で書いてて意味がわかりませんんね。。。

以下、順を追って説明です
(Continue reading…)