2013-05-06 148 views
1

我如何確定(這不是我知道的正確用語):window space中鼠標的位置,它被轉換爲OGL space(-1,1 )。在這種情況下,用戶非常快速地移動鼠標,我假設其所有其以前的位置都轉換爲OGL座標。我想說的是......即使我的C++ OGL coordinates converter的計算量非常大,它也是一個普通的CPU,能夠快速完成這個任務(跟蹤所有以前的事件)。可以說我在那裏放了非常耗時的循環?或..非常快method()。如果我足夠快地移動鼠標,我如何確保不會跳出OGL座標? 我不想在這裏得出任何結論或假設別人會想。Windows鼠標座標VS OpenGL鼠標座標

編輯:

我的程序主循環是這樣的(僞):

void Pollevents() 
{ 
    for everyt_obj in this 
    { 
     if Not Collide() 
     { 

      Move(x, y) // 

     } 
    } 
} 

void MousePos() 
{ 
    mouse.pos = To_OGL_Coord2f() 
} 

這些都是單獨的線程中執行(但實際上沒有真正的線程) 假設mouse.pos = (0, 0)然後我移動鼠標足夠快,使新的mouse.pos到(10,10)。在循環的單次執行中,鼠標位置與之前的位置相差甚遠。現在,我怎麼能告訴我的程序,通過執行Christian Rau提到的Bresenham's line algorithm,那個算法產生的那些值(沒有被跟蹤)已經被鼠標穿過。我會添加另一個循環來爲所有這些職位提供幫助嗎?

+1

如果您的計算機在* 13年前被認爲是很慢*,那麼它仍然可以執行每秒超過100億次計算。將一對數字轉換成另一對數字會使你認爲你的電腦無法處理它嗎? – 2013-05-06 09:24:09

+0

我的意思是,該程序正在運行。不是由處理器計算的操作系統。看看[this](http://s23.postimg.org/uoyhevx2z/pos.png) – mr5 2013-05-06 09:37:05

+0

@NicolBolas你可以看到鼠標位置在我將鼠標懸停在窗口。除非這是打印到bash的問題 – mr5 2013-05-06 09:43:05

回答

4

我怎樣才能確保沒有OGL座標跳過,如果我移動鼠標 足夠快?

這是不可能的,因爲沒有辦法讓操作系統生成鼠標事件時,鼠標移動在理論無限精度跟蹤時會越過每個點。

確保這一點的唯一方法是自己填充兩個(可能很遠的)鼠標位置之間的缺失點。如果你只是想爲每個位置繪製一個點,那麼可以使用OpenGL繪製一條線。

如果您在另一方面需要那些中介鼠標位置爲自己進一步的計算,你就不會得到解決使用一些常見的線光柵化算法計算自己他們(像Bresenham Algorithm線路光柵化校書算法) 。這基本上做的是計算離散網格上的每個點,從一點到另一點的線會越過(類似於將圖形卡轉換爲離散像素時的圖形卡),因此這會生成每個離散的鼠標位置鼠標路徑已經越過(忽略測量點之間的任何非線性鼠標移動)。

編輯:如果你不需要用適當的等寬特性的離散線比線光柵化搞亂一個更簡單的方法也將是隻是浮點位置工作,做的一個簡單的線性插值終點,如datenwolf在他的評論中寫道。這也會爲您提供比分立鼠標位置更好的定時精度。但這一切都取決於你真正想要用鼠標位置做什麼(現在將是一個很好的方式告訴我們)。

編輯:從您更新的問題,它看起來像你需要在高粒度的鼠標位置,以計算鼠標與一些對象的碰撞。在這種情況下,你根本不需要中介點。只需從當前鼠標位置到前一個點(表示爲一對點或任何理論線表示)之間的線,並計算物體與該線的碰撞,而不是單個點。

+0

非常好的答案。 – 2013-05-06 10:08:31

+0

在指定的時間內,我該怎麼做?讓我們說毫秒。 Ahm,我的意思是我的程序主要由鼠標驅動。我怎麼能告訴我的程序,這個位置已被鼠標穿過。另外請注意,這不僅僅是一次執行刷新。 – mr5 2013-05-06 10:17:45

+1

@ mr5沒有時間(如果你自己不需要某個特定的時間)。如果您獲得鼠標事件,只需計算您獲得的鼠標位置與最後一個事件(您存儲在某個位置)的鼠標位置之間的所有點。如果你正在談論自己爲這些中間點生成虛擬鼠標事件,那麼我認爲這不是一個好主意。 – 2013-05-06 10:44:44