2017-04-04 45 views
0

所以剛剛我一直在學習使用四元不需要滾,我有一個fps的相機去,但從本地矢量旋轉時,我得到一些「不必要的」滾,但是我很確定這是正常的,但我怎麼阻止它這樣做呢?我嘗試了幾種方法,從herehere,都沒有工作,旋轉相機時出現奇怪的結果。任何幫助,將不勝感激!對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

正常化你的向量 –

+0

@TonyJ我假設你的意思''''''''''''參數'ApplyRotation'?我規範了它,但仍然會出現轉機。 – Karutoh

+1

我會說通過調試器運行它,添加一些斷言來檢查向量是否正常化。沒有一個最簡單的例子,我不能說矢量在哪一點變得不規範,你需要弄清楚。此外,這只是一個建議,不一定是問題,我只是看到了足夠的缺陷與向量和quats時,他們沒有正常化。 –

回答

0

我找到了答案,當我用this的解決方案,我不知道我需要使用到世界的載體,而不是局部向量爲中軸線的角度,因爲我從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()); 
}