c++ - OpenGL-点云的变色方案

标签 c++ opengl visual-c++ freeglut glu

我有一个从外部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/

相关文章:

c++ - 将 MYSQL 时间戳转换为 time_t

c++ - 来自重载 << 运算符的奇怪链接器错误 - C++

c++ - 为什么要在类之外定义运算符 + 或 +=,以及如何正确执行?

visual-studio - 我可以在不安装 Visual Studio 的情况下编译 Visual Studio 解决方案 (.sln)

c - strstr 表现的几率

c++ - WritePrivateProfileStruct 有大小限制吗?

c++ - 在一个纹理中读取和写入 (OpenGL)

c++ - 使用现代 OpenGL 渲染纹理

无法在 OpenGL 中绘制三角形

c++ - Visual Studio 2008 中是否有 stoll()/stroll() (字符串到 long long)替代方案