WebGL osg框架學習四

2022-07-08 19:36:16 字數 2747 閱讀 6360

這篇我們接著來看一下drawentityactor類,我們來看看這個繼承drawactor的類到底做了什麼事。我們之前學習了drawable對應的drawactor,那麼我們模擬的來看drawableentity對應drawentityactor,這樣就好理解一些。首先我們還是先來看drawentityactor的建構函式,看看他除了繼承drawactor以外還有哪些私有成員。下面是drawentityactor的建構函式。

1/*2

繪製物件角色3*/

4 let drawactor = require('./drawactor');

5 let geometry = require('../core/geometry');

6 let stateset = require('../core/stateset');

7 let renderentity = require('../scene/renderentity');

8 let sceneroot = require('../scene/sceneroot');

9 let boundingbox = require('../util/boundingbox');

1011 let drawentityactor = function

(renderer) ;

1920 drawentityactor.prototype =object.create(drawactor.prototype);

21 drawentityactor.prototype.constructor = drawentityactor;

我們首先看到這個建構函式是需要renderer渲染物件作為引數的,其次他是繼承drawactor類的。他的私有成員有四個,分別是this._currentrenderentity當前處理的渲染實體;this._currentmaterial當前預設顏色狀態;this._isentitymaterial當這個標記為false時實體的材質取最上面節點的材質;this._currentboundingbox渲染實體的包圍盒。

就這些,其他只要是drawactor父類原型鏈上包含的成員屬性drawentityactor一概包含。   我們來看一下drawentityactor的成員函式有哪些,即他獨有的操作是什麼。我們還是老樣子,乙個乙個來看。

1

//過載

2 pushstateset: function

(stateset)

9 } else13}

14else18}

19 },

這個是覆蓋了父類原型鏈上的pushstateset函式,我們很容易可以看到這是修改了當前渲染狀態樹this._currentstatebin上當前渲染實體對應的狀態stateset節點的狀態,其中討巧的是如果當前狀態為空,就取上級的渲染狀態stateset。剩下的就是將引數stateset狀態賦值給當前渲染實體對應的狀態樹上的狀態節點。

我們接下去看下乙個成員函式。

1 popstateset: function (stateset) 

8 } else

11 }else14}

15 },

此函式同樣是重構原型鏈上的popstateset函式,我們很容易可以看出來這個函式是將特定狀態節點刪除。這裡有乙個要特別注意,由於某些繼承上一級狀態的節點的狀態和上級的狀態是相同的,所以必須遍歷到最靠近葉子的節點才能安全刪除。

好,我們接下去看下乙個函式。

1 pushdrawable: function (geometry)  else 

1112

this

._currentboundingbox.expandbyboundingbox(drawable.getboundingbox());

13this

.adddrawable(drawable);

14 },

這個函式就包含很多操作了,同樣是重構,所有的操作都是組裝渲染物件drawable。首先組裝狀態樹,接下來組裝geometry幾何體物件,然後裝配renderentity渲染物件,接下來設定材質material,然後設定包圍盒,最後加入可繪製物件drawable。裝配完成。接下去鯽魚還有介紹幾個函式。

1/*2

提前遍歷renderentity的目的

3確認每個drawable的世界座標變換,確認除renderentity外的狀態樹

4相機樹基本不用考慮,只有主相機5*/

6 drawentityactor.prototype[sceneroot.typeid] = function

(root) ;

12//

renderentity

13 drawentityactor.prototype[renderentity.typeid] = function

(rentity) ;

35//

geometry已經是葉子,不需要繼續遞迴了

36 drawentityactor.prototype[geometry.typeid] = function

(geometry) ;

42 module.exports = drawentityactor;

這些是一些工具函式,但都掛在原型上,可見將來都可以用到。好了,今天的drawentityactor類就介紹完了,鯽魚謝謝大家陪伴,下週再見。

本文系原創,如需引用,請註明出處:

Zend Framework 框架學習(四)

zend controller包是zend framework mvc 的核心部分。也可以說是 zend framework 中最複雜的部分了。可以說搞清楚了zend controller的複雜流程,就明白了半個zend framework。開啟類zend controller front中的方法g...

爬蟲學習 Scrapy框架學習(四)

接之前的部落格內容 1 建立乙個工程和spider模板 2 編寫spider 3 編寫item pipeline 4 優化配置策略 1 reqeust類 向網路中提交請求的內容 request物件表示乙個http請求 由spider生成,由 執行 屬性或方法 說明 url request對應的請求u...

Django框架學習四 鏈式呼叫

即執行乙個物件中的方法之後得到的結果還是這個物件 如queryset物件 post.objects.filter status 1 filter category id 2 filter title icontain one 每乙個結果都是queryset物件,然後又可以執行該物件裡面的方法filt...