2011-07-13 120 views
3

我一直在使用OpenGL和SFML 1.6一段時間,它一直是一個爆炸!有一個例外:我似乎無法正確實現相機類。你看,我正在嘗試創建一個名爲「Camera」的C++類。這裏是我的功能:試圖在OpenGL/SFML中實現鼠標外觀「相機」

Camera::Strafe(float fSpeed)

檢查是否被按下的WASD鍵,如果是這樣,在「fSpeed」在各自的方向移動相機。

Camera::MouseMove(int currentX, int currentY)

應該提供的一款第一人稱鼠標的外觀,同時在當前的鼠標座標,並相應地旋轉相機。我的Strafe()實現工作正常,但我似乎無法得到正確的MouseMove()。

我已經從閱讀OpenGL鼠標外觀實現的其他資源中知道,我必須將鼠標放在每一幀之後,並且我已經關閉了這部分內容。但就是這樣。我似乎無法得到如何實際從鼠標座標旋轉相機。可能需要使用一些trig,我敢打賭。

回答

0

我做了類似的事情(這是第三人稱相機)。如果我記得我所做的是正確的,我將鼠標位置的變化用於計算兩個角度(我相信這是通過一些觸發來實現的)。一個角度給了我水平旋轉,另一個給了我垂直旋轉。雖然我不記得哪個方向指向哪個方向,但是我們可以專注於Pitch,Yaw和Roll。還有一個你必須在另一個之前完成,否則事情會變得有趣。我很確定它先是俯仰,然後偏航或滾轉。

希望它應該是顯而易見的鼠標位置變化。它允許小鼠的智能。如果我快速移動鼠標,我會有一個更大的變化,所以我會旋轉「更快」。

編輯:好吧,我看着我的代碼,這是一個非常簡單的計算。

這是用C#完成的,所以我承擔語法:

_angles.X += MathHelper.ToDegrees(changeInX/100); 
_angles.Y += MathHelper.ToDegrees(changeInY/100); 

我的角度被存放在一個2維向量(因爲我只上兩軸旋轉)。你會看到我把我的changeInX和changeInY值,並簡單地將它們除以100以獲得一些任意的弧度值,然後將該數字轉換爲度數。調整靈敏度100。請記住,沒有堅實的數學來完成這一點。我只是做了一些試驗和錯誤,直到我找到了一些運行良好的東西。

+0

好的,這清除了一些東西了。但是如果將俯仰,偏航和滾動保存爲浮動或向量?兩者都有優勢嗎?謝謝! –

+1

俯仰,偏航和滾轉的值將是您正在移動的實際角度(以度或弧度存儲取決於您)。每個人都將是一個浮動,但沒有理由不能將其中的3個全部存儲到3維向量中,以方便訪問。 – MGZero

+0

間距是圍繞X軸旋轉,偏航是圍繞Y軸旋轉,而滾動是圍繞Z軸旋轉。但是,你如何從鼠標輸入獲得角度? –