[Dx_lib]3D描画で画像をループ、フェードインさせたい
Posted: 2011年12月22日(木) 22:57
今、龍神録をベースにSTGを作ろうとしており、龍神録59章にあるように画像を連続でループ、3D表示をさせようとしています。
VC+2010を使って開発を行っています。プログラミング暦はC++は半年程度です。あまり良く分かっていません。
しかし画像のフェードインの入り方が非常に不恰好な状態です。
59章にあるように「フェードイン開始場所(fy、59章ではFromZにあたる部分)」「フェードイン終了場所(start_y、59章ではFadeFromZ)」を定め、
以下のような関数でフェードインを設定しています。
x,y,zを中心とし、lenによって画像の大きさを制御、端の4点を計算し描画している状態になります。
画像はy方向の負に向かって進み、徐々に小さくなっていきます。
len=25、fy=105、start_y=55、でyが徐々に小さくなっていくと思っていただければいいかと思います。
この後で、DrawPolygon3Dbaseで描画するのですが、
具体的に何が起こるかというと、fyに、yの下端が重なった瞬間に全体が表示されてしまいます。
結果、本当はfyよりもyの値が大きい場合には表示されて欲しくない画像がfyよりも前にあるときにも画面に出てしまい
画像が急にぼうっと現れた状態になってしまいます。
そこで、自分なりにDrawPolygon3Dbaseの透過度によるグラデーションの仕様を考えてみたのですが、
添付する画像と同じイメージで合っているでしょうか?
もしこうなっているのであれば、画像の下端がfyと同じになった瞬間に画像全体が表示されてしまうこともうなづけます。
もしそうであれば、どうすれば第59章の地面のように綺麗にフェードインさせることが出来るでしょうか?
59章のサンプルでは画像を限りなく遠くでフェードアウトさせることでごまかしているように見えるのですが
どうやっているかは完全にはまだ理解できていません。
分かりにくい質問で申し訳ありません、できればソース全文を貼りたいのですがコードが大規模になってしまっているため、
もし質問に具体的にお答えいただける方がいらっしゃるようであればすぐにソースコードをZipで貼らせて頂きます。
VC+2010を使って開発を行っています。プログラミング暦はC++は半年程度です。あまり良く分かっていません。
しかし画像のフェードインの入り方が非常に不恰好な状態です。
59章にあるように「フェードイン開始場所(fy、59章ではFromZにあたる部分)」「フェードイン終了場所(start_y、59章ではFadeFromZ)」を定め、
以下のような関数でフェードインを設定しています。
x,y,zを中心とし、lenによって画像の大きさを制御、端の4点を計算し描画している状態になります。
画像はy方向の負に向かって進み、徐々に小さくなっていきます。
len=25、fy=105、start_y=55、でyが徐々に小さくなっていくと思っていただければいいかと思います。
この後で、DrawPolygon3Dbaseで描画するのですが、
具体的に何が起こるかというと、fyに、yの下端が重なった瞬間に全体が表示されてしまいます。
結果、本当はfyよりもyの値が大きい場合には表示されて欲しくない画像がfyよりも前にあるときにも画面に出てしまい
画像が急にぼうっと現れた状態になってしまいます。
//VECTOR_3Dに値を渡す関数
void Vector_ins(VERTEX_3D v[4],VECTOR &rot, float x, float y,float z, float len,float fy,float start_y, float angle)
{
v[0].pos.x = x-len; v[0].pos.y = y+len ; v[0].pos.z = z;
v[0].u = 0.0F ;
v[0].v = 0.0F ;
v[1].pos.x = x-len; v[1].pos.y = y-len ; v[1].pos.z = z;
v[1].u = 0.0F ;
v[1].v = 1.0F ;
v[2].pos.x = x+len; v[2].pos.y = y+len ; v[2].pos.z = z;
v[2].u = 1.0F ;
v[2].v = 0.0F ;
v[3].pos.x = x+len; v[3].pos.y = y-len ; v[3].pos.z = z;
v[3].u = 1.0F ;
v[3].v = 1.0F ;
v[0].r = v[0].g = v[0].b = 255 ;
v[1].r = v[1].g = v[1].b = 255 ;
v[2].r = v[2].g = v[2].b = 255 ;
v[3].r = v[3].g = v[3].b = 255 ;
//指定された値より小さければフェードアウト
if(type == 1)
{
for(int i = 0; i<4;i++)
{
if(start_y<=v[i].pos.y)
{
v[i].a = (unsigned char)0.f;
}
else if(fy <v[i].pos.y && start_y > v[i].pos.y)
{
v[i].a =255.f*(start_y-v[i].pos.y)/(start_y-fy) ;
}
else
{
v[i].a = 255.f;
}
}
}
}
そこで、自分なりにDrawPolygon3Dbaseの透過度によるグラデーションの仕様を考えてみたのですが、
添付する画像と同じイメージで合っているでしょうか?
もしこうなっているのであれば、画像の下端がfyと同じになった瞬間に画像全体が表示されてしまうこともうなづけます。
もしそうであれば、どうすれば第59章の地面のように綺麗にフェードインさせることが出来るでしょうか?
59章のサンプルでは画像を限りなく遠くでフェードアウトさせることでごまかしているように見えるのですが
どうやっているかは完全にはまだ理解できていません。
分かりにくい質問で申し訳ありません、できればソース全文を貼りたいのですがコードが大規模になってしまっているため、
もし質問に具体的にお答えいただける方がいらっしゃるようであればすぐにソースコードをZipで貼らせて頂きます。