プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:XNA修得
ステンシルシャドウ06
ACLステンシルシャドウテスト
ACLモデルはBasicEffect同等機能を実装済なので、ステンシルシャドウのサンプルコードがほぼそのまま流用できる。



◎クロスモデル連携手法

HPに、Softimageクロスモデル連携手法をまとめました。

SoftimageのシミュレーションモデルをXNAで動かす

詳細手順作成に時間がかかったのですが、クロスモデルを実装したい人の平均レベルを考えると、詳細手順は不要だったかなぁ?

でも、少しでも手順が抜けると動かなくて悩んだりするので、こうしてまとめておくと、数年後の自分に役立つかもしれません。



◎通常モデルへの適用

前々回は、ステンシルシャドゥをいきなりSftimage連携ライブラリに適用して失敗したので、今回はまず通常モデルに適用しましょう。

ステンシルシャドウ01

あれ?本体と影が離れてますね?うーん…。

試しに本体の表示位置をずらしてみると、影の表示位置が固定で本体に連動しないことに気が付きました。元のサンプルを確認すると、元のサンプルもやはり影の表示位置が本体の位置に連動しません。

ステンシルシャドウ02

元のサンプルの本体座標を原点(0,0,0)に表示するとこうなりました。

ソースを解析したら、サンプルコードの下記の部分が問題でした。

effect.World = World * Shadow;

この順番ではWorldのトランスフォームが反映されません。
下記のように修正すると影の表示位置が本体に連動するようになりました。

effect.World = Shadow * World;

ステンシルシャドウ03

木モデルの原点は足元なので、影が丁度良い位置に表示されました。

サンプルのハニワモデルは原点が中央なので、モデルの原点を足元にずらすか、コードを修正する必要があります。

// 投影行列を作成
Shadow = Matrix.CreateShadow(shadowLightDir, wallPlane)
* Matrix.CreateTranslation(wall.Normal / 100.0f)
* Matrix.CreateTranslation(new Vector3(-1, -1, -1));


ステンシルシャドウ04

実は上記コードではずらす位置が不正確なんですが、とにかく影が本体と連動するようになりました。


なんかテーマと違うことで手間取ってしまいましたが(汗)、通常モデルに対するステンシルシャドウの適用は成功です。



◎ACLへの適用

次はACLモデルです。まずは投影行列を適用してみましょう。

ステンシルシャドウ05

静止画ですが動いてます。
投影行列は無事に適用できました。さすがACL!


さて問題はここからです。レンダーステートを動的に変更する必要があるので、ACLを手動表示モードに切り替えてから、ステンシルと半透明を実装します。



おお、できました!


ACLの注意点としては、ワールド座標変換行列はアニメーターが管理するのでインスタンス毎に(複数)存在しますが、ビュー座標変換行列と斜影変換行列はエフェクトが管理するので、通常はインスタンス共通(単数)です。

…実は、上記を思い出すまでちょっと苦戦しましたw



◎技術資料

今回のサンプルコードをHPにUPしました。

ACLモデルに影(ステンシルシャドウ)を実装する

久々にACLを使いましたが、やはりSoftimageライブラリより数倍扱いやすいですねw



◎次回予告

通常モデル及びACLモデルへのステンシルシャドウ適用が成功したので、次回はSoftimageモデルへの適用に再チャレンジします。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。