ファイル>新規プロジェクトメニューで選ぶテンプレートは当然、OpenGL ES Application。

テン・シー・シー-1

 で、実行させると、ちょっとガッカリしたと思います。

テン・シー・シー-2

 平面の回転じゃん...

 いやいや、がっかりするのはまだ早いっす。
 EAGLView.mの

- (void)drawView {

にある

glRotatef(3.0f, 0.0f, 0.0f, 1.0f);



glRotatef(3.0f, 0.0f, 1.0f, 0.0f);

にするだけで、いきなりコマのように垂直方向を軸として回転始めるんスよ。

テン・シー・シー-3

 なんのことはない、テンプレートの設定は視線方向(この場合Z)軸回転だったわけっす。ただ~し、なんかいまいち立体っぽくない。
 こいつも理由があって、2次元への変換方法に

glOrthof

という、平行投影法を選んでるからなんですな。
 平行投影法てのは「iPhoneアプリ開発 その(90)」で計算とは違い、視点からの距離に関係なく同じ大きさなら同じ大きさで表示するという投影法なわけです。
 中学校の技術でやった3面図の書き方ですわ。実践したい人は「iPhoneアプリ開発、その(93)」のサンプルソースの

static void projection(const Point3d* inPt3d, CGPoint* outPt2d)
{
double scale = screen_z / inPt3d->z;
outPt2d->x = scale * inPt3d->x;
outPt2d->y = scale * inPt3d->y;
}



static void projection(const Point3d* inPt3d, CGPoint* outPt2d)
{
double scale = 0.4;
outPt2d->x = scale * inPt3d->x;
outPt2d->y = scale * inPt3d->y;
}

として、実行してみましょう。(注意 0.4ていう値自体は適当

テン・シー・シー-4
平行投影法

 なので、これも透視投影法の

glFrustumf

を指定してやれば、完璧3次元ぽくなるわけですが、単純にglOrthofをglFrustumfに変えて渡してるパラメータはそのままだと、なにも表示されません。調べてみると

public void glFrustumf(
float left,
float right,
float bottom,
float top,
float near,
float far);

というもので、このnearとfarはそれぞれ、視点からの距離で、nearとfarの間に存在する物体を描画対象にするという指定だそうです。

テン・シー・シー-5
つまり、緑色のエリアが表示の対象になる。
あとのleft~bottomはnear側の矩形の大きさというとこっすかね?

テン・シー・シー-6

なら、平行投影法ならともかく、透視ではnear = -1.0fはちょっとあり得ないっすね。
near = 3.0、far = 100.0とか適当に設定。うりゃ!実行。
ありゃ、駄目だ。

 で、もうちょっとソースを調べると表示矩形の頂点座標っぽいsquareVerticesの値が-0.5とか0.5ていう感じで、どーも1.0の矩形で原点上に置かれてるっぽいんで、nearより手前にあるのが問題なんじゃないかと...

なので、glFrustumfが紹介されてる同じページで紹介されている平行移動を設定する

public void glTranslatef(
float x,
float y,
float z)

こいつをglFrustumfのあとに使って

glTranslatef(0.0f, 0.0f, -3.5f);

というふうにZ方向に -3.5移動ってやってみると...
注意)ここで気をつけるのはOpenGLの座標系は右手系「iPhoneアプリ開発、その(92)参照」であるということ。
さんざん、上の挿絵で左手座標系描いてて、なんだけど、glFrustumfの引数は3次元どころか2次元でもなくて、1次元(直線上)座標でしたな...
スマソ。

テン・シー・シー-7

ばっちりでした。
 glRotatefやglTranslatefが、いったい内部でなにをやっているのかとか、squareVerticesの値は実際、どういう意味なのかとかは次回。

------------
サンプルプロジェクト:es.zip