Qt3DExtras/QPhongMaterial: No such file or directory
-
Hi, I am using this project. I want to add 3 .dae file to my 2D ros map in project display_occ_map.cpp file as:
#include "display/display_occ_map.h" #include <QtConcurrent> #include <algorithm> #include <iostream> // Qt3D includes for 3D rendering #include <Qt3DRender/QMesh> #include <Qt3DExtras/QPhongMaterial> #include <Qt3DCore/QEntity> #include <Qt3DCore/QTransform> #include <Qt3DExtras/QPlaneMesh> #include <Qt3DExtras/Qt3DWindow> #include <Qt3DExtras/QOrbitCameraController> #include <Qt3DRender/QCamera> #include <QApplication> #include <QWidget> #include <QHBoxLayout> namespace Display { class Display3DMap { public: Display3DMap() { Init3DMap(); } void Init3DMap() { // Create a Qt3D window view = new Qt3DExtras::Qt3DWindow(); QWidget *container = QWidget::createWindowContainer(view); container->setMinimumSize(QSize(400, 400)); container->setMaximumSize(QSize(800, 800)); // Root entity rootEntity = new Qt3DCore::QEntity(); // Camera setup cameraEntity = view->camera(); cameraEntity->lens()->setPerspectiveProjection(45.0f, 16.0f / 9.0f, 0.1f, 1000.0f); cameraEntity->setPosition(QVector3D(0, 0, 20.0f)); cameraEntity->setUpVector(QVector3D(0, 1, 0)); cameraEntity->setViewCenter(QVector3D(0, 0, 0)); // Plane mesh to represent the occupancy map in 3D planeEntity = new Qt3DCore::QEntity(rootEntity); planeMesh = new Qt3DExtras::QPlaneMesh(); planeMesh->setWidth(10); planeMesh->setHeight(10); // Transform for the plane mesh planeTransform = new Qt3DCore::QTransform(); planeTransform->setScale(1.0f); planeTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), -90)); // Basic material for the plane material = new Qt3DExtras::QPhongMaterial(); material->setDiffuse(QColor(QRgb(0xFFFFFF))); planeEntity->addComponent(planeMesh); planeEntity->addComponent(planeTransform); planeEntity->addComponent(material); // Load the .dae model daeEntity = new Qt3DCore::QEntity(rootEntity); daeMesh = new Qt3DRender::QMesh(); daeMesh->setSource(QUrl::fromLocalFile("/home/ubuntubtm.dae")); // Change this to the actual .dae file path // Transform for the .dae mesh daeTransform = new Qt3DCore::QTransform(); daeTransform->setScale(1.0f); // Adjust scale as needed daeTransform->setTranslation(QVector3D(0, 0, 0)); // Adjust position as needed // Basic material for the .dae model daeMaterial = new Qt3DExtras::QPhongMaterial(); daeMaterial->setDiffuse(QColor(QRgb(0xCCCCCC))); // Gray color for .dae model daeEntity->addComponent(daeMesh); daeEntity->addComponent(daeTransform); daeEntity->addComponent(daeMaterial); // Camera controls auto *camController = new Qt3DExtras::QOrbitCameraController(rootEntity); camController->setLinearSpeed(50.0f); camController->setLookSpeed(180.0f); camController->setCamera(cameraEntity); view->setRootEntity(rootEntity); } void Update3DMapData(const OccupancyMap &mapData) { // Example: convert your occupancy map to a 3D heightmap and update plane mesh or generate a new geometry. // This is where you can implement how to visualize the 3D data based on occupancy values. } QWidget *getContainer() { return QWidget::createWindowContainer(view); } private: Qt3DExtras::Qt3DWindow *view; Qt3DCore::QEntity *rootEntity; Qt3DCore::QEntity *planeEntity; Qt3DCore::QEntity *daeEntity; // .dae entity Qt3DRender::QCamera *cameraEntity; Qt3DExtras::QPlaneMesh *planeMesh; Qt3DRender::QMesh *daeMesh; // .dae mesh Qt3DCore::QTransform *planeTransform; Qt3DCore::QTransform *daeTransform; // .dae mesh transform Qt3DExtras::QPhongMaterial *material; Qt3DExtras::QPhongMaterial *daeMaterial; // Material for .dae model }; // Your existing DisplayOccMap class DisplayOccMap::DisplayOccMap(const std::string &display_type, const int &z_value, std::string parent_name) : VirtualDisplay(display_type, z_value, parent_name) { SetMoveEnable(true); // Initialize 3D map visualization display_3d_map_ = new Display3DMap(); } bool DisplayOccMap::UpdateData(const std::any &data) { try { if (data.type() == typeid(OccupancyMap)) { map_data_ = std::any_cast<OccupancyMap>(data); // Update the 3D map with new occupancy data display_3d_map_->Update3DMapData(map_data_); } } catch (const std::bad_any_cast &e) { std::cout << e.what() << '\n'; return false; } ParseOccupyMap(); return true; } void DisplayOccMap::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->drawImage(0, 0, map_image_); } void DisplayOccMap::ParseOccupyMap() { QtConcurrent::run([this]() { map_image_ = QImage(map_data_.Cols(), map_data_.Rows(), QImage::Format_RGB32); for (int i = 0; i < map_data_.Cols(); i++) { for (int j = 0; j < map_data_.Rows(); j++) { double map_value = map_data_(j, i); QColor color; if (map_value == 100) { color = Qt::black; // Black for occupied space } else if (map_value == 0) { color = Qt::white; // White for free space } else if (map_value == 255) { color = Qt::gray; // Gray for unknown space } else { color = Qt::white; } map_image_.setPixel(i, j, color.rgb()); } } SetBoundingRect(QRectF(0, 0, map_image_.width(), map_image_.height())); update(); double x, y; map_data_.xy2ScenePose(0, 0, x, y); CenterOnScene(mapToScene(x, y)); }); } void DisplayOccMap::EraseMapRange(const QPointF &pose, double range) { float x = pose.x(); float y = pose.y(); if (x < 0 || x >= map_image_.width() || y < 0 || y >= map_image_.height()) { return; } int left = qMax(0, static_cast<int>(x - range)); int top = qMax(0, static_cast<int>(y - range)); int right = qMin(map_image_.width() - 1, static_cast<int>(x + range)); int bottom = qMin(map_image_.height() - 1, static_cast<int>(y + range)); for (int i = left; i <= right; ++i) { for (int j = top; j <= bottom; ++j) { map_image_.setPixelColor(i, j, Qt::white); } } update(); } OccupancyMap DisplayOccMap::GetOccupancyMap() { OccupancyMap map = map_data_; for (int i = 0; i < map_image_.width(); i++) { for (int j = 0; j < map_image_.height(); j++) { QRgb pixelValue = map_image_.pixel(i, j); if (pixelValue == QColor(Qt::black).rgb()) { map(j, i) = 100; } else if (pixelValue == QColor(Qt::white).rgb()) { map(j, i) = 0; } else if (pixelValue == QColor(Qt::gray).rgb()) { map(j, i) = 255; } } } return map; } void DisplayOccMap::StartDrawLine(const QPointF &point) { begin_point_ = point; } void DisplayOccMap::DrawingLine(const QPointF &point) { QPointF start = mapFromScene(begin_point_); QPointF end = mapFromScene(point); begin_point_ = point; } void DisplayOccMap::StopDrawLine(const QPointF &point) { QPointF end_point = point; } } // namespace Display
but when I try to build it with cmake I am getting this error:
Ros_Qt5_Gui_App$ sh build_ros2.sh -- Forced to use Qt version 5 BUILD_WITH_CHANNEL_AUTO Auto USE ROS2 channel -- Found ament_cmake: 1.3.6 (/opt/ros/humble/share/ament_cmake/cmake) -- Found rclcpp: 16.0.7 (/opt/ros/humble/share/rclcpp/cmake) -- Found rosidl_generator_c: 3.1.5 (/opt/ros/humble/share/rosidl_generator_c/cmake) -- Found rosidl_adapter: 3.1.5 (/opt/ros/humble/share/rosidl_adapter/cmake) -- Found rosidl_generator_cpp: 3.1.5 (/opt/ros/humble/share/rosidl_generator_cpp/cmake) -- Using all available rosidl_typesupport_c: rosidl_typesupport_fastrtps_c;rosidl_typesupport_introspection_c -- Using all available rosidl_typesupport_cpp: rosidl_typesupport_fastrtps_cpp;rosidl_typesupport_introspection_cpp -- Found rmw_implementation_cmake: 6.1.1 (/opt/ros/humble/share/rmw_implementation_cmake/cmake) -- Found rmw_cyclonedds_cpp: 1.3.4 (/opt/ros/humble/share/rmw_cyclonedds_cpp/cmake) -- Using RMW implementation 'rmw_cyclonedds_cpp' as default -- Found nav_msgs: 4.2.3 (/opt/ros/humble/share/nav_msgs/cmake) -- Found tf2: 0.25.5 (/opt/ros/humble/share/tf2/cmake) -- Found tf2_ros: 0.25.5 (/opt/ros/humble/share/tf2_ros/cmake) -- Found tf2_kdl: 0.25.5 (/opt/ros/humble/share/tf2_kdl/cmake) -- Found eigen3_cmake_module: 0.1.1 (/opt/ros/humble/share/eigen3_cmake_module/cmake) -- Ensuring Eigen3 include directory is part of orocos-kdl CMake target -- Found tf2_geometry_msgs: 0.25.5 (/opt/ros/humble/share/tf2_geometry_msgs/cmake) -- Found sensor_msgs: 4.2.3 (/opt/ros/humble/share/sensor_msgs/cmake) -- Found cv_bridge: 3.2.1 (/opt/ros/humble/share/cv_bridge/cmake) -- Found Boost: /usr/lib/aarch64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found version "1.71.0") found components: thread -- Found Boost: /usr/lib/aarch64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found version "1.71.0") found components: filesystem -- Configuring done -- Generating done -- Build files have been written to: /home/ubuntu/RobotProject/deneme_ws/src/Ros_Qt5_Gui_App/build [ 0%] Automatic MOC for target qt5advanceddocking [ 0%] Built target qt5advanceddocking_autogen Consolidate compiler generated dependencies of target qt5advanceddocking [ 18%] Built target qt5advanceddocking Consolidate compiler generated dependencies of target yaml-cpp [ 39%] Built target yaml-cpp Consolidate compiler generated dependencies of target yaml-cpp-sandbox [ 41%] Built target yaml-cpp-sandbox Consolidate compiler generated dependencies of target yaml-cpp-parse [ 43%] Built target yaml-cpp-parse Consolidate compiler generated dependencies of target yaml-cpp-read [ 44%] Built target yaml-cpp-read Consolidate compiler generated dependencies of target common [ 47%] Built target common Consolidate compiler generated dependencies of target channel [ 48%] Built target channel Consolidate compiler generated dependencies of target channel_ros2 [ 50%] Built target channel_ros2 Consolidate compiler generated dependencies of target plugin [ 52%] Built target plugin Consolidate compiler generated dependencies of target mainwindow [ 53%] Building CXX object mainwindow/CMakeFiles/mainwindow.dir/src/display/display_occ_map.cpp.o In file included from /home/ubuntu/RobotProject/deneme_ws/src/Ros_Qt5_Gui_App/mainwindow/src/display/display_occ_map.cpp:1: /home/ubuntu/RobotProject/deneme_ws/src/Ros_Qt5_Gui_App/mainwindow/include/display/display_occ_map.h:16:10: fatal error: Qt3DExtras/QPhongMaterial: No such file or directory 16 | #include <Qt3DExtras/QPhongMaterial> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [mainwindow/CMakeFiles/mainwindow.dir/build.make:383: mainwindow/CMakeFiles/mainwindow.dir/src/display/display_occ_map.cpp.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:1383: mainwindow/CMakeFiles/mainwindow.dir/all] Error 2 make: *** [Makefile:146: all] Error 2
I want to note that I have installed and can verify necesarry libraries with:
dpkg -l | grep libqt ii libqt53danimation5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D animation module ii libqt53dcore5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D module ii libqt53dextras5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D extras ii libqt53dinput5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Input module ii libqt53dlogic5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D logic module ii libqt53dquick5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick module ii libqt53dquickanimation5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick animation module ii libqt53dquickextras5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick extras ii libqt53dquickinput5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick input ii libqt53dquickrender5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick Renderer module ii libqt53dquickscene2d5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick scene module ii libqt53drender5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Renderer module ii libqt5charts5:arm64 5.12.8-0ubuntu1 arm64 Qt charts shared library ii libqt5concurrent5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 concurrent module ii libqt5core5a:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 core module ii libqt5dbus5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 D-Bus module ii libqt5designer5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 designer module ii libqt5designercomponents5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Designer components module ii libqt5gui5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 GUI module ii libqt5help5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 help module ii libqt5location5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Location module ii libqt5location5-plugins:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Location module - geolocation plugins ii libqt5network5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 network module ii libqt5opengl5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 OpenGL module ii libqt5opengl5-dev:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 OpenGL library development files ii libqt5positioning5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Positioning module ii libqt5positioning5-plugins:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Positioning module - position plugins ii libqt5positioningquick5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Positioning module - Qt Quick module ii libqt5printsupport5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 print support module ii libqt5qml5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 QML module ii libqt5quick5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick library ii libqt5quickcontrols2-5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 5 Quick Controls 2 library ii libqt5quickparticles5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick particles module ii libqt5quickshapes5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick Shapes module ii libqt5quicktemplates2-5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 5 Quick Templates 2 library ii libqt5quicktest5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick Test library ii libqt5quickwidgets5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick Widgets library ii libqt5sensors5:arm64 5.12.8-0ubuntu1 arm64 Qt Sensors module ii libqt5serialport5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 serial port support ii libqt5sql5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 SQL module ii libqt5sql5-sqlite:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 SQLite 3 database driver ii libqt5svg5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 SVG module ii libqt5svg5-dev:arm64 5.12.8-0ubuntu1 arm64 Qt 5 SVG module development files ii libqt5test5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 test module ii libqt5webchannel5:arm64 5.12.8-0ubuntu1 arm64 Web communication library for Qt ii libqt5webkit5:arm64 5.212.0~alpha4-1ubuntu2.1 arm64 Web content engine library for Qt ii libqt5webkit5-dev:arm64 5.212.0~alpha4-1ubuntu2.1 arm64 Web content engine library for Qt - development files ii libqt5widgets5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 widgets module ii libqt5x11extras5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 X11 extras ii libqt5xml5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 XML module
for displa file's CMakeLists.txt I have made changes because firstly, 3D libraries cannot be found from cmake even if it exists.
Here is the cmake file that I changed:include(TargetNameHelper) GetTargetName() find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) find_package(Qt5 COMPONENTS Widgets Concurrent Svg REQUIRED) link_directories("/usr/lib/aarch64-linux-gnu") file(GLOB_RECURSE SOURCE_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} src/*.cpp src/*.cc) list(FILTER SOURCE_FILE EXCLUDE REGEX "(.*_test\\.cpp$)|(.*_test\\.cc$)") file(GLOB_RECURSE UI_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} ui/*.ui) file(GLOB_RECURSE QRC_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} resource/*.qrc) file(GLOB_RECURSE INCLUDE_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} include/*.h *.hpp) ####qt moc qt5_wrap_ui(QT_UI_HPP ${UI_FILE}) qt5_wrap_cpp(QT_MOC_HPP ${INCLUDE_FILE}) qt5_add_resources(QT_RESOUCE_HPP ${QRC_FILE}) set(SO_FILES /usr/lib/aarch64-linux-gnu/libQt53DCore.so /usr/lib/aarch64-linux-gnu/libQt53DExtras.so.5 /usr/lib/aarch64-linux-gnu/libQt53DRender.so # Add other .so files here ) #向可执行程序添加源文件 add_library(${TARGET_NAME} STATIC ${SOURCE_FILE} ${INCLUDE_FILE} ${UI_FILE} ${QT_MOC_HPP} ${QRC_FILE} ${QT_RESOUCE_HPP} ) #项目包含的头文件路径 target_include_directories( ${TARGET_NAME} PUBLIC include/ include/display/ ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(${TARGET_NAME} Qt5::Widgets Qt5::Core Qt5::Concurrent Qt5::Svg ${SO_FILES} qt${QT_VERSION_MAJOR}advanceddocking json_struct common basic channel plugin ${OpenCV_LIBS})
lastly, in project there exists .pro file and I add 3D libs to Qt += part as follows:
ADS_OUT_ROOT = $${OUT_PWD}/.. CONFIG += c++14 CONFIG += debug_and_release TARGET = $$qtLibraryTarget(qtadvanceddocking) DEFINES += QT_DEPRECATED_WARNINGS TEMPLATE = lib DESTDIR = $${ADS_OUT_ROOT}/lib QT += core gui widgets 3dcore 3drender 3dextras !adsBuildStatic { CONFIG += shared DEFINES += ADS_SHARED_EXPORT } adsBuildStatic { CONFIG += staticlib DEFINES += ADS_STATIC } windows { # MinGW *-g++* { QMAKE_CXXFLAGS += -Wall -Wextra -pedantic } # MSVC *-msvc* { QMAKE_CXXFLAGS += /utf-8 } } RESOURCES += ads.qrc HEADERS += \ ads_globals.h \ DockAreaWidget.h \ DockAreaTabBar.h \ DockContainerWidget.h \ DockManager.h \ DockWidget.h \ DockWidgetTab.h \ DockingStateReader.h \ FloatingDockContainer.h \ FloatingDragPreview.h \ DockOverlay.h \ DockSplitter.h \ DockAreaTitleBar_p.h \ DockAreaTitleBar.h \ ElidingLabel.h \ IconProvider.h \ DockComponentsFactory.h \ DockFocusController.h \ AutoHideDockContainer.h \ AutoHideSideBar.h \ AutoHideTab.h \ PushButton.h \ ResizeHandle.h SOURCES += \ ads_globals.cpp \ DockAreaWidget.cpp \ DockAreaTabBar.cpp \ DockContainerWidget.cpp \ DockManager.cpp \ DockWidget.cpp \ DockingStateReader.cpp \ DockWidgetTab.cpp \ FloatingDockContainer.cpp \ FloatingDragPreview.cpp \ DockOverlay.cpp \ DockSplitter.cpp \ DockAreaTitleBar.cpp \ ElidingLabel.cpp \ IconProvider.cpp \ DockComponentsFactory.cpp \ DockFocusController.cpp \ AutoHideDockContainer.cpp \ AutoHideSideBar.cpp \ AutoHideTab.cpp \ PushButton.cpp \ ResizeHandle.cpp unix:!macx { HEADERS += linux/FloatingWidgetTitleBar.h SOURCES += linux/FloatingWidgetTitleBar.cpp LIBS += -lxcb QT += gui-private } isEmpty(PREFIX){ PREFIX=../installed warning("Install Prefix not set") } headers.path=$$PREFIX/include headers.files=$$HEADERS target.path=$$PREFIX/lib INSTALLS += headers target DISTFILES +=
Lastly, I have check the issues like 1,2 and follow given instructions to solve my issue, but they didnt help.
What could be the problem causes this issue?
Thanks in advance. -
Hi, I am using this project. I want to add 3 .dae file to my 2D ros map in project display_occ_map.cpp file as:
#include "display/display_occ_map.h" #include <QtConcurrent> #include <algorithm> #include <iostream> // Qt3D includes for 3D rendering #include <Qt3DRender/QMesh> #include <Qt3DExtras/QPhongMaterial> #include <Qt3DCore/QEntity> #include <Qt3DCore/QTransform> #include <Qt3DExtras/QPlaneMesh> #include <Qt3DExtras/Qt3DWindow> #include <Qt3DExtras/QOrbitCameraController> #include <Qt3DRender/QCamera> #include <QApplication> #include <QWidget> #include <QHBoxLayout> namespace Display { class Display3DMap { public: Display3DMap() { Init3DMap(); } void Init3DMap() { // Create a Qt3D window view = new Qt3DExtras::Qt3DWindow(); QWidget *container = QWidget::createWindowContainer(view); container->setMinimumSize(QSize(400, 400)); container->setMaximumSize(QSize(800, 800)); // Root entity rootEntity = new Qt3DCore::QEntity(); // Camera setup cameraEntity = view->camera(); cameraEntity->lens()->setPerspectiveProjection(45.0f, 16.0f / 9.0f, 0.1f, 1000.0f); cameraEntity->setPosition(QVector3D(0, 0, 20.0f)); cameraEntity->setUpVector(QVector3D(0, 1, 0)); cameraEntity->setViewCenter(QVector3D(0, 0, 0)); // Plane mesh to represent the occupancy map in 3D planeEntity = new Qt3DCore::QEntity(rootEntity); planeMesh = new Qt3DExtras::QPlaneMesh(); planeMesh->setWidth(10); planeMesh->setHeight(10); // Transform for the plane mesh planeTransform = new Qt3DCore::QTransform(); planeTransform->setScale(1.0f); planeTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), -90)); // Basic material for the plane material = new Qt3DExtras::QPhongMaterial(); material->setDiffuse(QColor(QRgb(0xFFFFFF))); planeEntity->addComponent(planeMesh); planeEntity->addComponent(planeTransform); planeEntity->addComponent(material); // Load the .dae model daeEntity = new Qt3DCore::QEntity(rootEntity); daeMesh = new Qt3DRender::QMesh(); daeMesh->setSource(QUrl::fromLocalFile("/home/ubuntubtm.dae")); // Change this to the actual .dae file path // Transform for the .dae mesh daeTransform = new Qt3DCore::QTransform(); daeTransform->setScale(1.0f); // Adjust scale as needed daeTransform->setTranslation(QVector3D(0, 0, 0)); // Adjust position as needed // Basic material for the .dae model daeMaterial = new Qt3DExtras::QPhongMaterial(); daeMaterial->setDiffuse(QColor(QRgb(0xCCCCCC))); // Gray color for .dae model daeEntity->addComponent(daeMesh); daeEntity->addComponent(daeTransform); daeEntity->addComponent(daeMaterial); // Camera controls auto *camController = new Qt3DExtras::QOrbitCameraController(rootEntity); camController->setLinearSpeed(50.0f); camController->setLookSpeed(180.0f); camController->setCamera(cameraEntity); view->setRootEntity(rootEntity); } void Update3DMapData(const OccupancyMap &mapData) { // Example: convert your occupancy map to a 3D heightmap and update plane mesh or generate a new geometry. // This is where you can implement how to visualize the 3D data based on occupancy values. } QWidget *getContainer() { return QWidget::createWindowContainer(view); } private: Qt3DExtras::Qt3DWindow *view; Qt3DCore::QEntity *rootEntity; Qt3DCore::QEntity *planeEntity; Qt3DCore::QEntity *daeEntity; // .dae entity Qt3DRender::QCamera *cameraEntity; Qt3DExtras::QPlaneMesh *planeMesh; Qt3DRender::QMesh *daeMesh; // .dae mesh Qt3DCore::QTransform *planeTransform; Qt3DCore::QTransform *daeTransform; // .dae mesh transform Qt3DExtras::QPhongMaterial *material; Qt3DExtras::QPhongMaterial *daeMaterial; // Material for .dae model }; // Your existing DisplayOccMap class DisplayOccMap::DisplayOccMap(const std::string &display_type, const int &z_value, std::string parent_name) : VirtualDisplay(display_type, z_value, parent_name) { SetMoveEnable(true); // Initialize 3D map visualization display_3d_map_ = new Display3DMap(); } bool DisplayOccMap::UpdateData(const std::any &data) { try { if (data.type() == typeid(OccupancyMap)) { map_data_ = std::any_cast<OccupancyMap>(data); // Update the 3D map with new occupancy data display_3d_map_->Update3DMapData(map_data_); } } catch (const std::bad_any_cast &e) { std::cout << e.what() << '\n'; return false; } ParseOccupyMap(); return true; } void DisplayOccMap::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { painter->drawImage(0, 0, map_image_); } void DisplayOccMap::ParseOccupyMap() { QtConcurrent::run([this]() { map_image_ = QImage(map_data_.Cols(), map_data_.Rows(), QImage::Format_RGB32); for (int i = 0; i < map_data_.Cols(); i++) { for (int j = 0; j < map_data_.Rows(); j++) { double map_value = map_data_(j, i); QColor color; if (map_value == 100) { color = Qt::black; // Black for occupied space } else if (map_value == 0) { color = Qt::white; // White for free space } else if (map_value == 255) { color = Qt::gray; // Gray for unknown space } else { color = Qt::white; } map_image_.setPixel(i, j, color.rgb()); } } SetBoundingRect(QRectF(0, 0, map_image_.width(), map_image_.height())); update(); double x, y; map_data_.xy2ScenePose(0, 0, x, y); CenterOnScene(mapToScene(x, y)); }); } void DisplayOccMap::EraseMapRange(const QPointF &pose, double range) { float x = pose.x(); float y = pose.y(); if (x < 0 || x >= map_image_.width() || y < 0 || y >= map_image_.height()) { return; } int left = qMax(0, static_cast<int>(x - range)); int top = qMax(0, static_cast<int>(y - range)); int right = qMin(map_image_.width() - 1, static_cast<int>(x + range)); int bottom = qMin(map_image_.height() - 1, static_cast<int>(y + range)); for (int i = left; i <= right; ++i) { for (int j = top; j <= bottom; ++j) { map_image_.setPixelColor(i, j, Qt::white); } } update(); } OccupancyMap DisplayOccMap::GetOccupancyMap() { OccupancyMap map = map_data_; for (int i = 0; i < map_image_.width(); i++) { for (int j = 0; j < map_image_.height(); j++) { QRgb pixelValue = map_image_.pixel(i, j); if (pixelValue == QColor(Qt::black).rgb()) { map(j, i) = 100; } else if (pixelValue == QColor(Qt::white).rgb()) { map(j, i) = 0; } else if (pixelValue == QColor(Qt::gray).rgb()) { map(j, i) = 255; } } } return map; } void DisplayOccMap::StartDrawLine(const QPointF &point) { begin_point_ = point; } void DisplayOccMap::DrawingLine(const QPointF &point) { QPointF start = mapFromScene(begin_point_); QPointF end = mapFromScene(point); begin_point_ = point; } void DisplayOccMap::StopDrawLine(const QPointF &point) { QPointF end_point = point; } } // namespace Display
but when I try to build it with cmake I am getting this error:
Ros_Qt5_Gui_App$ sh build_ros2.sh -- Forced to use Qt version 5 BUILD_WITH_CHANNEL_AUTO Auto USE ROS2 channel -- Found ament_cmake: 1.3.6 (/opt/ros/humble/share/ament_cmake/cmake) -- Found rclcpp: 16.0.7 (/opt/ros/humble/share/rclcpp/cmake) -- Found rosidl_generator_c: 3.1.5 (/opt/ros/humble/share/rosidl_generator_c/cmake) -- Found rosidl_adapter: 3.1.5 (/opt/ros/humble/share/rosidl_adapter/cmake) -- Found rosidl_generator_cpp: 3.1.5 (/opt/ros/humble/share/rosidl_generator_cpp/cmake) -- Using all available rosidl_typesupport_c: rosidl_typesupport_fastrtps_c;rosidl_typesupport_introspection_c -- Using all available rosidl_typesupport_cpp: rosidl_typesupport_fastrtps_cpp;rosidl_typesupport_introspection_cpp -- Found rmw_implementation_cmake: 6.1.1 (/opt/ros/humble/share/rmw_implementation_cmake/cmake) -- Found rmw_cyclonedds_cpp: 1.3.4 (/opt/ros/humble/share/rmw_cyclonedds_cpp/cmake) -- Using RMW implementation 'rmw_cyclonedds_cpp' as default -- Found nav_msgs: 4.2.3 (/opt/ros/humble/share/nav_msgs/cmake) -- Found tf2: 0.25.5 (/opt/ros/humble/share/tf2/cmake) -- Found tf2_ros: 0.25.5 (/opt/ros/humble/share/tf2_ros/cmake) -- Found tf2_kdl: 0.25.5 (/opt/ros/humble/share/tf2_kdl/cmake) -- Found eigen3_cmake_module: 0.1.1 (/opt/ros/humble/share/eigen3_cmake_module/cmake) -- Ensuring Eigen3 include directory is part of orocos-kdl CMake target -- Found tf2_geometry_msgs: 0.25.5 (/opt/ros/humble/share/tf2_geometry_msgs/cmake) -- Found sensor_msgs: 4.2.3 (/opt/ros/humble/share/sensor_msgs/cmake) -- Found cv_bridge: 3.2.1 (/opt/ros/humble/share/cv_bridge/cmake) -- Found Boost: /usr/lib/aarch64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found version "1.71.0") found components: thread -- Found Boost: /usr/lib/aarch64-linux-gnu/cmake/Boost-1.71.0/BoostConfig.cmake (found version "1.71.0") found components: filesystem -- Configuring done -- Generating done -- Build files have been written to: /home/ubuntu/RobotProject/deneme_ws/src/Ros_Qt5_Gui_App/build [ 0%] Automatic MOC for target qt5advanceddocking [ 0%] Built target qt5advanceddocking_autogen Consolidate compiler generated dependencies of target qt5advanceddocking [ 18%] Built target qt5advanceddocking Consolidate compiler generated dependencies of target yaml-cpp [ 39%] Built target yaml-cpp Consolidate compiler generated dependencies of target yaml-cpp-sandbox [ 41%] Built target yaml-cpp-sandbox Consolidate compiler generated dependencies of target yaml-cpp-parse [ 43%] Built target yaml-cpp-parse Consolidate compiler generated dependencies of target yaml-cpp-read [ 44%] Built target yaml-cpp-read Consolidate compiler generated dependencies of target common [ 47%] Built target common Consolidate compiler generated dependencies of target channel [ 48%] Built target channel Consolidate compiler generated dependencies of target channel_ros2 [ 50%] Built target channel_ros2 Consolidate compiler generated dependencies of target plugin [ 52%] Built target plugin Consolidate compiler generated dependencies of target mainwindow [ 53%] Building CXX object mainwindow/CMakeFiles/mainwindow.dir/src/display/display_occ_map.cpp.o In file included from /home/ubuntu/RobotProject/deneme_ws/src/Ros_Qt5_Gui_App/mainwindow/src/display/display_occ_map.cpp:1: /home/ubuntu/RobotProject/deneme_ws/src/Ros_Qt5_Gui_App/mainwindow/include/display/display_occ_map.h:16:10: fatal error: Qt3DExtras/QPhongMaterial: No such file or directory 16 | #include <Qt3DExtras/QPhongMaterial> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [mainwindow/CMakeFiles/mainwindow.dir/build.make:383: mainwindow/CMakeFiles/mainwindow.dir/src/display/display_occ_map.cpp.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:1383: mainwindow/CMakeFiles/mainwindow.dir/all] Error 2 make: *** [Makefile:146: all] Error 2
I want to note that I have installed and can verify necesarry libraries with:
dpkg -l | grep libqt ii libqt53danimation5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D animation module ii libqt53dcore5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D module ii libqt53dextras5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D extras ii libqt53dinput5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Input module ii libqt53dlogic5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D logic module ii libqt53dquick5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick module ii libqt53dquickanimation5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick animation module ii libqt53dquickextras5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick extras ii libqt53dquickinput5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick input ii libqt53dquickrender5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick Renderer module ii libqt53dquickscene2d5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Quick scene module ii libqt53drender5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 3D Renderer module ii libqt5charts5:arm64 5.12.8-0ubuntu1 arm64 Qt charts shared library ii libqt5concurrent5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 concurrent module ii libqt5core5a:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 core module ii libqt5dbus5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 D-Bus module ii libqt5designer5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 designer module ii libqt5designercomponents5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Designer components module ii libqt5gui5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 GUI module ii libqt5help5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 help module ii libqt5location5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Location module ii libqt5location5-plugins:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Location module - geolocation plugins ii libqt5network5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 network module ii libqt5opengl5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 OpenGL module ii libqt5opengl5-dev:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 OpenGL library development files ii libqt5positioning5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Positioning module ii libqt5positioning5-plugins:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Positioning module - position plugins ii libqt5positioningquick5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt Positioning module - Qt Quick module ii libqt5printsupport5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 print support module ii libqt5qml5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 QML module ii libqt5quick5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick library ii libqt5quickcontrols2-5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 5 Quick Controls 2 library ii libqt5quickparticles5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick particles module ii libqt5quickshapes5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick Shapes module ii libqt5quicktemplates2-5:arm64 5.12.8+dfsg-0ubuntu1 arm64 Qt 5 Quick Templates 2 library ii libqt5quicktest5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick Test library ii libqt5quickwidgets5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 Quick Widgets library ii libqt5sensors5:arm64 5.12.8-0ubuntu1 arm64 Qt Sensors module ii libqt5serialport5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 serial port support ii libqt5sql5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 SQL module ii libqt5sql5-sqlite:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 SQLite 3 database driver ii libqt5svg5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 SVG module ii libqt5svg5-dev:arm64 5.12.8-0ubuntu1 arm64 Qt 5 SVG module development files ii libqt5test5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 test module ii libqt5webchannel5:arm64 5.12.8-0ubuntu1 arm64 Web communication library for Qt ii libqt5webkit5:arm64 5.212.0~alpha4-1ubuntu2.1 arm64 Web content engine library for Qt ii libqt5webkit5-dev:arm64 5.212.0~alpha4-1ubuntu2.1 arm64 Web content engine library for Qt - development files ii libqt5widgets5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 widgets module ii libqt5x11extras5:arm64 5.12.8-0ubuntu1 arm64 Qt 5 X11 extras ii libqt5xml5:arm64 5.12.8+dfsg-0ubuntu2.1 arm64 Qt 5 XML module
for displa file's CMakeLists.txt I have made changes because firstly, 3D libraries cannot be found from cmake even if it exists.
Here is the cmake file that I changed:include(TargetNameHelper) GetTargetName() find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) find_package(Qt5 COMPONENTS Widgets Concurrent Svg REQUIRED) link_directories("/usr/lib/aarch64-linux-gnu") file(GLOB_RECURSE SOURCE_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} src/*.cpp src/*.cc) list(FILTER SOURCE_FILE EXCLUDE REGEX "(.*_test\\.cpp$)|(.*_test\\.cc$)") file(GLOB_RECURSE UI_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} ui/*.ui) file(GLOB_RECURSE QRC_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} resource/*.qrc) file(GLOB_RECURSE INCLUDE_FILE CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR} include/*.h *.hpp) ####qt moc qt5_wrap_ui(QT_UI_HPP ${UI_FILE}) qt5_wrap_cpp(QT_MOC_HPP ${INCLUDE_FILE}) qt5_add_resources(QT_RESOUCE_HPP ${QRC_FILE}) set(SO_FILES /usr/lib/aarch64-linux-gnu/libQt53DCore.so /usr/lib/aarch64-linux-gnu/libQt53DExtras.so.5 /usr/lib/aarch64-linux-gnu/libQt53DRender.so # Add other .so files here ) #向可执行程序添加源文件 add_library(${TARGET_NAME} STATIC ${SOURCE_FILE} ${INCLUDE_FILE} ${UI_FILE} ${QT_MOC_HPP} ${QRC_FILE} ${QT_RESOUCE_HPP} ) #项目包含的头文件路径 target_include_directories( ${TARGET_NAME} PUBLIC include/ include/display/ ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(${TARGET_NAME} Qt5::Widgets Qt5::Core Qt5::Concurrent Qt5::Svg ${SO_FILES} qt${QT_VERSION_MAJOR}advanceddocking json_struct common basic channel plugin ${OpenCV_LIBS})
lastly, in project there exists .pro file and I add 3D libs to Qt += part as follows:
ADS_OUT_ROOT = $${OUT_PWD}/.. CONFIG += c++14 CONFIG += debug_and_release TARGET = $$qtLibraryTarget(qtadvanceddocking) DEFINES += QT_DEPRECATED_WARNINGS TEMPLATE = lib DESTDIR = $${ADS_OUT_ROOT}/lib QT += core gui widgets 3dcore 3drender 3dextras !adsBuildStatic { CONFIG += shared DEFINES += ADS_SHARED_EXPORT } adsBuildStatic { CONFIG += staticlib DEFINES += ADS_STATIC } windows { # MinGW *-g++* { QMAKE_CXXFLAGS += -Wall -Wextra -pedantic } # MSVC *-msvc* { QMAKE_CXXFLAGS += /utf-8 } } RESOURCES += ads.qrc HEADERS += \ ads_globals.h \ DockAreaWidget.h \ DockAreaTabBar.h \ DockContainerWidget.h \ DockManager.h \ DockWidget.h \ DockWidgetTab.h \ DockingStateReader.h \ FloatingDockContainer.h \ FloatingDragPreview.h \ DockOverlay.h \ DockSplitter.h \ DockAreaTitleBar_p.h \ DockAreaTitleBar.h \ ElidingLabel.h \ IconProvider.h \ DockComponentsFactory.h \ DockFocusController.h \ AutoHideDockContainer.h \ AutoHideSideBar.h \ AutoHideTab.h \ PushButton.h \ ResizeHandle.h SOURCES += \ ads_globals.cpp \ DockAreaWidget.cpp \ DockAreaTabBar.cpp \ DockContainerWidget.cpp \ DockManager.cpp \ DockWidget.cpp \ DockingStateReader.cpp \ DockWidgetTab.cpp \ FloatingDockContainer.cpp \ FloatingDragPreview.cpp \ DockOverlay.cpp \ DockSplitter.cpp \ DockAreaTitleBar.cpp \ ElidingLabel.cpp \ IconProvider.cpp \ DockComponentsFactory.cpp \ DockFocusController.cpp \ AutoHideDockContainer.cpp \ AutoHideSideBar.cpp \ AutoHideTab.cpp \ PushButton.cpp \ ResizeHandle.cpp unix:!macx { HEADERS += linux/FloatingWidgetTitleBar.h SOURCES += linux/FloatingWidgetTitleBar.cpp LIBS += -lxcb QT += gui-private } isEmpty(PREFIX){ PREFIX=../installed warning("Install Prefix not set") } headers.path=$$PREFIX/include headers.files=$$HEADERS target.path=$$PREFIX/lib INSTALLS += headers target DISTFILES +=
Lastly, I have check the issues like 1,2 and follow given instructions to solve my issue, but they didnt help.
What could be the problem causes this issue?
Thanks in advance.Hi and welcome,
first,
QPhongMaterial
is deprecated and shouldn't be used in new projects, as the documentation states hereAs far as I can see the project you are referring to is using CMake not QMake?!
How about added/linking the Qt3D module here:
Line 35, inCMakeLists.txt
target_link_libraries(${TARGET_NAME} Qt5::Widgets Qt5::Core Qt5::Concurrent Qt5::Svg qt${QT_VERSION_MAJOR}advanceddocking json_struct common basic channel plugin ${OpenCV_LIBS})
Try to add
Qt5::3dextras Qt5::3DCore
and eveything else you need.