OSG繪製空間凹多邊形並計算其面積

2021-09-25 01:39:22 字數 2562 閱讀 9857

2. 實現

3. 參考

這個問題其實涉及到osg中的兩個問題:多邊形分格化和幾何圖元遍歷。

在opengl/osg中,由於效率的原因,預設是直接顯示的簡單的凸多邊形。如果直接強行顯示凹多邊形,渲染結果是不確定的。所以對於複雜的凹多邊形,需要將其分解成簡單的凸多邊形,這個過程就是多邊形分格化。在osg中是通過osgutil::tessellator類來實現多邊形分格化的。

對於二維的凹多邊形,可以有辦法計算其面積。但是對於三維空間的凹多邊形,計算其面積卻很困難。這是因為三維空間凹多邊形甚至都有可能不是共面的。而我們知道,任何複雜的圖形都是通過分解成三角形進行繪製的,只要獲取分解成的三角形,計算其面積並相加(空間三角形的面積計算比較簡單),就可以得到凹多邊形的總面積。

在osg中提供了乙個用來訪問圖元的類:osg::primitivefunctor,其繼承類osg::********functor可以獲取其三角面圖元。幾何體類osg::geometry提供了遍歷幾何圖元的訪問器介面。

其具體實現如下。注意在查詢多邊形分格化的資料的時候,提到了環繞數和環繞規則的概念。在osg裡面也有相應的引數設定。可惜這一段沒有看明白,只能根據仿照例子來設定了。

#include #include #include #include #include #include using namespace std;

using namespace osg;

osg::ref_ptrredpolygon;

//計算空間三角形的面積

double cal********area(const osg::vec3& a, const osg::vec3& b, const osg::vec3& c)

//三角麵片訪問器

struct ********areafunctor

~********areafunctor() }

void operator() (const osg::vec3& v1, const osg::vec3& v2, const osg::vec3& v3) const

double getsumarea()

protected:

double *sumarea = nullptr;

};//

ref_ptrcreatepolygon()

, ,

, ,

, }; //

ref_ptrgeode = new geode();

redpolygon = new osg::geometry;

//osg::ref_ptrredvex = new osg::vec3array;

redpolygon->setvertexarray(redvex);

for (int i = 0; i< 6; i++)

redpolygon->addprimitiveset(new osg::drawarrays(osg::primitiveset::polygon, 0, 6));

//設定顏色陣列

osg::ref_ptrredcolors = new osg::vec4array;

redcolors->push_back(osg::vec4(1.0, 0.0, 0.0, 0.5));

redpolygon->setcolorarray(redcolors);

redcolors->setbinding(osg::array::bind_per_primitive_set);

//如果需要透明,則加入這個

redpolygon->getorcreatestateset()->setmode(gl_blend, osg::stateattribute::on);

redpolygon->getorcreatestateset()->setrenderinghint(osg::stateset::transparent_bin);

//建立分格化物件(支援凹多邊形)

osg::ref_ptrtscx = new osgutil::tessellator;

//設定分格型別為幾何體

tscx->settessellationtype(osgutil::tessellator::tess_type_geometry);

//設定只顯示輪廓線為false。設定環繞規則,這裡不太懂

tscx->setwindingtype(osgutil::tessellator::tess_winding_odd);

//使用分格化

tscx->retessellatepolygons(*(redpolygon.get()));

geode->adddrawable(redpolygon);

return geode;

}int main()

渲染結果如下:

osg學習筆記(三)之如何將非三角面轉換為三角面

osg幾何體的圖元的遍歷

osg計算並繪製模型中每乙個三角麵片的法向量

osg(openscenegraph)基礎學習9:osg多邊形分格化

canvas繪製多邊形並填充

let canvas document.getelementbyid canvas canvas.width 800 畫布寬度 canvas.height 800 畫布高度 let context canvas.getcontext 2d canvasmonth context,100,100,40...

求任意多邊形面積(凹多邊形和凸多邊形)

遇到問題 已知多邊形的各個左邊點,要求多邊形的面積 然後我搜尋了下看到這篇文章 這個人說的不多,但是簡單明瞭 首先已知各定點的座標分別為 x1,y1 x2,y2 x3,y3 xn,yn 則該多邊形的面積公式為 s 1 2 x1 y2 x2 y1 x2 y3 x3 y2 xk yk 1 xk 1 yk...

直線切割凹多邊形

一,演算法原理 以上圖為例,直線 start,end 切割凹多邊形abcdefghijklmnop。記切割線divline start,end 多邊形頂點序列vertexlist a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p 邊序列edgelist ab,bc,cd,de,ef,f...