OSG-交互
交互過程

viewer的主要的功能是控制場景,它是場景的核心類,如果能響應鍵盤時得到viewer,那么也可以從鍵盤的響應中控制整個場景。viewer中有一個方法,名為addEventHandler就是專門做這件事情的。他會加入一個事件處理器。于是我們就想,一定要自己寫一個事件處理器才行,這就必須要了解事件處理器的格式,只要有一個接口就可以了解它的格式,這個接口就是:osgGA::GUIEventHandler,于是我們可以寫一個類A從該類公有派生出來,即:class A:public osgGA::GUIEventHandler,在里面處理好各種操作然后加入到viewer當中,即:viewer.addEventHadler(new A(里面可以有參數));這樣就可以完成操作。
假如類A是一個事件處理類,那么加入類A可以這樣理解,如圖3.5:
事件類型與響應
代碼 ? ? ? ? ? ? ? ? ? ? 值 ? ? ? ? 事件類型
NONE ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ? 無事件。
PUSH ? ? ? ? ? ? ? ? ? ? 1 鼠標某鍵按下,在上面代碼28行有用到。
RELEASE ? ? 2 鼠標某鍵彈起。
DOUBLECLICK ? 4 鼠標某鍵雙擊。
DRAG ? ? 8 鼠標某鍵拖動。
MOVE 16 鼠標移動。
KEYDOWN ? 32 鍵盤上某鍵按下。
KEYUP ? 64 鍵盤上某鍵彈起。
FRAME ? 128 應該是鼠標每幀。沒用過。
RESIZE ? 256 窗口大小改變時會有的事件。
SCROLL ? ?512 鼠標輪滾動。
PEN_PRESSURE ? ? ? ? 1024 手寫板的某事件?
PEN_PROXIMITY_ENTER ? ? ? 2048 手寫板的某事件?
PEN_PROXIMITY_LEAVE ? ? 4096 手寫板的某事件?
CLOSE_WINDOWS ? ? ? 8192 關閉窗口。
QUIT_APPLICATION ? ? ? 16384 退出程序。
USER ? ? ? 32768 用戶定義。
至于為什么都用2的N次方,主要是因為它的二進制編碼只有一位是一,判斷事件時很好判斷,只要年哪位是一就可以了。
PICK
pick主要是通過鼠標的點擊來拾取一些物體,或者判斷鼠標所點擊的位置在哪里。Pick實現的思路如下圖所示:
判斷射線與viewer中物體相交的方法為發出射線并相交。在OSG中有庫函數,osgViewer::View::computeIntersections他共有三個參數:第一個是x屏幕坐標,第二個是Y屏幕坐標,第三個是存放被交的結點以及相交的坐標結點路徑等等相關信息。
判斷相交結點為我想要的那個結點:只需要判斷存放相交射線交場景的結果集中有沒有要用的結點就可以了。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。