Opengl 计算转换以在透视视图中获取边界框

Opengl 计算转换以在透视视图中获取边界框,opengl,3d,point-cloud-library,perspectivecamera,Opengl,3d,Point Cloud Library,Perspectivecamera,这个问题并不完全取决于。相反,这是一个计算机图形学问题 给定包含球的场景的透视图,我们需要获得该球的边界框。请参见下面的示例图- 如果投射黄色球,则边界矩形可以由两个对角点s1和s2定义。这些点的三维坐标由以下程序定义- 在中可视化点云 使用专门用于此视图的两个对角线点定义二维边界框,并使用回调函数获取点的三维坐标 通过比较对角线点定义最小和最大x,y坐标 根据实验设置定义最小和最大z坐标 根据上述程序,找到s1和s2的三维坐标,如下所示 Point s1: (0.774406, 0.2953

这个问题并不完全取决于。相反,这是一个计算机图形学问题

给定包含球的场景的透视图,我们需要获得该球的边界框。请参见下面的示例图-

如果投射黄色球,则边界矩形可以由两个对角点
s1
s2
定义。这些点的三维坐标由以下程序定义-

  • 在中可视化点云
  • 使用专门用于此视图的两个对角线点定义二维边界框,并使用回调函数获取点的三维坐标
  • 通过比较对角线点定义最小和最大
    x
    y
    坐标
  • 根据实验设置定义最小和最大z坐标
  • 根据上述程序,找到
    s1
    s2
    的三维坐标,如下所示

    Point s1: (0.774406, 0.295306, 2.703) 
    Point s2: ( 1.37865, 0.845276, 2.834) 
    
    通过比较
    s1
    s2
    ,定义并使用了一个框,但它不起作用。请参阅以下在不同相机角度拍摄的两个输出屏幕截图-

    下面是代码片段-

    double x_min = 0.774406, x_max = 1.37865;
    double y_min = 0.295306, y_max = 0.845276;
    double z_min = 0.2,      z_max = 3.0;
    
    pcl::visualization::PCLVisualizer viewer("Cloud Viewer");
    viewer.setCameraParameters(camera);
    viewer.addCube(x_min, x_max, y_min, y_max, z_min, z_max, 1, 0, 0, "bounding_box"); 
    
    幸运的是,函数还有另一个定义,它提供了一种应用平移和旋转的方法

    我的问题是,使用这两点,即
    s1
    s2
    ,以及如何定义变换,以便边界框包含球。

    下面是下载项目运行所需的所有文件的链接-

  • :CPP文件
  • :上述CPP代码中使用的捕获PCD文件
  • :以上CPP代码中使用的摄像头文件

  • 相关性:PCL 1.8

    您需要在摄影机空间中重新计算边界框,方法是将球近似为一个椭球,该椭球由世界空间中的框s1、s2包围。如果不重新缩放,就无法直接变换(或“旋转”)长方体。@meowgoesthedog:非常感谢!(1)
    computeViewMatrix
    不起作用。(2) 对不起,我没有明白你的意思。如果看到,可以注意到球被
    s1
    s2
    包围。但一旦我旋转了视角,现实就出现了。顺便说一下,我已经添加了
    s1
    s2
    的二维和三维坐标。是的,我确实意识到
    computeViewMatrix
    本身无法工作。
    s1、s2
    在世界空间还是相机空间?如果他们在世界空间,没有理由不工作。如果是相机空间,那么您需要视图矩阵。@meowgoesthedog:是的
    s1
    s2
    位于世界坐标系中。好吧,更清楚的是,我的总体目标是得到包围球的3D空间。然后我看不出为什么这不起作用-除非坐标不正确或者盒子过滤器的转换不是同一性。