How to make a free camera

(Difference between revisions)
Jump to: navigation, search
255 (Talk | contribs)
(Created page with "First of all we need a centerCursor function. We can take that directly from MScript.cpp (the lua script functions source code): <pre>void MyGame::centerCursor(void) { ME...")
Newer edit →

Revision as of 11:40, 22 August 2013

First of all we need a centerCursor function. We can take that directly from MScript.cpp (the lua script functions source code):

void MyGame::centerCursor(void)
{
	MEngine * engine = MEngine::getInstance();
	MSystemContext * system = engine->getSystemContext();
	MInputContext * input = engine->getInputContext();

	unsigned int width = 0;
	unsigned int height = 0;
	system->getScreenSize(&width, &height);
	int x = width/2;
	int y = height/2;

	system->setCursorPosition(x, y);
	input->setAxis("MOUSE_X", (float)(x / (float)width));
	input->setAxis("MOUSE_Y", (float)(y / (float)height));
}

On our header file:

MOCamera * camera;
float camera_dx = 0.0f;
float camera_dy = 0.0f;
float mouseX, mouseY, mouseX_prev, mouseY_prev;

On onBeginScene:

	camera = scene->getCameraByName("Camera");

On update, before anything else, we could store the mouse position in the mouseX and mouseY variable. You could do that at the start of the function so that these variables can be used from other code you may write in the future without the need to retrieve the values again:

	MEngine * engine = MEngine::getInstance();
	MInputContext * input = engine->getInputContext();
	mouseX = input->getAxis("MOUSE_X");
	mouseY = input->getAxis("MOUSE_Y");

Still on update, in whichever part of the function you want, we put our actual camera movement code.

MGame::update() is the last thing that should be called, which is the "original" code of the update() function from the base class MGame. So we'll put our camera movement code before that line of code.

	/*	free camera	*/
	//rotate horizontal (X mouse)
	camera->addAxisAngleRotation(camera->getInverseRotatedVector(MVector3(0,0,-1)),camera_dx*100);
	//rotate vertical (Y mouse)
	camera->addAxisAngleRotation(MVector3(-1,0,0),camera_dy*100);
	//move
	if(input->isKeyPressed("W"))
		camera->setPosition(camera->getPosition() + camera->getRotatedVector(MVector3(0,0,-2)));
	if(input->isKeyPressed("S"))
		camera->setPosition(camera->getPosition() + camera->getRotatedVector(MVector3(0,0,2)));
	if(input->isKeyPressed("A"))
		camera->setPosition(camera->getPosition() + camera->getRotatedVector(MVector3(-1,0,0)));
	if(input->isKeyPressed("D"))
		camera->setPosition(camera->getPosition() + camera->getRotatedVector(MVector3(1,0,0)));
	//get mouse direction
	camera_dx = mouseX - mouseX_prev;
	camera_dy = mouseY - mouseY_prev;
	//center cursor
	centerCursor();
	mouseX_prev = input->getAxis("MOUSE_X");
	mouseY_prev = input->getAxis("MOUSE_Y");
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox