デフォルトの OpenGL 画面座標システムが、x 軸 (-1.0 から 1.0 まで、y 軸: -1.0 から 1.0 まで)、および (0.0,0.0) が画面の中心で操作するのが非常に難しいのは驚くことではありません。
そこで、次の主なアイデアを使って、ローカル ゲーム コーディネートのラッパーを作成することにしました。
- 画面座標は 0..100.0 (x 軸)、0..100.0 (y 軸) で、画面の左下隅に (0.0,0.0) が表示されます。
- さまざまな画面があり、さまざまな側面があります。
- 四角形を描画する場合、押しつぶされた四角形ではなく、四角形のままでなければなりません。
私が意味するクワッドによって
quad_vert[0].x = -0.5f;
quad_vert[0].y = -0.5f;
quad_vert[0].z = 0.0f;
quad_vert[1].x = 0.5f;
quad_vert[1].y = -0.5f;
quad_vert[1].z = 0.0f;
quad_vert[2].x = -0.5f;
quad_vert[2].y = 0.5f;
quad_vert[2].z = 0.0f;
quad_vert[3].x = 0.5f;
quad_vert[3].y = 0.5f;
quad_vert[3].z = 0.0f;
glm::ortho と glm::mat4 を使用してこれを実現します。
#define LOC_SCR_SIZE 100.0f
typedef struct coords_manager
{
float SCREEN_ASPECT;
mat4 ORTHO_MATRIX;//glm 4*4 matrix
}coords_manager;
glViewport(0, 0, screen_width, screen_height);
coords_manager CM;
CM.SCREEN_ASPECT = (float) screen_width / screen_height;
たとえば、アスペクトは 1.7 になります。
CM.ORTHO_MATRIX = ortho(0.0f, LOC_SCR_SIZE, 0.0f, LOC_SCR_SIZE);
現在、左下は (0,0) で、右上は (100.0, 100.0) です。
クワッドを (25.0, 25.0) に変換し、(50.0, 50.0) にスケーリングすると、画面の 50% パーセントのサイズで左下隅に配置されます。しかし、問題は、画面の幅が高さと等しくないため、四角形ではなく長方形のように見えることです。
そこで、スクリーン アスペクトを使用します。
CM.ORTHO_MATRIX = ortho(0.0f, LOC_SCR_SIZE * CM.SCREEN_ASPECT, 0.0f, LOC_SCR_SIZE);
ええ、私たちは正しいフォームを取得しますが、別の問題があります.(50,25)に配置すると、画面の中央から左に配置されます. (アスペクト比 1.7 を乗算するため)、クアッド トランスレーションを設定する前に次の関数を使用します。
void loc_pos_to_gl_pos(vec2* pos)
{
pos->x = pos->x * CM.SCREEN_ASPECT;
}
そしてヴィオラ、私たちは適切な場所で適切なフォームのチームを取得します.
しかし、質問は - 私はこれを正しくやっていますか?