how to make camera follow a 3d object in opengl?
i'm making a car race for the first time using opengl,the first problem i face is how to make the camera follow the car with constant distance..here is the code for keyboard function.V is the velocity of the car.
void OnSpecial(int key, int x, int y)
{
float step = 5;
switch(key) {
case GLUT_KEY_LEFTa:
carAngle = step;
开发者_高级运维 V.z = carAngle ;
camera.Strafe(-step/2);
break;
case GLUT_KEY_RIGHT:
carAngle = -step;
V.z = carAngle ;
camera.Strafe(step/2);
break;
case GLUT_KEY_UP:
V.x += (-step);
camera.Walk(step/2);
break;
case GLUT_KEY_DOWN:
if(V.x<0)
{
V.x += step;
camera.Walk(-step/2);
}
break;
}
}
Something like that maybe ?
vec3 cameraPosition = carPosition + vec3(20*cos(carAngle), 10,20*sin(carAngle));
vec3 cameraTarget = carPosition;
vec3 cameraUp = vec3(0,1,0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity()
gluLookAt(cameraPosition, cameraTarget, cameraUp);
glTranslate(carPosition);
drawCar();
It you're not using the old and deprecated openGL API (glBegin & stuff) you'll have to do something like
mat4 ViewMatrix = LookAt(cameraPosition, cameraTarget, cameraUp); // adapt depending on what math library you use
The answer to that is simple. You have player controlled object (car) so you have its position and orientation via ModelViewMatrix
in world space (usually pointed to the center of 3D model)
To transform it to the correct follow ModelViewMatrix
you must:
obtain or construct car
ModelMatrix
asdouble M[16]
translate/rotate it to the new position (inside cockpit or behind car)
so the Z axis is pointing the way you want to see. Its usual to have the follow distance as a function of speed
Invert
M
soM=Inverse(M)
use
M
asModelViewMatrix
render
so in an nutshell:
ModelViewMatrix = rendered_object_matrix * Inverse(following_object_matrix * local_view_offset)
for additional stuff you need for this look at my answer here:
- https://stackoverflow.com/a/18041433/2521214
精彩评论