2008年11月28日

Papervision3D入門第5步

今天入門第5步就講「3D交互」吧

PV3D中提供了一組專門負責3D交互的類,這些類都是以Interactive為開頭,其中有 InteractiveSprite,InteractiveScene3D,InteractiveSceneManager,InteractiveWireframeMaterial 等等。要實現3D交互功能我們就需要用到這些類。

我們這一講的代碼是基於《入門第3步》當中的Cube代碼修改的,所以如果你可能需要參考《入門第3步》的代碼。

首選,我們需要把3D場景的容器對象,改成InteractiveSprite類型:

接著我們要把3D舞台改成支持交互操作的InteractiveScene3D類型:

比起普通的PV3D動畫程序,PV3D的3D交互程序多了一個InteractiveSceneManager對象,它負責所有的3D事件。所以代碼中需要增加一個私有變量:

你可以看到上面的代碼將InteractiveSceneManager對象的faceLevelMode設置成true。這裡需要說明下,PV3D給 InteractiveSceneManager設計了兩種狀態,一種是對象(object)級別的交互,一種是面(face)級別的交互,對象級別的交 互就是只精確到某個對象,比如一個Cube或者一個Plane,而面級別的交互可以精確到PV3D顯示的最小單位face3D,面級別的交互更精確,但是 執行效率比對象級別低很多,所以大家設計交互時需要考慮到這點。

另外代碼中用到的貼圖需要換成支持交互事件的InteractiveWireframeMaterial類型,為了突出顯示,我還另外用了一個InteractiveColorMaterial類型的紅色貼圖。關於材質貼圖的代碼修改:

整個程序的運行效果如下(請把鼠標放上去試試):

這個例子中只實現了face的選擇,並沒有做到Colorfulee問我的選擇Cube某個面的效果,不過通過在鼠標事件中比對材質的id,我們是可以知 道Cube的哪個面被選擇的,不過需要為每個面都示例化一個材質貼圖,不能像示例代碼中那樣幾個面都共享同一個貼圖實例。有興趣的朋友可以自己試試看 :) 。我不希望看我Blog的朋友都變成懶得動手的大懶蟲噢。

今天的學習就到這裡,我想光通過看我的《PV3D入門》是沒辦法完全掌握PV3D的,因為我每一講只能選重點的,或者朋友問得比較多的講,有很多特性我是 沒辦法介紹到的,所以建議大家出來看我的《PV3D入門》外,還可以通過PV3D的幫助文檔,Wiki,或閱讀PV3D源代碼來更深入的瞭解PV3D。

今天的完整示例代碼: