如何使相机跟随opengl中的3d对象?

时间:2011-05-29 23:26:10

标签: c++ opengl camera glut

我是第一次使用opengl进行赛车比赛,我面临的第一个问题是如何使相机跟随距离恒定的汽车。键盘功能的代码.V是速度的车。

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;
    }
}

2 个答案:

答案 0 :(得分:4)

这样的事可能吗?

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();

你没有使用旧的和不推荐使用的openGL API(glBegin&amp; stuff)你必须做的事情

mat4 ViewMatrix = LookAt(cameraPosition, cameraTarget, cameraUp); // adapt depending on what math library you use

答案 1 :(得分:0)

答案很简单。您有玩家控制的对象(汽车),因此您可以通过ModelViewMatrix在世界空间中获得其位置和方向(通常指向3D模型的中心) 要将其转换为正确的跟随ProjectionMatrix,您必须:

  1. 获取汽车ModelViewMatrix以加倍M [16]
  2. 将其转换/旋转到新位置(驾驶舱内或车后),以便Z轴指向您想要看到的方式。
  3. 反转M ... M =反向(M)
  4. 应用透视M = M * PerspectiveMatrix
  5. 在渲染之前将M存储为ProjectionMatrix
  6. 有关其他内容,您需要在此处查看我的答案:https://stackoverflow.com/a/18041433/2521214