言語はC++でVisualC++2010を用いています。
過去の掲示板などを参考に3Dの背景についてプログラミングを勉強しているのですが、
過去の掲示板の質問の中で以下のようなコードが紹介されていました。
#include "DxLib.h"
#include <cstdlib>
// 行列計算
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, FALSE);
SetTransformToWorld(&matOrgWorld);
}
// 頂点を変更して表示
void DrawTransRotatePolygon2(int img, VERTEX_3D *vertex, int vertexNum, const VECTOR& pos, const VECTOR &rot)
{
// 行列計算
MATRIX matResult;
CalcRotateMatrix(&matResult, pos, rot);
// 座標計算
VERTEX_3D *v = (VERTEX_3D*)std::malloc(sizeof(VERTEX_3D) * vertexNum);
if(v == NULL) return;
for(int n=0; n<vertexNum; ++n)
{
v[n] = vertex[n];
VectorTransform(&v[n].pos, &v[n].pos, &matResult);
}
// 描画
DrawPolygon3DBase(v, vertexNum, DX_PRIMTYPE_TRIANGLESTRIP, img, FALSE);
std::free(v);
}
// カメラ設定
void SetDefaultCamera()
{
MATRIX cam;
VECTOR vCamPos = { 0, 0, 100 }, vCamAt = { 0, 0, 0 }, vCamUp = { 0, 1, 0 };
CreateLookAtMatrix(&cam, &vCamPos, &vCamAt, &vCamUp);
SetTransformToView(&cam);
}
// 頂点情報
const float basePosX = 0.f, basePosY = 0.f, basePosZ = 0.f, baseLengh = 20.f;
VERTEX_3D vertex[] =
{
{ basePosX - baseLengh, basePosY + baseLengh, basePosZ, 255, 255, 255, 255, 0.f, 0.f },
{ basePosX - baseLengh, basePosY - baseLengh, basePosZ, 255, 255, 255, 255, 0.f, 1.f },
{ basePosX + baseLengh, basePosY + baseLengh, basePosZ, 255, 255, 255, 255, 1.f, 0.f },
{ basePosX + baseLengh, basePosY - baseLengh, basePosZ, 255, 255, 255, 255, 1.f, 1.f },
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hP, LPSTR lpC, int nC)
{
// 初期化
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return(-1);
SetDrawScreen(DX_SCREEN_BACK);
int img = LoadGraph("test.png");
const float pi = 3.1415926535f, offsetRotate = 1.f * pi / 180.f;
VECTOR p1 = { 20, 0, 0 }, p2 = { -20, 0, 0 }, rot = { 0 };
// カメラ設定
SetDefaultCamera();
//メインループ
while(ProcessMessage() == 0)
{
char key[256];
GetHitKeyStateAll(key);
if(key[KEY_INPUT_ESCAPE]) break;
if(key[KEY_INPUT_DOWN]) rot.x += offsetRotate;
if(key[KEY_INPUT_UP]) rot.x -= offsetRotate;
if(key[KEY_INPUT_LEFT]) rot.y += offsetRotate;
if(key[KEY_INPUT_RIGHT]) rot.y -= offsetRotate;
ClearDrawScreen();
DrawTransRotatePolygon1(img, vertex, 4, p1, rot);
DrawTransRotatePolygon2(img, vertex, 4, p2, rot);
ScreenFlip();
}
DxLib_End();
return 0;
}
本来のDx_libのDrawPolygon3Dのリファレンスでは、「PolygonNum × 3 個の頂点データが必要になります。」とあります。
しかし実際に実行すると、きれいに四角形の画像が表示されています。
これは内部で何が起こっているのでしょうか。
最初、「4端の点と中心から4つの3角形のテクスチャを作っているのでは」とも思いましたが中心の座標がないため
どのような形でテクスチャが作られているのかがわかりません。
お教えいただければ幸いです。