以前以为rviz是用OpenGL渲染绘图,那么获取图像里像素点对应的真实3D坐标是采用的OpenGL里提供的API实现的,结果一看代码还真不是这样,rviz也就渲染用了OpenGL,其他都是自己实现的,图像界面的实现完全是遵循MVC设计模式自己实现的透视投影和坐标转换等所有相关类。获取点云图像里所选择的点云点的3D坐标相关的代码是这里:
src/rviz/selection/selection_manager.cpp:
bool SelectionManager::getPatchDepthImage(Ogre::Viewport* viewport,
int x,
int y,
unsigned width,
unsigned height,
std::vector<float>& depth_vector)
{
unsigned int num_pixels = width * height;
depth_vector.reserve(num_pixels);
setDepthTextureSize(width, height);
M_CollisionObjectToSelectionHandler::iterator handler_it = objects_.begin();
M_CollisionObjectToSelectionHandler::iterator handler_end = objects_.end();
for (; handler_it != handler_end; ++handler_it)
{
handler_it->second->preRenderPass(0);
}

文章揭示了rviz中图像界面的实现并非完全依赖OpenGL,而是使用MVC模式自定义了透视投影和坐标转换。重点介绍了如何通过射线法在SelectionManager中计算3D点的深度图像和坐标值。
最低0.47元/天 解锁文章
539

被折叠的 条评论
为什么被折叠?



