DXライブラリにおける回転・拡大させたプリミティブ描画

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Sigma
記事: 20
登録日時: 9年前

DXライブラリにおける回転・拡大させたプリミティブ描画

#1

投稿記事 by Sigma » 8年前

DXライブラリでのプリミティブ描画でマトリクスを使用した回転・拡大変形描画をしているのですが、
マトリクスによる「ベクトルに置き換えた頂点座標」の回転・拡大変形をさせると描画されなくなってしまいます。
1つの画像の一部分を矩形指定して描画する仕組みなのですが、マトリクスによる算出を行うと描画されなくなってしまいます。

1つのプリミティブ描画オブジェクトを制御するPrimitiveObjクラス内

コード:

void PrimitiveObj::DrawPrimitive()
{
	for(int i=0; i<mVernum; i++)
	{
		MATRIX mrx = MGetScale(mScale);
	 	mVertexes[i].pos = VTransform(
		VGet(	mPosition.x+mVerPos[i].x,
				mPosition.y-mVerPos[i].y,
	 			mPosition.z+mVerPos[i].z), mrx);
	}
	
	SetDrawBlendMode( mBlendMode, 255 );
	DrawPolygonIndexed3D( mVertexes, mVernum, mIndex, mVernum-2,
		mImgHnd, TRUE ) ;
	SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
}
打開できなければ単純に計算して座標だそうかと思うのですが
やはりマトリクスのほうが速いのでしょうか。
どちらかがいいか、そしてマトリクスが良いのなら打開策を教えていただければと思います。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: DXライブラリにおける回転・拡大させたプリミティブ描画

#2

投稿記事 by ISLe » 8年前

DrawPolygonIndexed3D関数に与える頂点インデックスの要素数がmVernum-2というのは正しいですか?
頂点数より少ないことはありえない気がしますけど。

Sigma
記事: 20
登録日時: 9年前

Re: DXライブラリにおける回転・拡大させたプリミティブ描画

#3

投稿記事 by Sigma » 8年前

DrawPolygonIndexed3Dの4つめの引数ですよね?
そこはポリゴン数(三角形の数)なんで
頂点数-2=ポリゴン数
で合ってるはずです。

ちなみにはしご式にポリゴンを組立ててる前提です。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: DXライブラリにおける回転・拡大させたプリミティブ描画

#4

投稿記事 by ISLe » 8年前

すみません。ポリゴン数ですね。

トライアングルストリップを想定していらっしゃるようですが、DrawPolygonIndexed3D関数はトライアングルリスト仕様なので、ポリゴン数×3の頂点インデックスが必要です。

DrawPolygonIndexed3DBase関数を使えばトライアングルストリップを使うことができます。

Sigma
記事: 20
登録日時: 9年前

Re: DXライブラリにおける回転・拡大させたプリミティブ描画

#5

投稿記事 by Sigma » 8年前

一応インデックス配列を整備してトライアングルストライプの実現はしてます

コード:

void PrimitiveObj::SetPrimitiveType(int type)
{
	if(mIndex==NULL) delete[] mIndex;
	switch(type)
	{
	case PRIM_TRIANGLESTRIP:
		mIdxnum = (mVernum-2)*3;
		mIndex = new WORD[mIdxnum];
		for(int i=0; i<(mIdxnum/3); i++)
		{
			mIndex[i*3]   = i;
			mIndex[i*3+1] = i+1;
			mIndex[i*3+2] = i+2;
		}
		break;
	case PRIM_TRIANGLEFAN:
		mIdxnum = (mVernum-2)*3;
		mIndex = new WORD[mIdxnum];
		for(int i=0; i<(mIdxnum/3); i++)
		{
			mIndex[i*3] = 0;
			mIndex[i*3+1] = i;
			mIndex[i*3+2] = i+1;
		}
		break;
	default:
		mIdxnum = mVernum;
		mIndex = new WORD[mIdxnum];
		for(int i=0; i<mIdxnum; i++)
		{
			mIndex[i]   = i;
		}
	}
}
でも元々準備されてたのですね、知りませんでした…

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: DXライブラリにおける回転・拡大させたプリミティブ描画

#6

投稿記事 by ISLe » 8年前

まったく描画されないのでしたっけ?

トライアングルストリップは増えた頂点一個毎にポリゴンの向きが入れ替わるので、順番そのままだと一個置きにポリゴンが表示されないのでは。
DXライブラリはカリングOFFがデフォルトなので関係無いですかね。

あとはVERTEX3Dのpos以外のメンバの影響でしょうか。


いまさらですが、プリミティブ描画で都度頂点座標を求める(変化する)場合、頂点座標はCPUで計算して求めてますから、マトリクスを使ったからといって速くなるわけではないです。
むしろ計算量は増えますので、トライアングルリストで画面に表示される板ポリはすべて一回のDrawPolygonIndexed3D呼び出しで描画する、というような使い方をしないと逆に遅くなると思います。
マトリクス使わなくても何回も描画関数呼んだらそれだけで遅くなりますけどね。

Sigma
記事: 20
登録日時: 9年前

Re: DXライブラリにおける回転・拡大させたプリミティブ描画

#7

投稿記事 by Sigma » 8年前

ふむ…そうですか。
では一応マトリクスを使わない方向でいこうと思います。
ありがとうございました。

閉鎖

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