DrawPolygonIndex3dの挙動について

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

DrawPolygonIndex3dの挙動について

#1

投稿記事 by つくばさん » 3年前

プログラム中によくわからないことが起こったので質問させていただきます。
今回DrawPolygonIndexed3Dを使って画像を変形描画してみようとして以下のようなプログラムを組んでみました

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	// DXライブラリの初期化
	if (DxLib_Init() < 0)
	{
		// エラーが発生したら直ちに終了
		return -1;
	}
	VERTEX3D Vertex[6];
	WORD Index[6];
	// 2ポリゴン分の頂点のデータをセット
	int img = LoadGraph("test.png");
	Vertex[0].pos = VGet(100.0f, 100.0f, 0.0f);
	Vertex[0].norm = VGet(0.0f, 0.0f, -1.0f);
	Vertex[0].dif = GetColorU8(255, 255, 255, 255);
	Vertex[0].spc = GetColorU8(0, 0, 0, 0);
	Vertex[0].u = 0.0f;
	Vertex[0].v = 0.0f;
	Vertex[0].su = 0.0f;
	Vertex[0].sv = 0.0f;

	Vertex[1].pos = VGet(200.0f, 100.0f, 0.0f);
	Vertex[1].norm = VGet(0.0f, 0.0f, -1.0f);
	Vertex[1].dif = GetColorU8(255, 0, 255, 255);
	Vertex[1].spc = GetColorU8(0, 0, 0, 0);
	Vertex[1].u = 1.0f;
	Vertex[1].v = 0.0f;
	Vertex[1].su = 0.0f;
	Vertex[1].sv = 0.0f;

	Vertex[2].pos = VGet(100.0f, 200.0f, 0.0f);
	Vertex[2].norm = VGet(0.0f, 0.0f, -1.0f);
	Vertex[2].dif = GetColorU8(0, 255, 255, 255);
	Vertex[2].spc = GetColorU8(0, 0, 0, 0);
	Vertex[2].u = 0.0f;
	Vertex[2].v = 1.0f;
	Vertex[2].su = 0.0f;
	Vertex[2].sv = 0.0f;


	Vertex[3].pos = VGet(200.0f, 200.0f, 0.0f);
	Vertex[3].norm = VGet(0.0f, 0.0f, -1.0f);
	Vertex[3].dif = GetColorU8(0, 255, 255, 255);
	Vertex[3].spc = GetColorU8(0, 0, 0, 0);
	Vertex[3].u = 1.0f;
	Vertex[3].v = 1.0f;
	Vertex[3].su = 0.0f;
	Vertex[3].sv = 0.0f;

	Index[0] = 0;
	Index[1] = 1;
	Index[2] = 2;
	Index[3] = 1;
	Index[4] = 2;
	Index[5] = 3;




	// ESCキーが押されるかウインドウが閉じられるまでループ
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
	{
		// 画面をクリア
		ClearDrawScreen();

		DrawBox(0, 0, 1000, 1000, GetColor(255, 255, 255), TRUE);
		DrawPolygonIndexed3D(Vertex, 4, Index,2, img, TRUE);

		// 裏画面の内容を表画面に反映
		ScreenFlip();
	}
	// DXライブラリの後始末
	DxLib_End();

	// ソフトの終了
	return 0;
}
しかしこれを実行してみると元の画像が上下反転されて描画されてしまいました。
どうすれば反転されずに描画されるのでしょうか。
初心者ですがよろしくお願いします。

アバター
わらわら
記事: 32
登録日時: 5年前
住所: 横浜
連絡を取る:

Re: DrawPolygonIndex3dの挙動について

#2

投稿記事 by わらわら » 3年前

まず前提としてポリゴンには表面と裏面があります。
紙にも表面と裏面があるのと一緒です。
あなたは今ポリゴンを裏側から見ているので反対に見えるのです。

透ける紙に絵を書いて紙の下側を持ち上げて紙の裏側が見えるように裏返してみてください。
絵が反対になるのがわかるかと思います。

原因はあなたの頂点設定が裏面を描画する仕方になっているからです。
ポリゴンの表面と裏面を決めるのは頂点の描画順番が
時計回りか反時計回りかということです。
DxLibでは時計回りだとポリゴンの表面、反時計回りだとポリゴンの裏面が描画されるのではないかと思います。
ポリゴンの表面と裏面の確かめ方は「ポリゴン 表 裏」などで検索してください。

あなたは今頂点を
2  3

0  1
の順番で定義していて
2  3
 \
0 → 1
(0 →1 →2)の順番で描画しています
これは反時計回りで描画しているため裏面を描画しているのです
ですので、頂点の定義順番を変更するか、インデックスを変更すれば治ると思います

閉鎖

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