我正在尝试在OpenGL中设置相机来查看三维空间中的一些点。为了实现这个目标,我不想使用旧的固定功能风格(glMatrixMode()、glTranslate等),而是自己设置模型视图投影矩阵,在顶点着色器中使用它。一个正交投影就足够了。
很多关于这方面的教程似乎都使用glm库进行,但由于我完全不懂OpenGL,我想学习正确的方式,然后再使用第三方库。此外,大多数教程都没有描述如何使用glMotionFunc()和glMouseFunc()将相机放置在空间中。
因此,我想找一些示例代码和指导,以便在3D中查看我的点。这里是我编写的顶点着色器:
现在我的问题是如何适应两个函数“motion”和“mouse”,到目前为止这两个函数只有一些代码来自以前的示例,其中使用了过时的方法:
很多关于这方面的教程似乎都使用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的初始值设置为单位矩阵,这给了我正确的点的二维表示:
// 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);
现在我的问题是如何适应两个函数“motion”和“mouse”,到目前为止这两个函数只有一些代码来自以前的示例,其中使用了过时的方法:
// 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;
}