Bishamon Personal コミュニティ

Bishamon Personal コミュニティ 掲示板(仮運営中)です。

Bishamon Personal コミュニティ » DirectX9 » DirectX側正射影時における前後関係について

DirectX側正射影時における前後関係について

Post Reply

Page: 1

Author Post
Member
Registered: Jun 2013
Posts: 18
毎々お世話になっております。
タクティクスオウガのようなクォータービューのMAPを描画するために、
DirectX側にて正射影変換を行っています。

DirectX側が透視図法によって描画する場合、
特に問題なくBISHAMONエフェクトとの前後関係をコントロール出来たのですが、
正射影時はBISHAMONエフェクトをモデルの前に描画出来ず、
必ずモデルの後面にて描画されてしまいます。
BISHAMONを使用するにあたり、基本的なところだとは思いますが
試行錯誤してみましたが、解決の糸口が見つかりませんでした。。
どのように設定すればよいのか、何卒ご教示の程、よろしくお願いいたします。

【実現したい内容】
DirectX側が正射影変換でモデルを描画する際、
モデルの前面にBISHAMONエフェクトを描画させたい。

【ソースコード】
■DirectX側:正射影変換

D3DXMatrixPerspectiveFovLH(&m_proj, D3DXToRadian(45.0f), aspect, zn, zf);

