ページ 11

DirectXにおける水面の鏡面反射

Posted: 2014年9月07日(日) 06:45
by hamu
DirectXを用いてゲームを作成している者です。

今回、船舶の水面への反射を再現しようと思い様々な文献を調べたところ、1つの方法として

「水面の平面方程式を取得し、D3DXMatrixReflect関数で水面に対して反転させる行列を得て、それを掛けて描画することにより水面に映っているように見える」

というものを発見しました。また、ステンシルバッファを用いて描画範囲を指定することで、水面にのみ反射させる方法もわかりました。

しかし実際に実装してみたところ、船舶の吃水より下の部分が、水面から浮き出たように描画されてしまいます。特に船舶が傾いて沈没する際は、鏡像が大きく水面から飛び出しています。

これを避け、「水面を基準として反転したモデルを描画」するのではなく、「水面という平面に鏡像を描画」するには、どのような方法があるのでしょうか。
要は、吃水より下の部分の鏡像が水面から飛び出さないような方法です。

問題解決にご協力いただけると幸いです。何卒回答よろしくお願いします。
なお、DirectXのバージョンは9.0cです。

Re: DirectXにおける水面の鏡面反射

Posted: 2014年9月07日(日) 16:51
by sleep
hamu さんが書きました: 船舶の吃水より下の部分が、水面から浮き出たように描画されてしまいます。特に船舶が傾いて沈没する際は、鏡像が大きく水面から飛び出しています。
求めているものと答えが違うかもしれませんが
SetClipPlaneで平面クリッピングしてあげれば水面より上は描画されないと思います。

■水面シミュレーション [2002.03.08]
http://homepage2.nifty.com/fluidmechanics/directx.htm

Re: DirectXにおける水面の鏡面反射

Posted: 2014年9月07日(日) 18:16
by hamu
ご回答ありがとうございます。
sleep さんが書きました: 求めているものと答えが違うかもしれませんが
SetClipPlaneで平面クリッピングしてあげれば水面より上は描画されないと思います。

■水面シミュレーション [2002.03.08]
http://homepage2.nifty.com/fluidmechanics/directx.htm
ご紹介いただいた関数を使用したところ、期待した通りの動作になりました。
ご協力感謝致します。