乙個入門四叉樹例子

2021-06-21 22:41:07 字數 2294 閱讀 8432

乙個四叉樹讀書筆記

源**:

首先四叉樹結構

typedef struct _qnode_qnode;
建立乙個row*col的網格,毋庸置疑,他包含了(row-1)* (col-1)個有效的三維頂點,包含(row-1) * (col-1)  * 2個三角形乙個網格由兩個三角形來表示,要表示這些三角形,則需要 (row-1) * (col-1)  * 2 * 3 個索引來表示。

值得一提的是本例子採用的三角形索引頂點儲存順序如圖所示:

三角形索引序列為: 以乙個網格為例 右上角三角形(i,j),(i+1,j+1) , (i+1,j+0),

左下角三角形 (i,j+1),(i+1,j+1),(i,j) 索引序列儲存的是連續的三角形(以第乙個頂點為標記),

依次類推…..

1 四叉樹由上到下建立,從根節點開始,通過遍歷頂點的x,z,將整張地形的大小賦值給根節點。

2,根節點包圍盒寬高,根據包圍盒的起始位置,將其分割為四個子節點。一次判斷對應子節點中包圍盒中對應的位置包含的三角麵片數來確定是否繼續分割,本例的分割三角麵片數為500個

主:應為每次為子節點新增實際的三角麵片時,都需遍歷整個網格,為了提高效率,了乙個標記為儲存已經歸檔的是三角頂點,在頂點遍歷的過程中提前進行篩選已經遍歷過的頂點

頂點索引很好判斷:原始的頂點索引是以第乙個頂點確定三角麵片,索引只要知道某乙個頂點在包圍盒內,後邊連續兩個索引即為組成三角麵片的三個索引。

這樣頂點編譯進四叉樹中了

首先進入根節點:

1,判斷當前視點是否在節點範圍內,不在,則推出,不渲染

2,判斷當前視角到節點的距離是否超過最小視距,如果是,退出渲染

這裡提一下如何判斷視點到節點(平面包圍盒的距離)

:計算平面包圍盒的四條線,依次判視點到線的距離,取其最短一點,

最短距離不是視點到包圍盒中心平面的投影?

3  如果包圍四個頂點到到視點的方向與視點方向的夾角超過82度,則退出渲染

點到線的最短距離判斷

void quadtree::closestpointonline(vector3 *start, vector3 *end, vector3 *point, vector3 *result)

if (t > d)

// closest point is somewhere on the line

// calculate projected vector using amount & normalised edge vector

pv.x = ev.x * t;

= ev.y * t; //quick speedup. quadtrees ignore y!

pv.z = ev.z * t;

// closest point on line is start + projected vector

result->x = start->x + pv.x;

//result->y = start->y + pv.y; //quick speedup. quadtrees ignore y!

result->y = 0.0f;

result->z = start->z + pv.z;

}

節點視距的角度判斷

bool quadtree::nodeisbehind(qnode *node, vector3 *pos, vector3 *at)

} return true;

}

視點到節點包圍盒的距離

float quadtree::distfrompoint(qnode *node, vector3 *pos)

}ret_dist = sqrtf(ret_dist); //square root it.

/*printf("\n distance to camera = %f ", ret_dist);*/

return ret_dist;

}

1 以四叉樹結構來組織頂點資料,三角資料

2 通過視點與四叉樹的包圍盒進行資料篩選,優化載入

1,沒有lod

2,篩選判斷過於簡單主要體現在節點包圍盒與視距的距離判斷,尤其是節點是否在視距範圍內的判斷

3,資料是一次性載入記憶體的,對於大資料不吭能叫所有頂點都放入記憶體中

第乙個入門例子

1 配置thinkphp 2 嘗試控制器和檢視 1 資料庫 在開始之前,我們首先在資料庫thinkphp中建立乙個think data資料表 以mysql資料庫為例 create table if not exists think data id int 8 unsigned not null au...

scrapy入門的乙個例子

最近在嘗試進行資料分析,首先從資料探勘開始,無可避免地找到了scrapy.scrapy入門教程 首先開啟豆瓣動畫tag的頁面,分析一下url,start代表開始的順序,嘗試改變量字大小,頁面正常跳轉.可以改變這個數字實現翻頁.再去頁面裡找我們需要的東西,一張,還有動畫的資訊.用任意檢視html源 的...

Ruby on Rails 乙個完整的例子(四)

這個例子的一開始,我們是通過訪問rails的welcome頁面進行展示的。現在讓我們通過連線從welcome頁面遷移到article頁面。我們對welcome index.html.erb檔案變更如下 h1 hello,rails link to my blog controller article...