PSPSDKの定数追加や若干の仕様変更により、心理的にかなりのダメージ
を受けた上、PSPのファームウエア・アップグレードでWEBブラウザが
使えるようになったりとか罠満載で続行も危ぶまれる『PSPSDKプログラミング
日誌』ですが、それでも、踏ん張って付いて来てくれるものと信じてがんばり
ます。...ええ、がんばりますとも...無駄に(;_;)
『3Dグラフィックス入門(その2) GU描画 』、『3Dグラフィックス入門(その2)
GU描画 』を経て、PSPのGUとGEを使用する際の初期化と描画命令に
ついて簡単に説明してきました。そう、もうあなたはPSPで自由自在に3D
グラフィックスをもてあそぶ事ができるでしょう...できる...といいな(・_・;)
今回はGUやGEについての説明というより、3Dグラフィックスの説明に
なります(でも難しい事は説明できないので、都合が悪い場合はスルー
です。お約束です)。
今回も長くなってしまいました。頂点座標についての説明に留まります。
【頂点定義について】
GUにポリゴン描画(三角形だけどちゃんと覚えてるかな?)を行う場合
まず頂点座標を定義します...がめんどいので次回に回します!といって
いた部分ですがC言語の構造体で下記の様に定義されています。前回
SDKライブラリ側で定義されていると言いましたが、大嘘です...cubeデモ
側で定義されてました(^^;)...誰か突っ込んで欲しいと思う今日この頃
です(恥ずかしいので、原文こっそり修正しました...鋭意日記捏造中)。
struct Vertex
{
float u, v; // 投影面の座標系を横方向=U, 縦方向=Vと表記する
unsigned int color; // 頂点カラー
float x,y,z; // 頂点座標
};
ふふっ、この簡単な定義に3Dの基礎がみっちり詰め込まれているではない
ですか、せっかくなので、説明用に使わせて貰います。
3Dポリゴン(三角形)を描画するために頂点を三つ用意してあげます。その
個々の頂点は上記Vertex構造体の属性を持ちます。で当然3D空間という
物があって、そこでの座標となります。構造体のメンバでいうとx,y,zがそれに
あたります。各値はfloat(小数点型:ここでfloatの精度に関しては気にしない
でください、PSPの場合同じMIPS32でも違うという事になってます...普通に
使う分には変わらないはずですから、ああfloat型なんだねと漠然と理解して
くれると非常に助かります)で表記されます。でX,Y,Zそれぞれなんですが
Xは画面に対して横方向(幼稚な表現でごめん^^;)Yは縦方向、Zは奥行き
となります。座標をX,Y,Zを表す際に右手座標系と左手座標系というのが
ありますが、右手座標系です(のはずです...間違ってたらごめん^^;)
右手座標系について(ううっ、図使いたい^^;)
親指(X)、 人差し指(Y)、 中指(Z)
それぞれの値はXは右に向かって増える、Yは上に向かって増える、
Zは奥から手前に向かって増えるです。
ちなみに、左手座標だとZだけ逆になります(手前から奥に向かって値が
増える)
Vertex構造体u, vメンバについてですが、これは透視変換への投影面
等に使用されます。何を言っているかというと、せっかく3Dの座標をセット
して3D空間をイのままに使えるようになっても、所詮PSPの液晶画面は
2Dです(スターウォーズのホログラフィみいに物が浮かぶわけじゃない
です)。だから、最終的に2Dに投影してあげる必要があります。その際
にPSP画面上のどこにあたるかを表します。当然視点を変えると座標は
変わらなくてもU,Vの値は変わります。あと投影は画面だけではなく
描画するオブジェクトに対してのU,Vに使用したりもします(テクスチャ
マッピング)...残念ながら、今回のサンプルではU,Vを求めるのは
GU+GEのお仕事なので気にする必要ありません。
6面体(cube)なので面は6面で1つの面を2つの3Dポリゴンで描画
していますので頂点数は6X2=12個です。
Vertex構造体colorメンバですが、これは頂点色です。今回の例では
3Dポリゴンごとに同じ頂点色をセットしていますが、これを頂点毎に
変える事が出来ます(シェーディングモードがグーローシェーディング
なので)
==============================================
頂点定義例(PSPSDK cubeデモより抜粋)
==============================================
struct Vertex
{
float u, v; // 投影面の座標系を横方向=U, 縦方向=Vと表記する
unsigned int color; // 頂点カラー
float x,y,z; // 頂点座標
};
struct Vertex __attribute__((aligned(16))) vertices[12*3] =
{
{0, 0, 0xff7f0000,-1,-1, 1}, // 0
{1, 0, 0xff7f0000,-1, 1, 1}, // 4
{1, 1, 0xff7f0000, 1, 1, 1}, // 5
{0, 0, 0xff7f0000,-1,-1, 1}, // 0
{1, 1, 0xff7f0000, 1, 1, 1}, // 5
{0, 1, 0xff7f0000, 1,-1, 1}, // 1
{0, 0, 0xff7f0000,-1,-1,-1}, // 3
{1, 0, 0xff7f0000, 1,-1,-1}, // 2
{1, 1, 0xff7f0000, 1, 1,-1}, // 6
{0, 0, 0xff7f0000,-1,-1,-1}, // 3
{1, 1, 0xff7f0000, 1, 1,-1}, // 6
{0, 1, 0xff7f0000,-1, 1,-1}, // 7
{0, 0, 0xff007f00, 1,-1,-1}, // 0
{1, 0, 0xff007f00, 1,-1, 1}, // 3
{1, 1, 0xff007f00, 1, 1, 1}, // 7
{0, 0, 0xff007f00, 1,-1,-1}, // 0
{1, 1, 0xff007f00, 1, 1, 1}, // 7
{0, 1, 0xff007f00, 1, 1,-1}, // 4
{0, 0, 0xff007f00,-1,-1,-1}, // 0
{1, 0, 0xff007f00,-1, 1,-1}, // 3
{1, 1, 0xff007f00,-1, 1, 1}, // 7
{0, 0, 0xff007f00,-1,-1,-1}, // 0
{1, 1, 0xff007f00,-1, 1, 1}, // 7
{0, 1, 0xff007f00,-1,-1, 1}, // 4
{0, 0, 0xff00007f,-1, 1,-1}, // 0
{1, 0, 0xff00007f, 1, 1,-1}, // 1
{1, 1, 0xff00007f, 1, 1, 1}, // 2
{0, 0, 0xff00007f,-1, 1,-1}, // 0
{1, 1, 0xff00007f, 1, 1, 1}, // 2
{0, 1, 0xff00007f,-1, 1, 1}, // 3
{0, 0, 0xff00007f,-1,-1,-1}, // 4
{1, 0, 0xff00007f,-1,-1, 1}, // 7
{1, 1, 0xff00007f, 1,-1, 1}, // 6
{0, 0, 0xff00007f,-1,-1,-1}, // 4
{1, 1, 0xff00007f, 1,-1, 1}, // 6
{0, 1, 0xff00007f, 1,-1,-1}, // 5
};
==============================================
こんな感じで六面体(cube)を定義します。
次回は何とか透視変換まで行きたいです(いまだにちゃんと説明できてない)
ここをクリックで人気blogランキングへ(ご協力お願いします)