移动一段距离后opengl对象振动

Moh*_*hen 5 c++ android opengl-es

我有一个物体在地形上移动,第三人称相机跟随它,在我将它向不同方向移动一段距离后,它开始摇晃或振动,即使它没有移动并且相机围绕它旋转,这就是移动对象的代码

double& delta = engine.getDeltaTime();
GLfloat velocity = delta * movementSpeed;
glm::vec3 t(glm::vec3(0, 0, 1) * (velocity * 3.0f));
//translate the objet atri before rendering
matrix = glm::translate(matrix, t);
//get the forward vetor of the matrix
glm::vec3 f(matrix[2][0], matrix[2][1], matrix[2][2]);
f = glm::normalize(f);
f = f * (velocity * 3.0f);
f = -f;
camera.translate(f);
Run Code Online (Sandbox Code Playgroud)

相机旋转是

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);
}
Run Code Online (Sandbox Code Playgroud)

Spe*_*tre 3

  1. float有时还不够。

    我在CPUdouble端使用精度矩阵来避免此类问题。但由于您使用的是Android,这可能是不可能的。对于GPU,再次使用s,因为还没有 64 位插值器。float

  2. 大数字通常是问题所在

    如果你的世界很大,那么你就会将大量的数字传递到方程式中,乘以任何误差,并且只有在最后阶段,这些东西才会相对于相机位置进行平移,这意味着误差会成倍增加,但数字会被限制,因此误差/数据比会变大。

    要在渲染之前解决此问题,请将所有顶点转换为原点位于相机或相机附近的坐标系。您可以忽略旋转,只是偏移位置。

    这样,您只会在远离相机的地方得到更高的错误,而相机的透视无论如何都不可见......有关更多信息,请参阅:

  3. 使用累积变换矩阵代替欧拉角

    有关更多信息,请参阅了解 4x4 齐次变换矩阵以及该答案底部的所有链接。

  • 是的,这是大数字问题,但在“GLSL”中使用高精度解决了问题 (2认同)