OpenGL でカメラをセットアップして、いくつかの点を 3 次元で表示しようとしています。これを実現するために、古い固定機能スタイル (glMatrixMode()、glTranslate など) を使用するのではなく、モデル ビュー プロジェクション マトリックスを自分でセットアップして頂点シェーダーで使用したいと考えています。正射図法で十分です。
これに関する多くのチュートリアルでは glm ライブラリを使用しているようですが、私は OpenGL にまったく慣れていないので、正しい方法で学び、その後サードパーティのライブラリを使用したいと考えています。さらに、ほとんどのチュートリアルでは、glMotionFunc() と glMouseFunc() を使用してカメラを空間に配置する方法について説明していません。
だから、サンプルコードと3Dでポイントを見る方法のガイダンスを探していると思います。私が書いた頂点シェーダーは次のとおりです。
const GLchar *vertex_shader = // Vertex Shader
"#version 330\n"
"layout (location = 0) in vec4 in_position;"
"layout (location = 1) in vec4 in_color;"
"uniform float myPointSize;"
"uniform mat4 myMVP;"
"out vec4 color;"
"void main()"
"{"
" color = in_color;"
" gl_Position = in_position * myMVP;"
" gl_PointSize = myPointSize;"
"}\0";
MVP の初期値を、シェーダーの設定方法で単位行列になるように設定しました。これにより、ポイントの正しい 2D 表現が得られます。
// Set up initial values for uniform variables
glUseProgram(shader_program);
location_pointSize = glGetUniformLocation(shader_program, "myPointSize");
glUniform1f(location_pointSize, 25.0f);
location_mvp = glGetUniformLocation(shader_program, "myMVP");
float mvp_array[16] = {1.0f, 0.0f, 0.0f, 0.0f, // 1st column
0.0f, 1.0f, 0.0f, 0.0f, // 2nd column
0.0f, 0.0f, 1.0f, 0.0f, // 3rd column
0.0f, 0.0f, 0.0f, 1.0f // 4th column
};
glUniformMatrix4fv(location_mvp, 1, GL_FALSE, mvp_array);
glUseProgram(0);
ここで私の質問は、「モーション」と「マウス」の 2 つの関数をどのように適応させるかです。この時点では、これを行う非推奨のスタイルが使用された前の例のコードしかありません。
// OLD, UNUSED VARIABLES
int mouse_old_x;
int mouse_old_y;
int mouse_buttons = 0;
float rotate_x = 0.0;
float rotate_y = 0.0;
float translate_z = -3.0;
...
// set view matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, translate_z);
glRotatef(rotate_x, 1.0, 0.0, 0.0);
glRotatef(rotate_y, 0.0, 1.0, 0.0);
...
// OLD, UNUSED FUNCTIONS
void mouse(int button, int state, int x, int y)
{
if (state == GLUT_DOWN)
{
mouse_buttons |= 1<<button;
}
else if (state == GLUT_UP)
{
mouse_buttons = 0;
}
mouse_old_x = x;
mouse_old_y = y;
}
void motion(int x, int y)
{
float dx, dy;
dx = (float)(x - mouse_old_x);
dy = (float)(y - mouse_old_y);
if (mouse_buttons & 1)
{
rotate_x += dy * 0.2f;
rotate_y += dx * 0.2f;
}
else if (mouse_buttons & 4)
{
translate_z += dy * 0.01f;
}
mouse_old_x = x;
mouse_old_y = y;
}