J'ai une fonction qui fait tourner la caméra autour du joueur par des angles de lacet et de tangage.La précision du flotteur OpenGL rend la différence inattendue
void Camera::updateVectors() {
GLfloat radius = glm::length(center - position);
position.x = cos(glm::radians(this->yaw)) * cos(glm::radians(this->pitch));
position.y = sin(glm::radians(this->pitch));
position.z = sin(glm::radians(this->yaw)) * cos(glm::radians(this->pitch));
position *= radius;
this->front = glm::normalize(center - position);
this->right = glm::normalize(glm::cross(this->front, this->worldUp));
this->up = glm::normalize(glm::cross(this->right, this->front));
lookAt = glm::lookAt(this->position, this->position + this->front, this->up);
}
quand je déplace le joueur la caméra doit se déplace avec elle en ajoutant un vecteur de translation à la fois le centre et la position de la caméra:
void Camera::Transform(glm::vec3& t) {
this->position += t;
this->center += t;
}
avant de déplacer le lecteur fonctionne le rotation de la caméra fine et le mouvement du joueur fonctionne aussi bien mais une fois que j'essaye de faire tourner la caméra après que le joueur l'ait déplacé, je commence à changer de position de manière inattendue.
après avoir fait un certain débogage j'ai remarqué que le rayon qui est calculé à la première ligne qui est la distance entre le centre et la position de la caméra comme 49,888889 ou 50,000079 et en raison des valeurs initialisées devrait être 50,0, cette très petite différence rend le résultat inattendu. alors comment pourrais-je traiter cette précision float ou y at-il un bug dans mon code ou mes calculs.
Edit: la position du joueur dépend de son lacet et de tangage et mettre à jour le centre de la caméra
GLfloat velocity = this->movementSpeed * deltaTime;
if (direction == FORWARD) {
glm::vec3 t = glm::vec3(sin(glm::radians(yaw)), sin(glm::radians(pitch)), cos(glm::radians(yaw))) * velocity;
matrix = glm::translate(matrix, t);
for (GLuint i = 0; i < this->m_Entries.size(); i++) {
this->m_Entries[i].setModelMatrix(matrix);
}
glm::vec3 f(matrix[2][0], matrix[2][1], matrix[2][2]);
f *= velocity;
scene->getDefCamera()->Transform(f);
}
if (direction == BACKWARD) {
glm::vec3 t = glm::vec3(sin(glm::radians(yaw)), 0.0, cos(glm::radians(yaw))) * velocity;
matrix = glm::translate(matrix, -t);
for (GLuint i = 0; i < this->m_Entries.size(); i++) {
this->m_Entries[i].setModelMatrix(matrix);
}
glm::vec3 f(matrix[2][0], matrix[2][1], matrix[2][2]);
f *= velocity;
f = -f;
scene->getDefCamera()->Transform(f);
}
LookAt = GLM :: LookAt (this-> Position, this- > position + this-> avant, this-> haut); this-> front est un vecteur normalisé. vous ajoutez une petite quantité à votre position de caméra je pense. glm :: lookat deuxième argument devrait être la position mondiale de l'objet, pas sûr ... –
mettre le centre au lieu de position + avant, il pourrait aider, ne sais pas –
le deuxième vecteur dans les paramètres de la fonction lookAt est la direction de la vue et le centre et la position + avant dans la direction du vecteur de sauvegarde de sorte que le résultat est le même – Mohamed