构建Web3D Viewer widget必备技能与扩展指南

需积分: 50 16 下载量 66 浏览量 更新于2024-08-13 收藏 2.64MB PPT 举报
在开发新的Web3D Viewer widget时,开发者需要掌握一系列关键技能和概念,以便创建出功能强大且易于扩展的应用。首先,基础技术栈包括JavaScript、HTML和CSS,这些是构建任何Web应用的基础,尤其是对于3D交互体验至关重要的前端技术。Dojo框架在此过程中也扮演着重要角色,它提供了额外的工具和库来简化开发过程。 Dojo Viewer并不是从零开始的项目,而是建立在已有的升级版本之上,这意味开发者可以利用现有的良好代码结构,使得应用扩展和维护变得更加高效。其设计原则注重易用性和模块化,允许开发者从第三方获取widget,快速增强系统的功能性,无需从头编写复杂的服务器端代码。 Web3D Viewer作为ArcGIS API for JavaScript 3D的一部分示例应用,具备强大的功能,如书签管理、基图切换、层对比以及路径编辑和播放工具。这个应用主要由框架(包括Config.json、各种核心组件如BaseWidget、WidgetContainer等)和可定制的Widgets构成,如MapManager和GroupTabContainer等,这些组件共同实现复杂的功能集。 框架的设计允许非开发人员通过简单的配置文件(如config.json)进行定制。用户可以通过UIController来管理和调整地图,同时选择合适的Widget添加到容器中,如Basemap和OperationalLayers。WidgetContainer和MapManager作为独立的代码单元,提供灵活的布局和地图管理功能。 扩展Web3D Viewer时,开发者需要关注以下几个步骤: 1. 配置地图,确保与应用的其他组件协同工作。 2. 选择或创建一个Widget,根据需求定制其行为和外观。 3. 更新config.json文件,定义Widget的配置和它们在应用中的位置。 4. 使用预定义的组件,如Map、Container和Widget的组合,以实现所需的功能。 总结来说,开发新的Web3D Viewer widget涉及前端技术、框架集成、组件化设计和配置管理。掌握这些核心要素,开发者能够创建出适应性强、易于维护和扩展的3D Web应用程序。同时,框架的灵活性和模块化特性使得非专业开发人员也能参与到项目的定制和扩展中来。

void QtWidgetsApplication2::pt_clicked(QString data1, QString data2) { pcl::console::TicToc time; // --------------------------------读取点云------------------------------------ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("opened_cloud.pcd", *cloud) == -1) { PCL_ERROR("Cloudn't read file!"); } //cout << "滤波前点的个数为:" << cloud->size() << endl; // --------------------------------直通滤波------------------------------------ float a = data1.toFloat(); float b = data2.toFloat(); pcl::PointCloud<pcl::PointXYZ>::Ptr filtered(new pcl::PointCloud<pcl::PointXYZ>); std::string fv = "z"; // 滤波字段 filtered = pcl_filter_passthrough(cloud, a, b, fv); //cout << "直通滤波用时:" << time.toc() << " ms" << endl; pcl::io::savePCDFileASCII("opened_cloud.pcd", *filtered); ui.textBrowser->clear(); QString Pointsize = QString("%1").arg(cloud->points.size()); ui.textBrowser->insertPlainText(QStringLiteral("点云数量:") + Pointsize); QString Pointsize1 = QString("%1").arg(filtered->points.size()); ui.textBrowser->insertPlainText(QStringLiteral("\n滤波后点云数量:") + Pointsize1); auto renderer2 = vtkSmartPointer<vtkRenderer>::New(); auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New(); renderWindow2->AddRenderer(renderer2); viewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false)); ui.openGLWidget->setRenderWindow(viewer->getRenderWindow()); viewer->setupInteractor(ui.openGLWidget->interactor(), ui.openGLWidget->renderWindow()); viewer->setBackgroundColor(0, 0, 0); //设置背景 pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(filtered, "z"); viewer->addPointCloud<pcl::PointXYZ>(filtered, fildColor, "sample cloud"); viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); viewer->resetCamera(); update(); };这段代码存在内存泄漏的问题

2023-05-26 上传