上述の透視図法の式を、下記にて正射影に直しています。
そもそも透視図法⇒正射影への書き換え方が間違っていたら申し訳ございません。
(参考にしたブログ:http://d.hatena.ne.jp/erio_nk/20081004/1223055284)


// ビューポートの取得
D3DVIEWPORT9 vp;
aif(FAILED(pD3DDevice->GetViewport(&vp))) {
return;
}

  // アスペクト比の計算
float aspect;
aspect = (float)vp.Width / (float)vp.Height;

float zn = 1.0f;
float zf = 1000.0f;

/* 「* 50.0f」をつけないと、画面いっぱいにモデルが表示されてしまうため、
暫定的に設定しています。(怪しい部分です)*/
float near_h = zn * tan(D3DXToRadian(45.0f)*0.5f) * 2.0f * 50.0f;
float near_w = near_h * aspect;

// 射影行列の初期化
D3DXMatrixIdentity(&m_proj);

// 射影行列の設定
D3DXMatrixOrthoLH(&m_proj, near_w, near_h, zn, zf);

// マトリックスをレンダリングパイプラインに設定
pD3DDevice->SetTransform(D3DTS_PROJECTION, &m_proj);


■BISHAMON側
BISHAMON側は以下二つのように、試してみましたが駄目でした。(値の変更も試しました)
(透視図法)

 projection.perspectivefov_r(40, 4.f/3.f, 0.1f, 1000);


■BISHAMON側
(正射影)

 p.orthographic(0, width, 0, height, -100, 100);


【当環境で試した内容】
下記、BISHAMON側ではadd_translate関数でエフェクトの座標を調整して試した結果です。

?「モデル側(DirectX側):透視図法」+「エフェクト側(BISHAMON側):正射影」では、
 エフェクトをモデルの前面に描画可能ですが、モデルをエフェクトの前面には出来ませんでした。

?「モデル側:正射影」+「エフェクト:正射影」では、
 エフェクトをモデルの前に描画出来ませんでした。

?「モデル側:透視図法」+「エフェクト:透視図法」では、
 モデルおよびエフェクトの前後関係を調整可能です。

?「モデル側:正射影」+「エフェクト:透視図法」では、
 エフェクトをモデルの前に描画できませんでした。

上記?~?より、前面に表示される優先度は、
「正射影(モデル)>正射影(エフェクト)>透視図法(モデル及びエフェクト)」
となっているようでした。

長くなって申し訳ございません。
他に必要な情報があれば随時展開いたしますので言ってください。
以上、よろしくお願いいたします。
Administrator
Registered: Oct 2011
Posts: 206
Location: Tokyo
ご質問ありがとうございます。

前後関係が狂ってしまうのは、
BISHAMONで描画するものと、それ以外でニア値とファー値が違うためだと考えられます。

BISHAMONに渡す行列を作成している部分を、
下記のように変更してみてはいかがでしょうか?

float zn = 1.0f;
float zf = 1000.0f;
p.orthographic(0, width, 0, height, zn, zf);


また、正射影でない場合でも

projection.perspectivefov_r(D3DXToRadian(45.0f), width/height, zn, zf);

とするなど、BISHAMON以外の描画と合致させる必要があります。

お試し下さい。
よろしくお願い致します。
Member
Registered: Jun 2013
Posts: 18
ご返信ありがとうございます。

ご提示いただいた方法を試してみましたが
前後関係の修正には至りませんでした。

しかし、その後、試行錯誤をした結果、
以下の部分を修正してみたところ偶然にも、
エフェクトをモデルの前に描画することができました。

■DirectX側
<修正前>

/* 「* 50.0f」をつけないと、画面いっぱいにモデルが表示されてしまうため、
暫定的に設定しています。(怪しい部分です)*/
float near_h = zn * tan(D3DXToRadian(45.0f)*0.5f) * 2.0f * 50.0f;
~中略~
D3DXMatrixOrthoLH(&m_proj,near_w, near_h, zn, zf);

<修正後>

D3DXMatrixOrthoLH(&m_proj, 640.0f, 480.0f, 1.0f, 1000.0f);

//座標
D3DXMatrixTranslation( &m_world, 0.0f,0.0f, 200.0f);

※上記だけではモデルがものすごく小さく描画されてしまうため、
 D3DXMatrixScaling関数にて何十倍かに描画します。
(BISHAMONというよりDirectX側の問題になりますが、
 可能であれば他に有効な手段があればご教示頂ければ幸いです)

■BISHAMON側
<修正前>

 p.orthographic(0, 640.0f, 0, 480.0f, -100.0f,100.0f);

 
<修正後>

 p.orthographic(0, 640.0f, 0, 480.0f, 1.0f,1000.0f);

//座標
MATRIX.add_translate(320.0f,240.0f, -900.0f);

※Begin2D経由で描画しており、
 Begin2D関数内のorthographicを弄りました。

【新たな問題】
上記のようにすることで一応モデルの前にエフェクトを描画出来たのですが、
BISHAMON側のZ値を大体「-600.0f~-1000.0f」前後にしなければ、
そもそもエフェクトが表示されない事象がございます。
(前回書けておらず申し訳ございません)

znが1.0fで、zfが1000.0fであるのに、なぜかZ値がマイナスの値でないと表示されず、
また、約-600.0f~-1000.0fという大きな値且つ、限定的な範囲にしないと
描画されないようです。
また、DirectX側もZ値を200以上にする必要がありました。

どういった理屈でエフェクトを手前に描画出来たのか正直分かっておりません。
また、Z値の制限事項も多く応用が難しいのが現状です。
大変申し訳ございませんが、描画出来た理由 及び 原理についてご教示お願いします。

※恐らくBISHAMON側のorthographic関数がDirectXのD3DXMatrixOrthoLH関数と
 仕様が異なるためと考えております。
 例としては、BISHAMON側のorthographic関数を使用する際は、
 原点が画面左下にあるように見受けられました。(DirectXでは画面中央が原点)
(一応、ml_matrix44.h内を見ていますが、修正した内容でエフェクトが前面に描画できた
 理由が理解できておりません。。)
Administrator
Registered: Oct 2011
Posts: 206
Location: Tokyo
ご確認ありがとうございます。

float near_h = zn * tan(D3DXToRadian(45.0f)*0.5f) * 2.0f * 50.0f;	
float near_w = near_h * aspect;

上記の部分はご参考にしたサイトに書かれているように、
視錐台の前面の縦横幅ですので、D3DXMatrixOrthoLHに渡すべき値ではなさそうです。
正射影の描画を行う場合は<修正後>として挙げて頂いたものが一般的に思います。

また、BISHAMONに渡すビュー行列の計算は、
画面中央を原点とする場合、下記のようになります。

p.orthographic(width * -0.5f, width * 0.5f, height * -0.5f, height * 0.5f, 1.0f, 1000.0f);


Z座標の前後関係が3DCGでどのように解決されるかは
「DepthTest(深度テスト)」や「Zバッファ」、「描画順」、というような単語で
調べて頂けると良いかと思います。

よろしくお願い致します。
Member
Registered: Jun 2013
Posts: 18
「DepthTest(深度テスト)」や「Zバッファ」、「描画順」という単語で調べ、
zバッファの意味については改めて勉強しました。
ですが、正射影時に上記のような動作(Z軸が異様に大きな値でないと上手くレンダリングできない現象)になる原因は判明いたしませんでした。
手詰まり状態且つこのままでは解決できそうに無いためとても困っております。
勝手を申して大変お手数ですが、御社環境にて確認済みの
「正射影(DirectX)+正射影(BISHAMON)において、
DirectX側のモデルの前面にBISHAMONエフェクトを描画したサンプルコード」を、
どうか記載しては頂けないでしょうか。
« Last edit by Mello on Mon Jan 27, 2014 8:49 am. »
Member
Registered: Jun 2013
Posts: 18
現状の進捗状況はいかがでしょうか。教えていただければ幸いです。
前回頂いた返信内容から察するに、基本的な部分だと認識しています。
恐らく私がなにかを勘違いをして、余計なことをしているのではないかと考えますが、
正常に動作するシンプルなサンプルコード(DirectXとBISHAMONのそれぞれ肝となる部分)を
記述して頂ければ間違った個所の特定につながると考えています。
お返事を催促するようで大変申し訳ございませんが、
何卒ご対応の程よろしくお願いいたします。

※こちらからコードの提出も可能です。
« Last edit by Mello on Mon Feb 03, 2014 12:01 pm. »
Administrator
Registered: Oct 2011
Posts: 206
Location: Tokyo
ml::matrix44::orthographicを使用せず、
D3DXMatrixOrthoRH(もしくはLH)を使用して計算した行列をBMManagerに登録してみて下さい。

D3DXMATRIX d3d_proj;
D3DXMatrixOrthoRH(&d3d_proj, screen_width, screen_height, z_near, z_far);

ml::matrix44 proj;
memcpy(&proj, static_cast<CONST FLOAT*>(d3d_proj), sizeof(float[4][4]));

BMManager::SetProjection(proj);
Member
Registered: Jun 2013
Posts: 18
ご教示頂いた方法をテストプログラムにて試したところ、上手くいきました。
今回の事例を参考に本番プログラムに応用してみます。
誠にありがとうございました。

Post Reply

Page: 1

Bishamon Personal コミュニティ » DirectX9 » DirectX側正射影時における前後関係について

Bishamon Personal コミュニティ is powered by UseBB 1 Forum Software