点云与个人颜色

时间:2016-11-21 11:34:12

标签: opengl

我可以用一种颜色绘制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工作正常,点出现在它们应该的位置。

如果applyColor = false,则点会显示为绿色。

如果applyColor = true,则当它们应该是rgb时,点会显示黑色。 BTW,rgb [i]是unsigned char。

谢谢!

1 个答案:

答案 0 :(得分: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会更好。