我有一个从外部csv读取和绘制点的功能。数据类似于激光雷达输出的数据。我需要查看是否可以为一组点赋予不同的颜色。就像xz平面中半径在0-50范围内的所有圆一样,其蓝色为蓝色,而50-10范围内的颜色为红色,依此类推。
这是我绘制点的代码
glBegin(GL_POINTS);
glColor3f(0.961, 0.961, 0.961);
for (int i = 0; i <vx.size(); i++)
{
if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<96.00)
{
glVertex3f(vx[i], vy[i], vz[i]);
}
}
glEnd();
其中vx,vy和vz是
std::vector<float>
数据类型,分别存储x,y,z值。我曾尝试给出如下条件if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<5.00)
{
glColor3f(1.000, 0.549, 0.000);
glVertex3f(vx[i], vy[i], vz[i]);
}
else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 5.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i])) <= 10.00)
{
glColor3f(1.000, 0.843, 0.000);
glVertex3f(vx[i], vy[i], vz[i]);
}
else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 11.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<= 20.00)
{
glColor3f(1.000, 1.000, 0.000);
glVertex3f(vx[i], vy[i], vz[i]);
}
else if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))>= 21.00 && sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<=30.00)
{
glColor3f(0.678, 1.000, 0.184);
glVertex3f(vx[i], vy[i], vz[i]);
}
-----------------//till radius <96
glend();
这为我生成了所需的输出,但是渲染有点慢。我已经包含了缩放和平移功能等,由于多个条件检查,它比较滞后。有没有更有效的方法可以做到这一点?
最佳答案
但是请注意,一种现代的解决方案是将所有点都放在Vertex Buffer Object中,并使用Shader程序来计算片段的颜色。另请参见LearnOpenGL - Shades。
无论如何,主要的性能影响是由Euclidean distance的多次计算引起的。 sqrt
是一个非常耗时的功能。
由于您只想比较距离,因此根本不需要计算距离。无需比较距离,您可以比较距离的平方。例如。:
代替
if (sqrt((vx[i] * vx[i]) + (vz[i] * vz[i]))<96.00)
做
if ( vx[i]*vx[i] + vz[i]*vz[i] < 96.00*96.00 )
此外,我建议简化代码并仅计算一次距离的平方:
```cpp
glBegin(GL_POINTS);
for (int i = 0; i <vx.size(); i++)
{
float dist_sq = vx[i]*vx[i] + vz[i]*vz[i];
if (dist_sq < 5.00 * 5.00)
glColor3f(1.000, 0.549, 0.000);
else if (dist_sq < 10.00 * 10.00)
glColor3f(1.000, 0.843, 0.000);
else if (dist_sq < 20.00 * 20.00)
glColor3f(1.000, 1.000, 0.000);
// [...]
glVertex3f(vx[i], vy[i], vz[i]);
}
glEnd();
关于c++ - OpenGL-点云的变色方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59531028/