DrawPolygon3D

メモリに読みこんだグラフィックを使って3Dポリゴンを描画する

DrawPolygon3D param, VertexArray, PolygonNum, GrHandle, TransFlag

Vertex : ポリゴンの頂点データへのアドレス
PolygonNum : ポリゴンの数
GrHandle : 描画するグラフィックのハンドル
TransFlag : 透過色が有効か、フラグ(TRUEで有効FALSEで無効)

(プラグイン / モジュール : DxLibW)

解説

Vertex で指定される頂点情報を元にLoadDivGraphLoadGraphMakeGraph等で読みこんだ(作成した)
グラフィックを貼り付けたポリゴンを描画します。



描画したいポリゴンの数×3個分 VERTEX_3D 構造体の    配列を用意して(この関数で描画できるポリゴンは三角形ポリゴンなので、必ずポリゴンの数×3個になります)、
VERTEX_3D 構造体にポリゴンの頂点情報を格納した後、
この関数の第一引数に VERTEX_3D 構造体の配列の先頭アドレス、
第二引数にポリゴンの数、
第三引数にポリゴンに貼り付けるグラフィックのハンドル、
第4引数に透過色を使用するかどうかのフラグを渡します。



ポリゴンに貼り付ける GrHandle が持つグラフィックの幅、
高さはそれぞれ2のn乗(2、4、8、16、32、64、128、
256、512、1024、2048等)である必要があります。
(幅と高さが同じ(つまり正方形)である必要はありません)

また、LoadDivGraph 関数等の分割読み込みしたグラフィックハンドルや DerivationGraph
関数で抜き出して作成したグラフィックハンドルも正常に描画することが出来ません。



ポリゴンの頂点定義に使用する VERTEX_3D 構造体は次のように定義されています。

struct VERTEX_3D

{

VECTOR pos ;

unsigned char b, g, r, a ;

float u, v ;

} ;

まず pos は VECTOR 構造体で、この中にポリゴンの頂点の座標を代入します。

VECTOR 構造体の中身は次のように float 型の x, y, z が存在します。

struct VECTOR

{

float x, y, z ;

} ;

ここで指定する座標はスクリーン座標と殆ど同じですが。座標値に z
があるということと、y の上下が逆になっているという点が違います。

z が0の時は普段のスクリーン座標と同じ位置に配置されますが、

z の値が大きければ大きいほどポリゴンは小さく、z の値が0より小さいと

ポリゴンは大きく描画されることになります。(ある程度のところで見えなくなります)

y の上下が逆というのはそのままの意味で、y座標0が時に画面の一番下を示し、
値が大きいほど画面上部の座標を示すことになります。

次に b, g, r には描画するグラフィックの輝度を代入します。

bが青成分、gが緑成分、rが赤成分で、代入できる値は0(0%)から
255(100%)となります。(残念ながら100%以上の輝度で描画することは
出来ません、つまり、暗くすることは出来ても元の色以上に明るくすることは出来ない
ということです・・・)

a は SetDrawBlendMode の第二引数
と同じ意味を持ちます。この関数が呼ばれた時に SetDrawBlendMode で
設定されているブレンドモードによって意味が変わってきますので、
詳細は SetDrawBlendMode 関数の解説をご参照ください。

u, v は頂点に対応する画像の位置を指定します。u が x、v が
y だと考えて問題ありません。代入できる値は 0.0f~1.0f(『f』は『float型』という意味) で、
0.0f で 座標0 を指定したことと同じになり、1.0f で画像のサイズ
と同じ値をしていたことと同じになります。

例:256x128 のテクスチャを使用した場合

u:0.0f v:0.0f = x:0 y:0

u:1.0f v:0.0f = x:256 y:0

u:1.0f v:1.0f = x:256 y:128

u:0.5f v:0.2f = x:128 y:25.6

例:64x1024 のテクスチャを使用した場合

u:0.0f v:0.0f = x:0 y:0

u:1.0f v:0.0f = x:64 y:0

u:1.0f v:1.0f = x:64 y:1024

u:0.5f v:0.2f = x:32 y:204.8

何故ドット数による指定ではなく、0.0f~1.0fの値を使うのかと言いますと、
2Dではドットの数がすなわち見た目の大きさになっていたのに対し、
3Dではドットの数が多いかどうかは純粋にテクスチャのきめ細かさに変化があるだけなので、
0.0f~1.0fの値で画像内の位置を指定するようにしておくと解像度の違うテクスチャに
差し替えてもプログラムを変更する必要が無く、何かと都合が良いからです。(多分)

戻り値:
  0:成功

情報

プラグイン / モジュールDxLibW
バージョン3.24f
作成日2026/04/12
著作者DxLib: Takumi Yamada / HSP binding: IronHSP Project
URLhttps://dxlib.xsrv.jp/
備考hspdxlib.as をインクルードして使用
タイプDxLib ゲームライブラリ
グループDxLib グラフィック描画
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\hspdxlib.hs