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)
float有时还不够。
我在CPUdouble端使用精度矩阵来避免此类问题。但由于您使用的是Android,这可能是不可能的。对于GPU,再次使用s,因为还没有 64 位插值器。float
大数字通常是问题所在
如果你的世界很大,那么你就会将大量的数字传递到方程式中,乘以任何误差,并且只有在最后阶段,这些东西才会相对于相机位置进行平移,这意味着误差会成倍增加,但数字会被限制,因此误差/数据比会变大。
要在渲染之前解决此问题,请将所有顶点转换为原点位于相机或相机附近的坐标系。您可以忽略旋转,只是偏移位置。
这样,您只会在远离相机的地方得到更高的错误,而相机的透视无论如何都不可见......有关更多信息,请参阅:
使用累积变换矩阵代替欧拉角
有关更多信息,请参阅了解 4x4 齐次变换矩阵以及该答案底部的所有链接。