OpenGL-点云的不同配色方案
OpenGL- Varying color scheme for point cloud
我有一个函数可以从外部 csv.The 数据读取和绘制点,类似于激光雷达输出的数据。我需要看看是否有办法为一组点赋予不同的颜色。就像 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 and to use a Shader program which calculates the color of the fragment. See also 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();
我有一个函数可以从外部 csv.The 数据读取和绘制点,类似于激光雷达输出的数据。我需要看看是否有办法为一组点赋予不同的颜色。就像 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 and to use a Shader program which calculates the color of the fragment. See also 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();