2010/8/10 Na-7
2010/8/12 Na-7
2010/8/14 Na-7
2010/11/14 Na-7

技術資料一覧に戻る

 

XNA向けSoftimageモデルの最大ボーン数を増やす

注意 この資料は、筆者が自らの経験を記録したものであり、他人に勧めるものではありません。

この資料を参考として行った行為がいかなる結果になろうとも、筆者は責任を負いませんので予めご承知おきください。

 

◎目次

◎概要
◎使用ツール
◎サンプル コード(HLSL)
◎サンプルコード(XNAViewer本体改修コード)
◎補足事項

 

 

◎概要

Softimageで作成したスキンアニメモデルをXNAに渡す場合、最大ボーン数は58だが、これでは足りないケースがある(例:Softimageで「二足ガイドからリグ作成」機能で取得したリグをXNAに渡すには108ボーン必要)。

そこで、ひにけにXNAの記事を参考にプログラムを改修し、最大ボーン数の増加を図る。

筆者は1番と2番の手法を試してそれぞれ成功した。1番の実装は簡単なので説明は省略する。

本稿では2番をXNAViewerに実装したサンプルコードを紹介する。これにより最大ボーン数は117となる。

但し、スケールを持つポーンアニメーションには対応していないので注意すること。(詳細はひにけにXNAの記事参照)

 

 

 

◎使用ツール

ツール名 入手元
XNA3.1(XNA GameStudio 3.1:ゲーム開発用フレームワーク) http://msdn.microsoft.com/ja-jp/xna/default.aspx
Softimage(旧名称XSI:Softimage Mod Tool 7.5:三次元CG製作用ソフトウェア) http://www.softimage.com/products/modtool/

 

 

◎サンプルコード(HLSL)

xsi_defaultvs.hlsl(XNAViewer付属HLSLを改修したサンプル)

 

 

 

◎サンプルコード(XNAViewer本体改修コード)

XNAViewer本体の DrawModel() 内の if (isSkinned) 以下のコードを下記のように改修する。
 

    // bind bones
   
if (isSkinned)
    {
       
// ボーン数増加改修
        // if ((effect.Parameters["Bones"] != null) && isSkinned)
       
if ((effect.Parameters["BoneRotations"] != null) && isSkinned)
        {
           
// effect.Parameters["Bones"].SetValue(bones);

            // 行列の分解
           
Quaternion[] rotation = new Quaternion[bones.Length];
           
Vector3[] translation = new Vector3[bones.Length];
           
Vector3 scale;
           
for (int i = 0; i < bones.Length; i++)
            {
                bones[i].Decompose(
out scale, out rotation[i], out translation[i]);
            }
            effect.Parameters[
"BoneRotations"].SetValue(rotation);
            effect.Parameters[
"BoneTranslations"].SetValue(translation);
        }
    }

 

◎補足事項

・Drow()内で毎回Decomposeを実施しているため、描画パフォーマンスが悪い(多数モデル同時表示には不向き)
 →描画パフォーマンスを上げたい場合は、ひにけにXNAの記事を参考にXNAViewerプログラムを改修すること

スケールを持つポーンアニメーションには対応していないので注意すること
 →Softimage側で、グローバル座標表示時のスケール値が常に1になるよう注意すること(詳細はブログの「◎サイズの座標系」参照
 →スケール値を修正する場合は「Transform>すべての変換をリセット」と「Transform>すべての変換をフリーズ」を利用すると良い
 →XNA側で、モデル全体のスケール変更は可能

・yoh氏曰く「ひにけにXNAのクォータニオン対応HLSLコードはクォータニオン間の内積が負だった場合の符号反転を加味していないように見える」とのこと
 →内積(4つの要素それぞれの積の和)が負になる2つのクォータニオンにQlerp(単純に4つの要素の重みを掛けてブレンドする)を適用すると、補間の途中が崩れる
  →呼び出す側であらかじめクォータニオンを操作すれば(HLSLはそのままで)対処可能?
 →激しいアニメーションは破綻する可能性がある(例:クロスシミュレーションなどで親子以外のボーンがブレンドされる時など)
 →通常の関節アニメーションではブレンドされるボーンが親子関係にあるため問題が起きることは滅多にない
 →気になる人は自身でコードを解析するか、掲示板に書き込むこと

(2010/11/14追記)
・本稿の改修をXNAViewerに適用する場合、こちらのA方式で渡すと、モデルオブジェクトのスケールが反映されない
 →ワールド座標変換行列はエフェクトパラメータで渡すこと(こちらのB方式)
 

inserted by FC2 system