2017-04-04 2 views
0

Ainsi, tout récemment, j'ai appris à utiliser escouades, je me suis une caméra fps aller, mais je reçois un certain rouleau « indésirables » lors de la rotation de la locale jusqu'à et droite vecteurs, mais je Je suis assez sûr que c'est normal, mais comment puis-je l'empêcher de faire ça? J'ai essayé quelques méthodes de here et here, les deux ne fonctionnaient pas et ont donné des résultats bizarres lors de la rotation de l'appareil photo. Toute aide serait appréciée!Rouleau non désiré sur l'appareil photo FPS

Download Executable

void Transform::Update() 
{ 
    transform = position * glm::toMat4(quatRot) * scale; 
} 

void Transform::ApplyRotation(glm::vec3 rot, bool isDegr = true) 
{ 
    if (isDegr) 
     quatRot = glm::quat(GetRads(rot)) * quatRot; 
    else 
     quatRot = glm::quat(rot) * quatRot; 
} 

glm::vec3 Transform::Forward() const 
{ 
    return glm::normalize(glm::vec3(transform[2][0], transform[2][1], transform[2][2])); 
} 

glm::vec3 Transform::Right() const 
{ 
    return glm::normalize(glm::vec3(transform[0][0], transform[0][1], transform[0][2])); 
} 

glm::vec3 Transform::Up() const 
{ 
    return glm::normalize(glm::vec3(transform[1][0], transform[1][1], transform[1][2])); 
} 

void FPCamera::Update() 
{ 
    Transform *trans = GetOwner()->GetTransform(); 

    Vec2_i difference = GetWindow()->GetDifference(); 

    glm::vec3 tmpDiff(-(static_cast<float>(difference[1]) * 0.5f), -(static_cast<float>(difference[0]) * 0.5f), 0.0f); 

    trans->ApplyRotation(trans->Right() * tmpDiff[0]); 
    trans->ApplyRotation(trans->Up() * tmpDiff[1]); 

    view = glm::inverse(trans->GetMatrix()); 
} 
+0

normaliser votre vecteur –

+0

@TonyJ Je suppose que vous voulez dire le paramètre 'rot' sur' ApplyRotation'? Je l'ai normalisé, mais il y aura toujours du roulement. – Karutoh

+1

Je dirais de le lancer dans le débogueur, d'ajouter des assertions pour vérifier si le vecteur est normalisé. Je ne peux pas dire à quel point le vecteur n'est pas normalisé sans un exemple minimal, vous devez comprendre cela. Aussi, c'est juste une suggestion, pas nécessairement le problème, j'ai juste vu assez de bugs avec des vecteurs et des quats quand ils ne sont pas normalisés. –

Répondre

0

Je trouve la réponse, quand je solution this, je ne savais pas que je devais utiliser des vecteurs du monde au lieu des vecteurs locaux pour les angles d'axe que je trouve de solution this.

void Transform::ApplyRotation(glm::quat yaw, glm::quat pitch) 
{ 
    quatRot = pitch * quatRot * yaw; 
} 

void FPCamera::Update() 
{ 
    Transform *trans = GetOwner()->GetTransform(); 

    Vec2_i difference = GetWindow()->GetDifference(); 

    glm::vec3 tmpDiff(-(static_cast<float>(difference[1]) * 0.5f), -(static_cast<float>(difference[0]) * 0.5f), 0.0f); 

    trans->ApplyRotation(glm::quat(GetRads(glm::vec3(tmpDiff[0], 0.0f, 0.0f))), glm::quat(GetRads(glm::vec3(0.0f, tmpDiff[1], 0.0f)))); 

    view = glm::inverse(trans->GetMatrix()); 
}