Dx_libでVERTEX_3Dの透過率aを下げても透過しない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ようすけ

Dx_libでVERTEX_3Dの透過率aを下げても透過しない

#1

投稿記事 by ようすけ » 8年前

はじめまして。

只今龍神録プログラミングのページや過去の掲示板をみながら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);
}
この状態で、load.cppで

コード:

	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;
を初期値として代入し、SetDefaultCamera() 、move_view()を実行したあと、main.cppでgraph_back00()実行しても、
描画結果はフェードせず、ただ画像が動くだけでした。
透過率aの値を見ると0から255へきちんと変化しているようなのですが原因が分かりません。
なにか透過率の理解などが間違っているのでしょうか?
正直なところ、DrawTransRotatePolygon1内のワールド行列への変換の部分はよく分かっていないため、
そこが原因なのかとも思うのですが・・・よろしくお願いいたします。

ようすけ

Re: Dx_libでVERTEX_3Dの透過率aを下げても透過しない

#2

投稿記事 by ようすけ » 8年前

連投すいません。
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;

DrawTransRotatePolygon1(img_back[td_base[0].img_id], vertegr[0], 4, p, rot1);
の前に書き足したところ、問題が解決しました。
が、なぜそのようになるのかはいまだに分かっていません。
もし詳しい方がいらっしゃればご教授いただければ幸いです。

アバター
あたっしゅ
記事: 334
登録日時: 10年前
住所: 東京23区
連絡を取る:

Re: Dx_libでVERTEX_3Dの透過率aを下げても透過しない

#3

投稿記事 by あたっしゅ » 8年前

 VC++ ですか ? BCC ですか ?
 どうして、

コード:

#include "dxlib.h"
とか、けずったソースを up しちゃうわけ ?
 コンパイルできるソースじゃなきゃ、適切なアドバイスができません。


あたっしゅ


あと、「ご教授(きょうじゅ)」は「ご教示(きょうじ)」です。
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

ようすけ
記事: 12
登録日時: 8年前

Re: Dx_libでVERTEX_3Dの透過率aを下げても透過しない

#4

投稿記事 by ようすけ » 8年前

大変失礼いたしました。VisualC++2010を使っています。
改造をしているのでソースが全体だと大規模になりgraph_back.cppの部分だけを抜粋していました。
関係のあるところだけを抜き出して動作確認したものをUPいたします。

アバター
あたっしゅ
記事: 334
登録日時: 10年前
住所: 東京23区
連絡を取る:

Re: Dx_libでVERTEX_3Dの透過率aを下げても透過しない

#5

投稿記事 by あたっしゅ » 8年前

第39章の VC++2010(10.0) Express 用の RyuJin.sin が質問のプロジェクトなのかな ?


ここでは、VC++2010(10.0) Express は人気がありません。VC++2008(9.0) Express を使用している人が多いようです。
理由のひとつは、VC++2008(9.0) Express じゃないと動かないプロジェクトが多いからです。
あたっしゅも、CUDA のサンプル・プログラムを動かすために、いったん、VC++2010(10.0) Express を
アンインストールして VC++2008(9.0) Express を入れました。そののち、VC++2010(10.0) Express を
再インストールしました。

VC++2010(10.0) Express がインストールしてある状態で、VC++2008(9.0) Express を入れるのは
危険といわれています。誰かが試したわけではないようですが。


あたっしゅ
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

ようすけ
記事: 12
登録日時: 8年前

Re: Dx_libでVERTEX_3Dの透過率aを下げても透過しない

#6

投稿記事 by ようすけ » 8年前

またまた説明不足でもうしわけありません。39章の中のRyujin.slnが質問内容のプログラムになります。
VC++2010の理由は2008だとWindows7/Vistaに対応したものを作成できないという話を聞いたためです。

アバター
あたっしゅ
記事: 334
登録日時: 10年前
住所: 東京23区
連絡を取る:

Re: Dx_libでVERTEX_3Dの透過率aを下げても透過しない

#7

投稿記事 by あたっしゅ » 8年前

ようすけ さんが書きました:VC++2010の理由は2008だとWindows7/Vistaに対応したものを作成できないという話を聞いたためです。
「VC++2010 じゃないと、Windows7/Vista の新機能を生かしたプログラムがつくれない」という意味ではないでしょうか ?

VC++2008でも、Windows7/Vista で動くプログラムはつくれます。
自分は、Windows7(x86-32)で、VC++2008 でつくったプログラムを動かしています。


あたっしゅ
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

閉鎖

“C言語何でも質問掲示板” へ戻る