ANA国内線【PR】
3Dグラフィックス入門(その3) ジオメトリ演算1
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ランキングへ(ご協力お願いします)



  



by pspborder | 2005-07-23 22:54 | PSP開発
<< 【お知らせ】 土日サイト少しい... 【お知らせ】た、大変です! W... >>
トップ

PSPSDK試用の日記です
by pspborder
お気に入りブログ
最新のコメント
おすすめキーワード(PR)
ファン
XML | ATOM

skin by excite