2012-05-07 71 views
4

我嘗試更新相機時出現問題。OpenGL相機 - 使用SetCursorPos(x,y)時移動相機時不會反彈回來?

我想通過鼠標更改相機的俯仰和偏航(其視角) 但我希望鼠標保持定位到窗口的中心位置。

//where MouseP.x .y is the mouse position 
//(which is centered to the current window) 

//get old position of the mouse 
OldP.x = MouseP.x; 
OldP.y = MouseP.y; 

//work out the distance traveled 
Delta.x = MouseP.x - OldP.x; 
Delta.y = MouseP.y - OldP.y; 

//update the camera(using distance traveled) 
Rot.Yaw -=Delta.x/5; 
Rot.Pitch -= Delta.y/5; 

//move mouse to the center of the screen 
SetCursorPos(CENTER_SCREEN_X,CENTER_SCREEN_Y); 

問題是當鼠標設置爲返回到原點時,攝像機回到某個點。

我想通過從原點行進的距離更新相機,但不是返回原點的距離。

如果我把它拿出來,它可以很好地工作,但是當時的鼠標可以離開窗戶。

回答

1

我相信這裏的問題是您的代碼塊可能在WM_MOUSEMOVE事件的捕獲範圍內?

當你調用SetCursorPos,它本身產生另一個WM_MOUSEMOVE事件,所以當你移動鼠標,並再次當你調用SetCursorPos和它的這種相反的,你處理的代碼塊一次。

您可能不希望將SetCursorPos置於WM_MOUSEMOVE事件捕獲之內,否則您將生成無限循環的消息(每個SetCursorPos會生成另一個消息循環)。也許你可以將此代碼移動到消息泵之外,並且在更新循環中每幀運行一次:查詢當前鼠標位置,使相機變換,然後將光標移回原點。

+0

Ah sorrry我沒有提到它不在WM_MOUSEMOVE事件中,它被稱爲每一幀,如你所說。我在不同的位置嘗試過它,但似乎問題出在功能之內。 –

+0

您是否認爲有可能將它分散到線程中,並且只有在它返回到原點時纔會發出互斥或信號才能更新信號? –

0
if(g_States::Instance().MouseLook()) 
{ 
    //Test the mouse input 
    POINT mousePos; 
    GetCursorPos(&mousePos); 

    mouseX = mousePos.x; //g_InputEngine::Instance().GetX(); 
    mouseY = mousePos.y; //g_InputEngine::Instance().GetY(); 

    mouseX = mouseX - m_HalfWidth; 
    mouseY = mouseY - m_HalfHeight; 

    mouseFloat = mouseX * C_MOUSESMOOTHINGFACTOR; 
    g_Scene::Instance().GetCamera()->RotateYaw(-mouseFloat); 

    mouseFloat = mouseY * C_MOUSESMOOTHINGFACTOR; 
    g_Scene::Instance().GetCamera()->RotatePitch(mouseFloat); 

    //Reset mouse to center on the screen 
    SetCursorPos(m_HalfWidth,m_HalfHeight); 
} 

所以這是一個spacegame原型,我的樂趣開發前陣子的Mouselook功能我所做的就是將其更改爲使用GetCursorPos(&mousePos);代替。無論您的輸入代碼何時更新鼠標光標位置,這將獲得光標的當前位置。該功能的其餘部分僅用於靈敏度並實際旋轉相機。希望這段代碼有助於你的工作。

讓我知道你是否需要更多的解釋。

編輯:我只記得我這樣做的原因。這是因爲屏幕閃爍,它會移動,但輸入引擎會被SetCursorPos()調用更新,因爲我使用WM_MOUSEMOVE來更新輸入引擎。我不知道你如何得到你的意見,但這應該仍然有幫助。

2

必須注意光標和3D鼠標的移動。人們往往認爲它是相關的,但事實上並非如此。 閱讀msdn下的文章: http://msdn.microsoft.com/en-us/library/windows/desktop/ee418864%28v=vs.85%29.aspx 「利用高清鼠標移動」 這就是在3D應用程序中如何獲得鼠標輸入的方法。應該隱藏光標 。

如果試圖重新定位它,它會創建一個可怕的鋸齒狀的感覺,其中光標試圖通過用戶移動鼠標而逃離中心,但由一個看不見的彈簧保持在原位。這看起來不太專業。你不能與之對抗,因爲你的應用程序在鼠標光標顯示之前沒有被調度。