我可以用一种颜色绘制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。
谢谢!
答案 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会更好。