2016-11-21 49 views
-1

我可以用一種顏色畫出3D點,比如說綠色。 但我無法將單獨的顏色應用到每個點。個別顏色的點雲

bool applyColor = true; 
glPointSize(3); 
glBegin(GL_POINTS); 
glColor3ub(0,255,0); 

for(auto vpMP : vpMPs){ 
    if(applyColor){ 
     cv::Vec3b rgb = vpMP->rgb; 
     glColor3ub(rgb[2], rgb[1], rgb[0]); 
     cout << (int)rgb[0] << ", " << (int)rgb[1] << ", " << (int)rgb[2] << endl; // Prints out right values 
    } 
    cv::Mat pos = vpMP->GetWorldPos(); 
    glVertex3f(pos.at<float>(0),pos.at<float>(1),pos.at<float>(2)); 
} 
glEnd(); 

任何線索?

glVertex3f工作正常,點顯示,他們應該是。

With applyColor = false,點顯示爲綠色。

隨着applyColor = TRUE,分顯示黑色的時候,他們應該是RGB。順便說一句,rgb [i]是無符號字符。

謝謝!

+0

那麼你在'cout'中看到了什麼? 'vpMP-> rgb'中有什麼值? – ybungalobill

+0

cout打印這樣的行:'244,98,12'全部糾正0到255的rgb值。 –

+0

這意味着問題出現在你沒有顯示的代碼中。請發佈[MCVE](http://stackoverflow.com/help/mcve)。 – ybungalobill

回答

0

我不能讓我的舊代碼的工作,並且,@ybungalobill指出,該代碼使用舊過時的固定功能流水線,所以我搬到這個更現代的方式工作的。

僅顯示部分碼:

bool color = true; 
struct glPunto{ 
    float x; 
    float y; 
    float z; 
    uchar r; 
    uchar g; 
    uchar b; 
    char padding[17]; // Así la estructura es múltiplo de 32 bytes 
}; 
glPunto glPuntos[N]; 


int i = 0; 
for(auto punto : vpMPs){ 
    cv::Mat pos = punto->GetWorldPos(); 
    auto rgb = punto->rgb; 

    glPunto &glp = glPuntos[i++]; 

    glp.x = pos.at<float>(0); 
    glp.y = pos.at<float>(1); 
    glp.z = pos.at<float>(2); 

    if(color){ 
     glp.r = rgb[2]; 
     glp.g = rgb[1]; 
     glp.b = rgb[0]; 
    } else { 
     glp.r = 0; 
     glp.g = 0; 
     glp.b = 0; 
    } 
} 

glPointSize(color?4:2); 
glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3, GL_FLOAT, sizeof(glPunto), &glPuntos[0].x); 
glEnableClientState (GL_COLOR_ARRAY); 
glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(glPunto), &glPuntos[0].r); 

glDrawArrays(GL_POINTS, 0, i); 

glDisableClientState (GL_COLOR_ARRAY); 
glDisableClientState (GL_VERTEX_ARRAY); 

這仍然沒有代表現有技術的狀態。如果它使用glVertexAttribPointer會更好。