2016-04-18 141 views
1

我試圖在周圍空間中的點,像這樣旋轉攝像頭:繞錯軸旋轉

Rotating around an object

凡紅點通常會是類似的中心目的。

用戶可以用鼠標旋轉攝像頭,垂直移動應該垂直旋轉(x軸),水平應該水平旋轉(y軸)。

我想

輪作什麼y軸始終對相機的明顯 Y軸,並與X相同。例如,如果用戶將鼠標向上移動,它應該總是看起來像是在向上移動並且在相機所關注的對象上方。如果用戶從左向右移動鼠標,它應該看起來像對象在其y軸上旋轉(或者相機繞y軸移動)。

因此,如果用戶將鼠標向左移動一點,然後開始向上移動它,它應該看起來像是從新角度越過對象的頂部,而不是沿着一個角度旋轉世界的實際x軸。

例如,這似乎是我用過的大多數3D軟件的標準。

我已經試過

有了很多的問題在這裏的幫助下,我已經得到了非常接近我想要的東西,但並不完全。

對於下面的代碼位:view_是4×4矩陣視圖,origin_將是我們周圍旋轉圖片現貨,position_是圖像中的藍線代表的相機是如何追溯到從原點(或任何攝像機平移,但尚未實現),並且pitch,yawroll是我們要旋轉的量(在這種情況下,卷始終爲零)。

我最好結果到目前爲止是與此:

// 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_); 

這實際上是雪上加霜。看起來我總是沿着世界的軸線而不是相機的方向旋轉,這不是我想要的。

我怎樣才能得到相機總是看上去像是移動鼠標時向上/向下垂直旋轉和移動左/右時總是看上去像是水平旋轉的?

+0

@immibis如果你錯過了它,我確實嘗試了一個四元數解決方案,並且我懷疑答案很可能涉及到四元數。我承認我對四元數的理解並不深刻,但我確實知道基本知識,並在之前使用過幾次。 – Claytorpedo

回答

3

我把我的四元數按錯誤的順序結合起來!

// 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_); 

rotation_ *= glm::fquat(glm::vec3(glm::radians(pitch), glm::radians(yaw), glm::radians(roll))); 

應該將一直

rotation_ = glm::fquat(glm::vec3(glm::radians(pitch), glm::radians(yaw), glm::radians(roll))) * rotation_; 

像這樣的四元數解決方案就像我預期。

如果我理解正確,這是因爲我想先旋轉到新的三角形旋轉,然後將舊的旋轉添加到它。這讓我可以在考慮剩下的旋轉之前先將新的旋轉應用於相機的軸。

以相反的方式做它會讓它旋轉到舊的旋轉,然後將新的旋轉添加到該旋轉,這會導致新的旋轉不會應用到我期望的方向。