Rainer Wahnsinn

02-01-2013, 03:42 AM

I'm trying to change the zoom effect in my application to be based on a change of FoV instead of just a z-translation which is called dolly. User input should be the basis so my current code looks as follows:

void setupMatrices()

{

// Set ProjectionMatrix

projectionMatrix = glm::perspective(90.0f, (GLfloat)width / (GLfloat) height, 0.1f, 1000.f);

glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);

glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projectionMatrix));

glBindBuffer(GL_UNIFORM_BUFFER, 0);

// Set ModelViewMatrix

glm::mat4 identity = glm::mat4(1.0); // Start with the identity as the transformation matrix

glm::mat4 pointTranslateZ = glm::translate(identity, glm::vec3(0.0f, 0.0f, -translate_z)); // Zoom in or out by translating in z-direction based on user input

glm::mat4 viewRotateX = glm::rotate(pointTranslateZ, rotate_x, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the whole szene in x-direction based on user input

glm::mat4 viewRotateY = glm::rotate(viewRotateX, rotate_y, glm::vec3(0.0f, 1.0f, 0.0f)); // Rotate the whole szene in y-direction based on user input

glm::mat4 pointRotateX = glm::rotate(viewRotateY, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the camera by 90 degrees in negative x-direction to get a frontal look on the szene

glm::mat4 viewTranslate = glm::translate(pointRotateX, glm::vec3(-dimensionX/2.0f, -dimensionY/2.0f, -dimensionZ/2.0f)); // Translate the origin to be the center of the cube

modelViewMatrix = viewTranslate;

glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);

glBufferSubData(GL_UNIFORM_BUFFER, sizeof(glm::mat4), sizeof(glm::mat4), glm::value_ptr(modelViewMatrix));

glBindBuffer(GL_UNIFORM_BUFFER, 0);

}

I've tried a lot of things now but couldn't find out which of the code I need to change in order to achieve real zooming. I followed the instructions of a number of tutorials and looked at different example code snippets, but it just didn't worked out. Since I just started learning OpenGL, I hope that someone can tell me which instructions I need to change and how.

rotate_x, rotate_y and translate_z all come from mouse input

void setupMatrices()

{

// Set ProjectionMatrix

projectionMatrix = glm::perspective(90.0f, (GLfloat)width / (GLfloat) height, 0.1f, 1000.f);

glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);

glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projectionMatrix));

glBindBuffer(GL_UNIFORM_BUFFER, 0);

// Set ModelViewMatrix

glm::mat4 identity = glm::mat4(1.0); // Start with the identity as the transformation matrix

glm::mat4 pointTranslateZ = glm::translate(identity, glm::vec3(0.0f, 0.0f, -translate_z)); // Zoom in or out by translating in z-direction based on user input

glm::mat4 viewRotateX = glm::rotate(pointTranslateZ, rotate_x, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the whole szene in x-direction based on user input

glm::mat4 viewRotateY = glm::rotate(viewRotateX, rotate_y, glm::vec3(0.0f, 1.0f, 0.0f)); // Rotate the whole szene in y-direction based on user input

glm::mat4 pointRotateX = glm::rotate(viewRotateY, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the camera by 90 degrees in negative x-direction to get a frontal look on the szene

glm::mat4 viewTranslate = glm::translate(pointRotateX, glm::vec3(-dimensionX/2.0f, -dimensionY/2.0f, -dimensionZ/2.0f)); // Translate the origin to be the center of the cube

modelViewMatrix = viewTranslate;

glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);

glBufferSubData(GL_UNIFORM_BUFFER, sizeof(glm::mat4), sizeof(glm::mat4), glm::value_ptr(modelViewMatrix));

glBindBuffer(GL_UNIFORM_BUFFER, 0);

}

I've tried a lot of things now but couldn't find out which of the code I need to change in order to achieve real zooming. I followed the instructions of a number of tutorials and looked at different example code snippets, but it just didn't worked out. Since I just started learning OpenGL, I hope that someone can tell me which instructions I need to change and how.

rotate_x, rotate_y and translate_z all come from mouse input