我正在構建一個簡單的第一人稱攝像機,它假定向上矢量總是匹配世界+ Z軸,即不滾動。使用四元數的方位在第一人稱攝像機中的夾距
我正在使用四元數來存儲相機的方向。 (我試圖遠離歐拉角。)
現在,假設我想限制攝像機的可能音高到-85到85度的音高。這意味着當我對攝像機應用一些附加音調時,如果音高超過上述閾值,我需要有某種邏輯來限制音高。
考慮到相機的方向存儲爲四元數,有效的方法是什麼?
我目前的想法是從四元數中提取正向(即看看At)和右向量。將前向量和全局X或Y向量投影到由右向量法線形成的平面中,然後找到這些投影向量之間的角度差。儘管每次我改變球場,但這似乎有很多數學要做。假設甚至一個有效的解決方案,我不知道是否有更好和更簡單的方法...
這裏是我當前的間距設置代碼(使用本徵數學庫):
void Camera::pitch(float angleInRadians)
{
if (angleInRadians != 0.0)
{
// TODO: Apply pitch restriction. <----------------- how?
mRotation *= Quaternionf(AngleAxisf(-angleInRadians, Vector3f::UnitX()));
mRotation.normalize();
mIsViewMatrixDirty = true;
}
}
感謝您抽出寶貴的時間來回答這個問題。我應該更清楚地表明在弧度的角度被累積到mRotation ......你中有我,雖然想...我可以「俯仰」存儲爲成員變量和使用,作爲一個辦法做到在球場上簿記方向。但這種方法的問題在於'pitch()'func不是我支持的唯一會影響音高值的API。我也想支持lookAt(vec3 target,vec3 camPos)功能。我想我可以明確計算該功能的音高,但要保持音高值。 – user8709
你可以使相機擁有這些成員始終使用你的資源的shared_ptr,以確保所有領域都在同步數據。 –
另外;即使你採取了適合你需求的不同方法,所提供的模板鉗位功能在許多其他領域中始終有用,適用於可重用的通用代碼。我在3D圖形引擎中經常使用它;但是當我從OpenGL v1.0切換到3.5-4.5時,我開始使用具有自己鉗位功能的GLM。 –