我試圖在周圍空間中的點,像這樣旋轉攝像頭:繞錯軸旋轉
凡紅點通常會是類似的中心目的。
用戶可以用鼠標旋轉攝像頭,垂直移動應該垂直旋轉(x軸),水平應該水平旋轉(y軸)。
我想
輪作什麼y軸始終對相機的明顯 Y軸,並與X相同。例如,如果用戶將鼠標向上移動,它應該總是看起來像是在向上移動並且在相機所關注的對象上方。如果用戶從左向右移動鼠標,它應該看起來像對象在其y軸上旋轉(或者相機繞y軸移動)。
因此,如果用戶將鼠標向左移動一點,然後開始向上移動它,它應該看起來像是從新角度越過對象的頂部,而不是沿着一個角度旋轉世界的實際x軸。
例如,這似乎是我用過的大多數3D軟件的標準。
我已經試過
有了很多的問題在這裏的幫助下,我已經得到了非常接近我想要的東西,但並不完全。
對於下面的代碼位:view_
是4×4矩陣視圖,origin_
將是我們周圍旋轉圖片現貨,position_
是圖像中的藍線代表的相機是如何追溯到從原點(或任何攝像機平移,但尚未實現),並且pitch
,yaw
和roll
是我們要旋轉的量(在這種情況下,卷始終爲零)。
我最好結果到目前爲止是與此:
// rotation_ is a vec3 here
rotation_ += glm::vec3(glm::radians(pitch), glm::radians(yaw), glm::radians(roll));
glm::mat4 rot = glm::rotate(glm::mat4(1.0f), rotation_.x, glm::vec3(1.0f, 0.0f, 0.0f));
rot = glm::rotate(rot, rotation_.y, glm::vec3(0.0f, 1.0f, 0.0f));
rot = glm::rotate(rot, rotation_.z, glm::vec3(0.0f, 0.0f, 1.0f));
view_ = glm::translate(glm::translate(glm::mat4(1.0f), position_) * rot, origin_);
關閉,但通過旋轉〜90度沿x軸使繞y軸的旋轉進一步出現是圍繞z軸。我似乎無法將y軸複製到x軸,所以我很好奇這是實際上是否爲萬向鎖或其他。
爲了解決這個問題,我想存儲rotation_
作爲四元數,並獲得旋轉這樣的:
// rotation_ is a quaternion here.
rotation_ *= glm::fquat(glm::vec3(glm::radians(pitch), glm::radians(yaw), glm::radians(roll)));
glm::vec3(1.0f, 0.0f, 0.0f));
view_ = glm::translate(glm::translate(glm::mat4(1.0f), position_) * rot, origin_);
這實際上是雪上加霜。看起來我總是沿着世界的軸線而不是相機的方向旋轉,這不是我想要的。
我怎樣才能得到相機總是看上去像是移動鼠標時向上/向下垂直旋轉和移動左/右時總是看上去像是水平旋轉的?
@immibis如果你錯過了它,我確實嘗試了一個四元數解決方案,並且我懷疑答案很可能涉及到四元數。我承認我對四元數的理解並不深刻,但我確實知道基本知識,並在之前使用過幾次。 – Claytorpedo