/moderngl_camera

A quaternion based camera for modern OpenGL

Primary LanguageC++MIT LicenseMIT

Modern OpenGL Camera

A quaternion based camera for modern OpenGL using GLM

Code is contained in two files, camera.h and camera.cpp

An example is provided in example.cpp, use Cmake to compile. Example draws a glut wire cube that you can fly around using the mouse to look and the keyboard to strafe.

##Using with GLUT

In order to use this code with the GLUT library the following code can be used/adapted. (A more complete example is provided in example.cpp)

Camera camera;
...
void CallBackKeyboardFunc(unsigned char key, int x, int y)
{
	switch (key) {
	case 'w':
		camera.Move(FORWARD);
		break;
	case 'a':
		camera.Move(LEFT);
		break;
	case 's':
		camera.Move(BACK);
		break;
	case 'd':
		camera.Move(RIGHT);
		break;
	case 'q':
		camera.Move(DOWN);
		break;
	case 'e':
		camera.Move(UP);
		break;
	}
}

void CallBackMouseFunc(int button, int state, int x, int y)
{
	camera.SetPos(button, state, x, y);
}
void CallBackMotionFunc(int x, int y)
{
	camera.Move2D(x, y);
}

void DisplayFunc() {
	glEnable(GL_CULL_FACE);
	glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glViewport(0, 0, window.size.x, window.size.y);

	glm::mat4 model, view, projection;
	camera.Update();
	camera.GetMatricies(projection, view, model);

	glm::mat4 mvp = projection* view * model;	//Compute the mvp matrix
	glLoadMatrixf(glm::value_ptr(mvp));
	...
	//Draw stuff here
	...
	glutSwapBuffers();
}

int main(int argc, char * argv[]) {
	...
	//GLUT init
	...
	glutDisplayFunc(DisplayFunc);
	glutMouseFunc(CallBackMouseFunc);
	glutMotionFunc(CallBackMotionFunc);
	glutKeyboardFunc(KeyboardFunc);
	
	camera.SetPosition(glm::vec3(0, 0, -1));
	camera.SetLookAt(glm::vec3(0, 0, 0));
	camera.SetClipping(.1, 1000);
	camera.SetFOV(45);
		
	...
}