在OpenGL中使对象跟随相机

Posted

技术标签:

【中文标题】在OpenGL中使对象跟随相机【英文标题】:Make an object follow the camera in OpenGL 【发布时间】:2012-06-14 03:32:15 【问题描述】:

我正在使用 OpenGL 制作赛车游戏(只是一个小项目),但在尝试让我的汽车跟随摄像头视图时遇到了问题。

当相机向前和/或向后移动时,让它跟随相机并不难,但当我旋转相机(向右或向左看)时,汽车仍然静止。我的意思是,它仍然向前和向后移动,但它不在相机前面(它在侧面)。

这是我的代码(我尝试实现它的部分):

void updateCam() 
    gluLookAt(posX,posY + 0.025 * std::abs(sin(headPosAux*PI/180)),posZ,
        posX + sin(roty*PI/180),posY + 0.025 * std::abs(sin(headPosAux*PI/180)) + cos(rotx*PI/180),posZ -cos(roty*PI/180),
        0.0,1.0,0.0);

    listenerPos[0] = posX;
    listenerPos[1] = posY;
    listenerPos[2] = posZ;

    source0Pos[0] = posX;
    source0Pos[1] = posY;
    source0Pos[2] = posZ;

    GLfloat distD;

    distD = posZ - 3.3;


    //makes the car "follow" the camera
    modelPOR.Translate(posX,posY,distD);


【问题讨论】:

【参考方案1】:

我认为问题在于您在 gluLookAt 中更改了中心位置,而不是在 modelPOR.Translate 中

gluLookAt 的 3 个中间参数设置视图的中心,因此汽车应该在完全相同的位置,但您修改中心而不修改汽车的位置。

gluLookAt(posX,posY + 0.025 * std::abs(sin(headPosAux*PI/180)),posZ,

    // center x
    posX + sin(roty*PI/180),
    // center y
    posY + 0.025 * std::abs(sin(headPosAux*PI/180)) + cos(rotx*PI/180),
    // center z
    posZ -cos(roty*PI/180),

    0.0,1.0,0.0);

您可能应该用这些相同的值来翻译汽车。那么它将居中。

该代码中似乎存在的另一个问题是您旋转了相机而不是汽车,因此汽车可能不会与相机保持同一方向。 (这是想要的还是你在其他地方做的?)

但是您确定要让汽车跟随摄像头吗?反过来可能会更好。

【讨论】:

以上是关于在OpenGL中使对象跟随相机的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:相机和对象

在OpenGL中沿对象后面的方向旋转相机

鼠标移动opengl

OpenGL/C++ 中“2D”相机的移动

OpenGL对象和相机阻力?

Java OpenGL - 如何使对象随相机旋转?