OpenGL制作物面相机

Posted

技术标签:

【中文标题】OpenGL制作物面相机【英文标题】:OpenGL make object face camera 【发布时间】:2017-10-02 14:17:39 【问题描述】:

OpenGL ES3,C++ 11,android,我有一个对象和一个实现第三人称相机的相机,所以我想让对象在我触摸屏幕时朝向相机,所以我有一个对象和视图的转换矩阵相机矩阵,相机围绕对象旋转,我希望当我触摸屏幕时对象向相机旋转,所以我尝试了以下操作:

glm::vec3 up(0, 1, 0);
glm::vec3 camFor(glm::cross(camera.getRight(), up));
GLfloat theta = glm::angle(glm::vec2(camFor.x, camFor.z), glm::vec2(getDirection().x, getDirection().z));
LOGI("game theta %f", theta);
matrix = glm::rotate(matrix, theta, glm::vec3(0.0, 1.0, 0.0));

我得到了物体前向矢量和相机前向矢量之间的水平角,即 glm::vec3(matrix[2][0], matrix[2][1], matrix[2][2]) ,第一次当相机正好在物体后面时,我得到的 theta 等于 pi,然后我触摸屏幕来触发事件对象旋转并按预期看向相机并且θ变为零,如果我围绕对象旋转相机并再次触发事件,它会为θ提供意想不到的值。 相机的旋转代码为:

void Camera::rotate(GLfloat xoffset, GLfloat yoffset, glm::vec3& c, double& delta, GLboolean constrainpitch) 
    xoffset *= (delta * this->rotSpeed);
    yoffset *= (delta * this->rotSpeed);
    pitch += yoffset;
    yaw += xoffset;
    if (constrainpitch) 
        if (pitch >= maxPitch) 
            pitch = maxPitch;
            yoffset = 0;
        
        if (pitch <= minPitch) 
            pitch = minPitch;
            yoffset = 0;
        
    
    glm::quat Qx(glm::angleAxis(glm::radians(yoffset), glm::vec3(1.0f, 0.0f, 0.0f)));
    glm::quat Qy(glm::angleAxis(glm::radians(xoffset), glm::vec3(0.0f, 1.0f, 0.0f)));
    glm::mat4 rotX = glm::mat4_cast(Qx);
    glm::mat4 rotY = glm::mat4_cast(Qy);
    view = glm::translate(view, c);
    view = rotX * view;
    view = view * rotY;
    view = glm::translate(view, -c);

解决方案:

错误在于获取相机矩阵的右向量这是正确的

glm::vec3& Camera::getRight() 
    right = glm::vec3(view[0][0], view[1][0], view[2][0]);
    return right;

【问题讨论】:

请将问题发布到您自己的答案中,而不是将其编辑到问题中。 【参考方案1】:

错误在于获取相机矩阵的右向量这是正确的

glm::vec3& Camera::getRight() 
    right = glm::vec3(view[0][0], view[1][0], view[2][0]);
    return right;

【讨论】:

以上是关于OpenGL制作物面相机的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL中使对象跟随相机

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

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

Opengl相机和乘法矩阵

具有 OpenGL 和 C++ 的 2D 平台游戏相机

使用 OpenGL 进行正交投影以及如何实现相机或物体在空间中的移动