私はOpenGLES2.0で最初のステップを実行しており、iPodtouchで試してみています。この座標の問題をどのように解決するのか疑問に思いました。
よりよく説明するために、私はクワッドを描画し、頂点シェーダーを使用して回転/移動しようとしていました(これは、私が読んだことから、それを行う唯一の方法のように思われるためです)。
私はiPodを使用しているので、1.5 : 1
比率とビューポートを設定します。
glViewport(0, 0, backingWidth, backingHeight);
したがって0,0
、クリッピングの中心と境界は、、などにある必要があります-1.0, -1.0
(-1.0, 1.0
右?)
正方形を描くには、アスペクト比のためにx座標とy座標に異なる値を使用する必要がありました。
static const GLfloat lineV[] = {
-0.5f, 0.33f, 0.5f, 0.33f,
0.5f, 0.33f, 0.5f,-0.33f,
0.5f,-0.33f, -0.5f,-0.33f,
-0.5f,-0.33f, -0.5f, 0.33f,
-0.5f, 0.33f, 0.5f,-0.33f,
0.5f, 0.33f, -0.5f,-0.33f,
};
これは両方の対角線を持つ正方形です(インデックスを使用する方が効率的であることはわかっていますが、それは重要ではありません)。
次に、オブジェクトを移動しながら回転させる頂点シェーダーを作成してみました。
void main()
{
m = mat4( cos(rotation), sin(rotation), 0.0, 0.0,
-sin(rotation), cos(rotation), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
m2 = mat4(1.0);
m2[1][3] = sin(rotation)*0.8;
gl_Position = position*(m*m2);
}
動作しますが、座標が同じではないため、クワッドは回転中に歪んでしまいます。どうすればそれを防ぐことができますか?ビュー錐台を異なる境界に変更することが可能かどうかを考えました(y軸を拡大すると問題が解決するように両方の軸で-1.0から1.0ではありません)。
さらに、マトリックスを使用するためのより良い方法はありますか?glRotatef
つまり、行列全体を指定せずに使用することに慣れていました。このタスクを実行するための便利な関数/コンストラクターは存在しますか?