簡體   English   中英

是否有一種有效的\簡單方法在Direct3d中繪制凹多邊形

[英]Is there an efficient\easy way to draw a concave polygon in Direct3d

我正在嘗試使用c#和directx繪制多邊形

我得到的是文件中有序的點列表,我需要在3d世界中繪制平面多邊形。

我可以使用trianglefan和drawuserprimitives加載點並繪制凸形。

當多邊形非常凹陷時(這可能是),這顯然會導致不正確的結果。

我無法想象我是唯一一個要解決這個問題的人(因為我是一個gfx / directx新手 - 我的背景是gui \\ windows應用程序開發)。

任何人都可以指向一個簡單的資源\\ tutorial \\算法可以幫助我嗎?

Direct3D只能繪制三角形(嗯,它也可以繪制線條和點,但除此之外)。 因此,如果要繪制比三角形更復雜的任何形狀,則必須繪制一組等於該形狀的觸摸三角形。

在你的情況下,它是一個凹多邊形三角剖分問題。 給定一堆頂點,你可以按原樣保存它們,你只需要計算“索引緩沖區”(在最簡單的情況下,每個三角形有三個索引,說明三角形使用哪個頂點)。 然后通過放入頂點/索引緩沖區或使用DrawUserPrimitives來繪制它。

用於三角測量簡單(凸或凹,但沒有自交叉或孔)多邊形的一些算法在VTerrain站點

我過去曾使用過Ratcliff的代碼; 非常簡單,效果很好。 VTerrain有一個死鏈接; 代碼可以在這里找到。 它是C ++,但將其移植到C#應該是直截了當的。

哦,不要使用三角扇。 它們使用非常有限,效率低下並且很快就會消失(例如Direct3D 10不再支持它們)。 只需使用三角形列表。

如果你能夠使用模板緩沖區,那應該不難。 這是一個通用算法:

Clear the stencil buffer to 1.
Pick an arbitrary vertex v0, probably somewhere near the polygon to reduce floating-point errors.
For each vertex v[i] of the polygon in clockwise order:
    let s be the segment v[i]->v[i+1] (where i+1 will wrap to 0 when the last vertex is reached)
    if v0 is to the "right" of s:
        draw a triangle defined by s, v[i], v[i+1] that adds 1 to the stencil buffer
    else
        draw a triangle defined by s, v[i], v[i+1] that subtracts 1 from the stencil buffer
end for
fill the screen with the desired color/texture, testing for stencil buffer values >= 2.

“s的權利”是指站在v [i]並面對v [i + 1]的人的角度。 這可以通過使用交叉產品來測試:

交叉(v0 - v [i],v [i + 1] - v [i])> 0

三角測量是他明顯的答案,但很難寫出一個可靠的三角測量儀。 除非你有兩個月的時間浪費甚至不嘗試。

有幾個代碼可以幫助您:

GPC圖書館。 非常容易使用,但您可能不喜歡它的許可證:

http://www.cs.man.ac.uk/~toby/alan/software/gpc.html

還有三角形:

http://www.cs.cmu.edu/~quake/triangle.html

和FIST:

http://www.cosy.sbg.ac.at/~held/projects/triang/triang.html

另一個(和我最喜歡的)選項是使用GLU tesselator。 您可以正常加載和使用DirectX程序中的GLU庫。 它不需要OpenGL上下文來使用它,並且它已預先安裝在所有Windows機器上。 如果您需要源,可以從SGI參考實現中取消三角測量代碼。 我這樣做了一次,花了我幾個小時。

到目前為止進行三角測量。 還有一種不同的方式:你可以使用模板技巧。

一般算法如下:

  1. 禁用顏色和深度寫入。 啟用模板寫入並設置模板緩沖區,它將反轉當前的模板值。 一點模板就足夠了。 哦 - 你的模板緩沖區也應該被清除。

  2. 在屏幕上選擇一個隨機點。 任何會做的。 把這一點稱為你的主持人。

  3. 對於多邊形的每個邊,從構建邊和錨的兩個頂點構建三角形。 繪制那個三角形。

  4. 繪制完所有這些三角形后,關閉模板寫入,打開模板測試和顏色寫入,並以您選擇的顏色繪制全屏四邊形。 這將僅填充凸多邊形內的像素。

最好將錨點放在多邊形的中間,然后繪制一個與多邊形邊界框一樣大的矩形。 這節省了一點填充。

順便說一句 - 模板技術也適用於自相交多邊形。

希望它有所幫助,尼爾斯

我只需要為一個項目做這個。 我發現的最簡單的算法叫做“Ear Clipping”。 關於它的一篇很好的論文在這里: TriangulationByEarClipping.pdf

我帶了大約250行c ++代碼和4小時來實現它的強力版本。 其他算法具有更好的性能,但這很容易實現和理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM