トップページ > 記事閲覧
DrawPolygonIndexed3Dで画像を変形させると三角比が等しくならない。
名前:3Dむず過ぎ君 日時: 2021/11/05 17:55

DrawPolygonIndexed3Dで画像を変形させると、下の画像の用に2つの三角形がおかしくなります。 現実↓ https://cdn.discordapp.com/attachments/794839405382598670/906103203307868190/unknown.png 理想↓ https://cdn.discordapp.com/attachments/794839405382598670/906103575116148746/unknown.png コード↓ int Handle = DX.LoadGraph(@"WindowsXP.png"); ushort[] Index = new ushort[6]; DX.VERTEX3D[] Vertex = new DX.VERTEX3D[6]; while (DX.ProcessMessage() != -1 && DX.ClearDrawScreen() != -1) { int y = 0; Vertex[0].pos = DX.VGet(0.0f + 750, 0.0f, 0.0f); Vertex[0].norm = DX.VGet(0.0f, 0.0f, -1.0f); Vertex[0].dif = DX.GetColorU8(255, 255, 255, 255); Vertex[0].u = 0; Vertex[0].v = 1; Vertex[1].pos = DX.VGet(1280 - 750, 0.0f, 0.0f); Vertex[1].norm = DX.VGet(0.0f, 0.0f, -1.0f); Vertex[1].dif = DX.GetColorU8(255, 255, 255, 255); Vertex[1].u = 1; Vertex[1].v = 1; Vertex[2].pos = DX.VGet(0, 720, 0.0f); Vertex[2].norm = DX.VGet(0.0f, 0.0f, -1.0f); Vertex[2].dif = DX.GetColorU8(255, 255, 255, 255); Vertex[2].u = 0; Vertex[2].v = 0; Vertex[3].pos = DX.VGet(1280, 720, 0.0f); Vertex[3].norm = DX.VGet(0.0f, 0.0f, -1.0f); Vertex[3].dif = DX.GetColorU8(255, 255, 255, 255); Vertex[3].u = 1; Vertex[3].v = 0; Index[0] = 0; Index[1] = 1; Index[2] = 3; Index[3] = 0; Index[4] = 3; Index[5] = 2; DX.DrawPolygonIndexed3D(Vertex, 4, Index, 2, Handle, 0); DX.ScreenFlip(); } Vertex[0・1]のPos.X値の±750というのは、台形へと変形させる為に代入してます。
メンテ

Page: 1 |

Re: DrawPolygonIndexed3Dで画像を変形させると三角比が等しくならない。 ( No.1 )
名前:管理人 日時:2021/11/06 23:01

ポリゴンの描画では複数のポリゴンを一度に描画しても、あくまで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 ; }
メンテ
Re: DrawPolygonIndexed3Dで画像を変形させると三角比が等しくならない。 ( No.2 )
名前:3Dむずすぎ君 日時:2021/11/07 07:12

おはようございます。 サンプルコードまで御丁寧にありがとうございます! 長年悩んでいた内容なのでとても助かりました..!!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存