opengl-es - OpenGL制裁剪体面部相机

标签 opengl-es rotation linear-algebra glm-math

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

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,这是正确的,然后我触摸屏幕触发事件,物体旋转并按预期看着相机,theta 变为零,如果我围绕对象旋转相机并再次触发事件,它会为 theta 提供意想不到的值。 相机的旋转代码是:

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

最佳答案

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

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

关于opengl-es - OpenGL制裁剪体面部相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46527367/

相关文章:

android - 为什么我的 OpenGL 球体看起来像一个椭圆

java - 在opengl GL10中绘制圆弧

java - 将 2d vector 作为 vec4 传递到 OpenGL ES 2.0 着色器

c++ - 使用 uBLAS 在 C++ 中从 vector 创建矩阵

iphone - 如何在 OpenGL ES 1.1 (iPhone) 中平滑纹理对象

ios - MKAnnotationView旋转

Java 俄罗斯方 block 旋转错误

c++ - 从鼠标位置数学设置 Actor 世界位置

python - 如何在Python中绘制代表符号函数的特征值?

rotation - 在 Three.js 中保持基于父/其他对象坐标系的对象旋转?