ポリゴンの描画では複数のポリゴンを一度に描画しても、あくまで3角形ポリゴン一つ一つ独立して
テクスチャが貼られますので、『2つの3角形ポリゴンが合わさって台形になっているから、台形型に画像を変形』
といった気の利いたことはしてくれません
なので、台形の描画に使用するポリゴンをもっと増やして理想の形に近づけます
例えば、1つの台形を表現する頂点の数を 4つから 9つに増やして( 縦横3つづつなので 3×3 = 9 )、
併せてポリゴン数も2つから8つに増やすとポリゴン2つの場合よりは理想に近くなります
( 四隅以外の頂点は自前で理想の位置を計算した座標になるので… )
頂点の数を更に 16つに増やして( 縦横4つづつなので 4×4 = 16 )、
併せてポリゴンの数も 18つに増やすと更に理想に近くなります
( 理想の位置の座標の頂点が更に増えるので… )
上記の例を実際にプログラムにしてみたサンプルを作成してみましたので、よろしければ参考にしてください m(_ _)m
( DIV_NUM の値が大きくなればなるほど頂点数が増え、理想に近くなります、また、
値が大きいほど頂点数・ポリゴン数が増え、負荷が増大するので、見た目のクオリティと負荷のバランスの取れた値にする必要があります )
#include "DxLib.h"
// 台形を形成するポリゴンの細かさ
#define DIV_NUM 16
// 台形を描画
// DrawModiGraph と同じで、Pos1=左上の座標、Pos2=右上の座標、Pos3=右下の座標、Pos4=左下の座標 となっています
void DrawTrapezoid( VECTOR Pos1, VECTOR Pos2, VECTOR Pos3, VECTOR Pos4, int GrHandle, int TransFlag )
{
VERTEX3D Vertex[ DIV_NUM * DIV_NUM ] ;
WORD Index[ ( DIV_NUM - 1 ) * ( DIV_NUM - 1 ) * 6 ] ;
int k ;
VECTOR Pos2_1 = VSub( Pos2, Pos1 ) ;
VECTOR Pos3_4 = VSub( Pos3, Pos4 ) ;
// 頂点の準備
k = 0 ;
for( int i = 0 ; i < DIV_NUM ; i ++ )
{
for( int j = 0 ; j < DIV_NUM ; j ++, k++ )
{
// UV値の算出
float u = ( float )j / ( DIV_NUM - 1 ) ;
float v = ( float )i / ( DIV_NUM - 1 ) ;
// Uの値に基づいた 左上座標→右上座標 と 左下座標→右下座標 の中間座標2つを算出
VECTOR vec1 = VAdd( VScale( Pos2_1, u ), Pos1 ) ;
VECTOR vec2 = VAdd( VScale( Pos3_4, u ), Pos4 ) ;
// Vの値に基づいて2つの中間座標から頂点の座標を算出
VECTOR vec2_1 = VSub( vec2, vec1 ) ;
Vertex[ k ].pos = VAdd( VScale( vec2_1, v ), vec1 ) ;
// UV値の代入
Vertex[ k ].u = u ;
Vertex[ k ].v = v ;
// 固定値の代入
Vertex[ k ].norm = VGet( 0.0f, 0.0f, -1.0f ) ;
Vertex[ k ].dif = GetColorU8( 255, 255, 255, 255 ) ;
}
}
// インデックスの準備
k = 0 ;
for( int i = 0 ; i < DIV_NUM - 1 ; i ++ )
{
for( int j = 0 ; j < DIV_NUM - 1 ; j ++, k += 6 )
{
Index[ k + 0 ] = j + 0 + ( i + 0 ) * DIV_NUM ;
Index[ k + 1 ] = j + 1 + ( i + 0 ) * DIV_NUM ;
Index[ k + 2 ] = j + 0 + ( i + 1 ) * DIV_NUM ;
Index[ k + 3 ] = j + 1 + ( i + 1 ) * DIV_NUM ;
Index[ k + 4 ] = Index[ k + 2 ] ;
Index[ k + 5 ] = Index[ k + 1 ] ;
}
}
// ポリゴンの描画
DrawPolygonIndexed3D( Vertex, DIV_NUM * DIV_NUM, Index, ( DIV_NUM - 1 ) * ( DIV_NUM - 1 ) * 6, GrHandle, TransFlag ) ;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ;
SetGraphMode( 1280, 720, 32 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
int GrHandle = LoadGraph( "Src1.bmp" ) ;
// 台形の描画
DrawTrapezoid(
VGet( 0.0f, 720.0f, 0.0f ),
VGet( 1280.0f, 720.0f, 0.0f ),
VGet( 750.0f, 0.0f, 0.0f ),
VGet( 530.0f, 0.0f, 0.0f ),
GrHandle, FALSE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}