PR

【DXライブラリ】3D空間に線や球を描画する

DXライブラリで3D空間に線や球を描画する方法について説明しています。当たり判定などの範囲を図示したいときなどに。

2D空間に図形を描画したい場合はこちら

3D空間に線などを描画したい

DXライブラリには3Dモデルや画像、文字の描画のほかに線や三角形、球などの図形を描画する関数が用意されている

一見すると使い見たがなさそうな関数だが開発段階においてはあると便利な関数。当たり判定の範囲を図示して確認したいときとか。

描画できるのは線、三角形、球、カプセル、円錐の5つ。

線は DrawLine3D() を使う。

宣言 int DrawLine3D(VECTOR Pos1, VECTOR Pos2, unsigned int Color)
概要 3D空間に線分を描画する
引数 VECTOR Pos1 線分の始点の座標
VECTOR Pos2 線分の終点の座標
unsigned int Color 線分の色
戻り値 0 成功
-1 エラー発生

三角形は DrawTriangle3D() を使う。

宣言 int DrawTriangle3D(VECTOR Pos1, VECTOR Pos2, VECTOR Pos3, unsigned int Color, int FillFlag)
概要 3D空間に三角形を描画する
引数 VECTOR Pos1, Pos2, Pos3 三角形の各点の座標
unsigned int Color 三角形の色
int FillFlag 三角形の中身を塗りつぶすか
TRUE:塗りつぶす FALSE:しない
戻り値 0 成功
-1 エラー発生

球は DrawSphere3D() を使う。

宣言 int DrawShere3D(VECTOR CenterPos, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag)
概要 3D空間に球を描画する
引数 VECTOR CenterPos 球の中心座標
float r 球の半径
int DivNum 球を形成するポリゴンの細かさ
unsigned int DifColor 球のディフューズカラー
unsigned int SpcColor 球のスペキュラカラー
int FillFlag 球の中身を塗りつぶすか
TRUE:塗りつぶす FALSE:しない
戻り値 0 成功
-1 エラー発生

カプセルは DrawCapsule3D() を使う。

宣言 int DrawCapsule3D(VECTOR Pos1, VECROR Pos2, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag)
概要 3D空間にカプセルを描画する
引数 VECTOR Pos1, Pos2 カプセルを形成する2点の座標
float r カプセルの半径
int DivNum カプセルを形成するポリゴンの細かさ
unsigned int DifColor カプセルのディフューズカラー
unsigned int SpcColor カプセルのスペキュラカラー
int FillFlag カプセルの中身を塗りつぶすか
TRUE:塗りつぶす FALSE:しない
戻り値 0 成功
-1 エラー発生

円錐は DrawCone3D() を使う。

宣言 int DrawCone3D(VECTOR TopPos, VECROR BottomPos, float r, int DivNum, unsigned int DifColor, unsigned int SpcColor, int FillFlag)
概要 3D空間にカプセルを描画する
引数 VECTOR TopPos 円錐の頂点の座標
VECTOR BottomPos 円錐の底面の中心座標
float r 円錐の半径
int DivNum 円錐を形成するポリゴンの細かさ
unsigned int DifColor 円錐のディフューズカラー
unsigned int SpcColor 円錐のスペキュラカラー
int FillFlag 円錐の中身を塗りつぶすか
TRUE:塗りつぶす FALSE:しない
戻り値 0 成功
-1 エラー発生

サンプルコード

それでは実装。例として下の画像のように格子状に線を引きその上に球を描画するコード。

とりあえず Game.cpp に以下のコードを書き加えた。※他の3Dモデルは描画しないようにコメントアウトしています。

Game.cpp

// 初期化
void Game_Initialize() {
	// 略

	// Zバッファを有効にする
	SetUseZBuffer3D(TRUE);

	// Zバッファへの書き込みを有効にする
	SetWriteZBuffer3D(TRUE);
}

// 略

// 描画
void Game_Draw() {
	VECTOR PosA, PosB;

	// 略

	// 3D空間に線を格子状に描画
	for (int i = -10; i <= 10; i++) {
		PosA = VGet((float)i, 0.0f, -10.0f);
		PosB = VGet((float)i, 0.0f, 10.0f);

		DrawLine3D(PosA, PosB, GetColor(255, 255, 255));

		PosA = VGet(-10.0f, 0.0f, (float)i);
		PosB = VGet(10.0f, 0.0f, (float)i);

		DrawLine3D(PosA, PosB, GetColor(255, 255, 255));
	}

	// 3D空間に球を描画
	DrawSphere3D(VGet(0.0f, 0.0f, 0.0f), 1.5f, 16, GetColor(255, 0, 0), GetColor(255, 255, 255), TRUE);

	// 略
}

上のサンプルコードの場合、描画する図形の前後関係を考える必要があるため、 SetUseZBuffer3D() および SetWriteZBuffer3D() の関数を使ってZバッファの使用および書き込みを有効にしている。

ちなみにこの2つの関数は図形描画専用なので3Dモデルの描画の方にもZバッファの書き込みを有効にしたい場合は MV1SetUseZBuffer() および MV1SetWriteZBuffer() を使用すること。

コメント

タイトルとURLをコピーしました