只今龍神録プログラミングのページや過去の掲示板をみながら3D背景のプログラムを組んでいます。
58章に書かれているように一定の距離でだんだんとフェードアウトしていくような背景の描画をしようと思っています。
作ったプログラムは以下の通りです。
//3D描画範囲に関する構造体
typedef struct{
int flag;
float x,y,z,len,angle,from_y,start_y;
int img_id;
}td_base_t;
VECTOR p = { 0, 0, 0 }, rot1 = {-PI/3,0,0};
//頂点情報の定義
VERTEX_3D vertegr[2][4];
//VECTOR_3Dに値を渡す関数
void Vector_ins(VERTEX_3D v[4],VECTOR rot, float x, float y,float z, float len,float fy,float sy, 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 ;
// 輝度は全要素100%
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 ;
//指定された値より小さければフェードアウト
for(int i = 0; i<4;i++)
{
if(sy<=y)
{
v[i].a = (unsigned char)0.f;
}
else if(fy <y)
{
v[i].a = (unsigned char)255.f-255.f*(y-fy)/(sy-fy) ;
}
else
{
v[i].a = 255.f;
}
}
}
// 行列計算
void CalcRotateMatrix(MATRIX *pMatResult, const VECTOR& pos, const VECTOR &rot)
{
// 移動
MATRIX m;
CreateTranslationMatrix(pMatResult, pos.x, pos.y, pos.z);
// 回転Z
CreateRotationZMatrix(&m, rot.z);
CreateMultiplyMatrix(pMatResult, &m, pMatResult);
// 回転Y
CreateRotationYMatrix(&m, rot.y);
CreateMultiplyMatrix(pMatResult, &m, pMatResult);
// 回転X
CreateRotationXMatrix(&m, rot.x);
CreateMultiplyMatrix(pMatResult, &m, pMatResult);
}
// ワールド行列を変更して表示
void DrawTransRotatePolygon1(int img, VERTEX_3D *vertex, int vertexNum, const VECTOR& pos, const VECTOR &rot)
{
// 行列計算
MATRIX matResult, matOrgWorld;
CalcRotateMatrix(&matResult, pos, rot);
GetTransformToWorldMatrix(&matOrgWorld);
// 描画
SetTransformToWorld(&matResult);
DrawPolygon3DBase(vertex, vertexNum, DX_PRIMTYPE_TRIANGLESTRIP, img, TRUE);
SetTransformToWorld(&matOrgWorld);
}
//3Dにおける中心点制御
void move_view(){
float X=640.f, Y=480.f; // ウィンドウのサイズ
float Xd=-(X/2-FMX/2-FX), Yd=0.f ; // 消失点の移動量
MATRIX mat;
CreateViewportMatrix(&mat, X/2.f+Xd, Y/2.f+Yd, X, Y);
SetTransformToViewport(&mat);
}
//カメラの初期設定
void SetDefaultCamera()
{
move_view();
MATRIX cam;
float Fx=0,Fy=0;
//カメラの位置、注視点、上方向
VECTOR vCamPos = { Fx, Fy, 100 }, vCamAt = { 0, 0, 0 }, vCamUp = { 0, 1, 0 };
CreateLookAtMatrix(&cam, &vCamPos, &vCamAt, &vCamUp);
SetTransformToView(&cam);
}
void graph_back00(){//通常背景
Vector_ins(vertegr[0],rot1,td_base[0].x,td_base[0].y,td_base[0].z, td_base[0].len,td_base[0].from_y,td_base[0].start_y,td_base[0].angle);
Vector_ins(vertegr[1],rot2,td_base[1].x,td_base[1].y,td_base[1].z, td_base[1].len,td_base[1].from_y,td_base[1].start_y,td_base[1].angle);
td_base[0].y-= 0.1f;//
DrawTransRotatePolygon1(img_back[td_base[0].img_id], vertegr[0], 4, p, rot1);
}
td_base[0].x=19.2f;td_base[0].y=45.f;td_base[0].z=0.f;td_base[0].len=50.f;
td_base[0].angle= (float)-PI/3;
td_base[0].img_id=1;
td_base[0].from_y=-15.f;
td_base[0].start_y=45.f;
描画結果はフェードせず、ただ画像が動くだけでした。
透過率aの値を見ると0から255へきちんと変化しているようなのですが原因が分かりません。
なにか透過率の理解などが間違っているのでしょうか?
正直なところ、DrawTransRotatePolygon1内のワールド行列への変換の部分はよく分かっていないため、
そこが原因なのかとも思うのですが・・・よろしくお願いいたします。