2014-04-11 49 views
1

我有兩個相似的點雲,由向量在空間中給定位置(x,y,z)定義,我想同時渲染兩個雲並評估它們之間的差異。這是我第一次使用OpenGL的應用程序,所以我仍然沒有太多的把握。在OpenGL中繪製兩個點雲之間的交點

我已經設法通過分別處理每個載體,例如以使兩者:

glBegin(GL_POINTS);GLfloat green[] = { 0.f, 1.0f, .0f, alpha[1]/10 }; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, green); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, low_shininess); 
    //glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); 
    for (std::vector<Point3D>::iterator moit = morig_cloud.begin(); moit != morig_cloud.end(); ++moit){ 
     if ((moit - f_cloud.begin()) % (ptd[1]) == 0){ 
      glVertex3f(moit->x, moit->y, moit->z); 
     } 
    } 
    glEnd(); 

然而,當我都重疊,所得到的圖像如下: 1

在哪裏紅色和藍色的雲都應該完美匹配。有什麼辦法可以「合併」這些觀點嗎?也就是說,考慮到點位置匹配,我可以改變匹配位置的顏色?只有點才能完成渲染而不需要網格劃分。

我試着在渲染前比較兩個矢量,但算法速度太慢,因爲點雲太大。

回答

2

如果你想合併它們只是視覺上,所以重疊的部分用紅色和藍色(紫色)的混合着色,你可以啓用alpha混合並使用適當的混合函數。有關提示,請參閱here

+0

現在我將你的答案標記爲正確的答案,因爲它是我用過的答案。兩者似乎都是正確的。 – Ishida

3

你想要做什麼肯定是可能的,但是使用OpenGL你可以只在圖像中合併它們。 OpenGL是一個簡單的繪圖API,它不提供操作幾何的高級方法。

如果純圖像空間合併足夠了,那麼你可以使用模板緩衝區。渲染第一個點雲而不執行顏色寫入glColorMask(0,0,0,0)並在模板緩衝區中設置一個位。然後使用顏色寫入啓用第二個點雲,但只在通過模板測試的位置渲染。

非常適合在屏幕圖像空間中使用OpenGL。


但是我懷疑你想幾何合併點雲。好吧,這裏是:由於點無限小,所以兩點雲的交點就是那些點,對於這些點,在正好是的位置可以在另一個點雲中找到。這歸結爲最近的鄰居搜索,這可以使用Kd樹在三維中相當好地完成(對於更高維度它變得指數級更難)。

但是,我認爲你實際上並不想交叉點雲,而是由它們創建的隱式曲面。因此,假設每個點以一定的半徑在其周圍創建一個標量字段r。一個點雲的總場是每個組成點的場的飽和總和。通過乘以每個點雲的場,您可以獲得相交場。如果您爲每個點雲的每個點對該域進行採樣,並丟棄該域位於閾值以下的所有點,則可以得到兩個點雲的交點。