我有一組點,每一個都有一個「影響」區域或基本上是一個半徑。我希望能夠將所有點的這些影響圈中的每一個畫成簡單的圓形線。交叉圓的繪製輪廓
它們會重疊,但我希望繪製所形成的形狀的外部。我知道這可能需要我確定它們相交的地方,並以某種方式形成一個完整的形狀來繪製。問題是有些點甚至可能不會觸及別人!所以我需要能夠解決這個問題。
我試圖說明我的意思只是:
注意,我想簡單地畫黑線,無填充。這是因爲我希望背景圖像和其他幾何圖形能夠透過。
我會在openGL中這樣做,所以圓形可能會使用GL_LINES或其他一些形成曲線的各種頂點,但我真的不知道如何解決這個問題。
如果任何人有任何建議,或可以指出我如何可能去工作,這將不勝感激!
這可能是一個數學問題的更多,我不是在尋找一些代碼,但實際上如何去做出這些形狀。我無法思考如何去做!
*****編輯:與我想出的解決方案,希望可以幫助別人!
因此,我使用了建議的想法,並基本上決定最好的方法是繪製使用模板緩衝區。這現在意味着我循環了3次我的觀點,但我需要對它們進行一些仔細的分類,以便只找到可見的分類。
所以代碼明智我現在有這樣的:
private void stencilCircleAroundStars()
{
//Lets try and draw something here using stencil
glColorMask(false, false, false, false); //Disable colour mask
glEnable(GL_STENCIL_TEST); // Enable Stencil Buffer For "marking" the outer circle
glDisable(GL_DEPTH_TEST);// Disable Depth Testing
for (Object value : stars.values())
{
Star star = (Star)value;
glStencilFunc(GL_ALWAYS, 1, 1); // Always Passes, 1 Bit Plane, 1 As Mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 1 Where We Draw Any Polygon
//Draw the large circle
starOb.location.copy(star.location);
starOb.setScale(2000);
starOb.draw();
}
for (Object value : stars.values())
{
Star star = (Star)value;
//Now we change the functions and remove a slightly smaller circle from buffer.
glStencilFunc(GL_ALWAYS, 0, 0); // Always passes, 0 bit plane, 0 as mask;
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 0 Where We Draw Any Polygon
starOb.location.copy(star.location);
starOb.setScale(1900);
starOb.draw();
}
//Now we enable the colour
glColorMask(true, true, true, true);
glStencilFunc(GL_EQUAL, 1, 1); // We Draw Only Where The Stencil Is 1
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // Don't Change The Stencil Buffer
glColor4f(0.5f, 1.0f, 0.5f, 0.5f);
for (Object value : stars.values())
{
Star star = (Star)value;
starOb.location.copy(star.location);
starOb.setScale(2000);
starOb.draw();
}
//Now we are done .. disable
glDisable(GL_STENCIL_TEST);
}
我點是所謂的「明星」爲我計劃的目的和StarOb是四邊形的集合,我已經從一個文件,該文件的形式加載本質實體一個不錯的光滑圓圈。
我禁用了顏色遮罩,我循環了一次,將最大的圓圈插入模板緩衝區並將值設置爲1.然後,再次循環繪製較小的縮放圓圈到模板緩衝區,但是這次設置值爲0.這應該在任何未接觸其他恆星的恆星周圍留下邊界,並且將有效地消除它們重疊的地方。
我終於重新啓用顏色蒙版,並實際繪製彩色圓圈。模板緩衝區停止渲染內部,我得到我想要的!然後我禁用模板緩衝區。
如果你真的想看到它,這裏的生成點幾越來越多的視頻:Video of it running
這裏是它如何出來(背景不同時測試得出)低質量版本:
感謝您的建議我已經設法使用模板緩衝區來解決問題,然後回來用我的解決方案更新我的問題,這是您建議的。不知道我現在應該打勾! – iexus
也許給我們兩個+1? :D – Shahbaz
完成:D我已經更新了我的問題,以顯示最終結果。那是你想的那種方式嗎?我有點缺乏opengl知識.. – iexus