前回の応用で四面体を定義してみるっす。
もともとの定義は、Z値を省略した形、X,Y,X,Y,...
と定義してたわけですが、さすがに今回はZ値も必要になるわけっす。X,Y,Z,X,Y,Z,...と定義していきます。
でもって
が
となるわけです。
ま、squareVerticesをtetraVerticesて名称に変える必要はないんだけど気分的にね。当然squareColorsは4点分しかないので6点あるtetraColorsも用意して、うりゃあ、実行!
ありゃ。なんか違和感が...
あ~、どうも隠面消去処理がされてないようっすねえ。後ろ側の面も描画されてしまってます。
ふむふむ、隠面消去処理したい場合は
を追加したらいいわけね。うりゃ、実行。
ええええええええ、変わらねええ。あんまり変わらないで、キャプチャする意味ないから、画像使い回してしまったわ。
なんでじゃあ~と、EAGLView.mの中を見回してみると、上の方にこんなんあったんですYoo!
おお、なんかこいつ1にすればいいんじゃね?
うりゃ、実行。
成功!
ま、写真じゃわかりずらいね。今回のサンプルソースの
を1と0で切り替えて試してみてちょ。
隠面消去処理の詳しい調査は、また今度。
まずはアフィン変換。
tetraVertices頂点列で表現される物体に対して
という指示だけでグルグル回るという事は、ここで指定する回転移動は前の位置からの相対ということになるわけですわ。
けど、前の位置はどこに保持されるのか?
は固定値なわけだから、なにか別の情報があるはず。
で、予想できるのは、物体変形(回転、平行、拡大)用アフィン行列変数があるということ。
「iPhoneアプリ開発、その(92)」で触れたようにアフィン行列は行列の積
で、変形処理が合成できる。なので、glRotatefなら回転用アフィン行列を作って、現在の物体変形用アフィン行列にかけているはず。
そこらへんの説明が「OpenGL ES 1.1.12 Full Specification」の36ページ「2.10 Coordinate Transformations」にありました(2.10.2 Matricesでは、もろ4x4行列の説明がある)。
紹介されている物体変形用アフィン行列は
と呼ばれているようです。で、ここでもうひとつのアフィン行列
が紹介されてるわけで、こんな感じで座標に適用されるみたいです。
なんで、変更を合成できるアフィン行列が2段階になるかというと、モニタ画面上の物体の移動は、視点が動く場合と物体が動く場合の2種類があるからです。
この状態から
視点が動く場合と
こうなって
物体が動くと
こうなる
視点も、物体も同じ方向に同じスピードで動くと
結果的に動かない。
こういう状況を表現するためにmodel-view matrix、projection matrixというふうに個別に保存され描画直前に2段階で適用されるわけです。
というわけでアフィン行列は2つあるんですが、回転のRotatef、移動のTranslatf、スケーリングのScalef、単位行列化のLoadIdentityいずれもcurrent matrixに作用
とあって、で、このcurrent matrixが2つのアフィン行列のどっちだというのを指定するのが
なわけですわ。
ちゅーことが、わかったので、試しにmodel-view matrixをいじって2つめの4面体を描画してます。
わざと、ぶつかるように配置したりして。
詳細は次回!
------------
サンプルプロジェクト:es3.zip
もともとの定義は、Z値を省略した形、X,Y,X,Y,...
const GLfloat squareVertices[] = {
-0.5f, -0.5f,
0.5f, -0.5f,
-0.5f, 0.5f,
0.5f, 0.5f,
};
と定義してたわけですが、さすがに今回はZ値も必要になるわけっす。X,Y,Z,X,Y,Z,...と定義していきます。
const GLfloat tetraVertices[] = {
-0.5f, -0.5f, 0.5,
0.5f, -0.5f, 0.5,
0.0f, 0.5f, 0.0,
0.0f, -0.5f,-0.5,
-0.5f, -0.5f, 0.5,
0.5f, -0.5f, 0.5
};
でもって
glVertexPointer(2, GL_FLOAT, 0, squareVertices);
・
・
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
が
glVertexPointer(3, GL_FLOAT, 0, tetraVertices );
・
・
glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
となるわけです。
ま、squareVerticesをtetraVerticesて名称に変える必要はないんだけど気分的にね。当然squareColorsは4点分しかないので6点あるtetraColorsも用意して、うりゃあ、実行!
ありゃ。なんか違和感が...
あ~、どうも隠面消去処理がされてないようっすねえ。後ろ側の面も描画されてしまってます。
ふむふむ、隠面消去処理したい場合は
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT);
を追加したらいいわけね。うりゃ、実行。
ええええええええ、変わらねええ。あんまり変わらないで、キャプチャする意味ないから、画像使い回してしまったわ。
なんでじゃあ~と、EAGLView.mの中を見回してみると、上の方にこんなんあったんですYoo!
#define USE_DEPTH_BUFFER 0
おお、なんかこいつ1にすればいいんじゃね?
うりゃ、実行。
成功!
ま、写真じゃわかりずらいね。今回のサンプルソースの
#define USE_DEPTH_BUFFER 0
を1と0で切り替えて試してみてちょ。
隠面消去処理の詳しい調査は、また今度。
まずはアフィン変換。
tetraVertices頂点列で表現される物体に対して
Y軸で3度(ラジアン度ではないみたい)回転
glRotatef(0.3f, 0.0f, 1.0f, 0.0f);
という指示だけでグルグル回るという事は、ここで指定する回転移動は前の位置からの相対ということになるわけですわ。
けど、前の位置はどこに保持されるのか?
tetraVertices
は固定値なわけだから、なにか別の情報があるはず。
で、予想できるのは、物体変形(回転、平行、拡大)用アフィン行列変数があるということ。
「iPhoneアプリ開発、その(92)」で触れたようにアフィン行列は行列の積
C' = C ・ M
で、変形処理が合成できる。なので、glRotatefなら回転用アフィン行列を作って、現在の物体変形用アフィン行列にかけているはず。
そこらへんの説明が「OpenGL ES 1.1.12 Full Specification」の36ページ「2.10 Coordinate Transformations」にありました(2.10.2 Matricesでは、もろ4x4行列の説明がある)。
紹介されている物体変形用アフィン行列は
model-view matrix
と呼ばれているようです。で、ここでもうひとつのアフィン行列
projection matrix
が紹介されてるわけで、こんな感じで座標に適用されるみたいです。
なんで、変更を合成できるアフィン行列が2段階になるかというと、モニタ画面上の物体の移動は、視点が動く場合と物体が動く場合の2種類があるからです。
この状態から
視点が動く場合と
こうなって
物体が動くと
こうなる
視点も、物体も同じ方向に同じスピードで動くと
結果的に動かない。
こういう状況を表現するためにmodel-view matrix、projection matrixというふうに個別に保存され描画直前に2段階で適用されるわけです。
というわけでアフィン行列は2つあるんですが、回転のRotatef、移動のTranslatf、スケーリングのScalef、単位行列化のLoadIdentityいずれもcurrent matrixに作用
とあって、で、このcurrent matrixが2つのアフィン行列のどっちだというのを指定するのが
glMatrixMode
なわけですわ。
ちゅーことが、わかったので、試しにmodel-view matrixをいじって2つめの4面体を描画してます。
わざと、ぶつかるように配置したりして。
詳細は次回!
------------
サンプルプロジェクト:es3.zip