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() を使用すること。

コメント