OSG 编译安装 && 使用

发布时间 2023-08-16 15:26:34作者: 玥茹苟
OSG 编译安装 && 使用
1. OSG 编译安装
//安装依赖
sudo apt-get install cmake libgdal-dev libfreetype6-dev zlib1g-dev liblua5.3-dev libcppunit-dev libpng-dev libjpeg-dev libxmu-dev libxmuu-dev libxi-dev
//拉取代码
git clone https://github.com/openscenegraph/osg.git
//构建
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make && make install

2. 测试使用

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Geometry>
#include <osgDB/ReaderWriter>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgGA/StateSetManipulator>
#include <osgUtil/Optimizer>
#include <osgUtil/DelaunayTriangulator>
// #include <pcl/io/ply_io.h>
// #include <pcl/point_types.h>
#include <iostream>

#include "cloud_obstacle_analysis.h"
int main()
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));
    osg::ref_ptr<osg::Group> root = new osg::Group();
    // 创建顶点数组
    osg::ref_ptr<osg::Vec3Array> coords = new osg::Vec3Array();
    osg::ref_ptr<osg::Vec4Array> color = new osg::Vec4Array();

    std::string filename;
    std::vector<obs::MCloud> out_soucre_cloud;
    std::vector<obs::MCloud> out_obs_cloud;
    obs::CloudObstacleAnalysis::readStream(filename,
                                           out_soucre_cloud,
                                           out_obs_cloud);

    // pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>) ;
    // if (pcl::io::loadPLYFile("3-1-2.ply" , *cloud) == -1)
    // {
    //     std::cout<<"读取点云失败!\n" ;
    //     return -1 ;
    // }

    int frame_nums = out_soucre_cloud.size();
    std::cout << "点云数据:" << frame_nums << std::endl;
    int k = 0;
    for (int j = 0; j < frame_nums; ++j)
    {
        for (int i = 0; i < out_soucre_cloud[j].size(); ++i)
        {
            coords->push_back(osg::Vec3(
                out_soucre_cloud[j][i].x(),
                out_soucre_cloud[j][i].y(),
                out_soucre_cloud[j][i].z()));
            color->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 0.3f));
            k++;
        }
    }

    // 创建几何体
    osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();
    // 设置顶点数组
    geometry->setVertexArray(coords.get());
    geometry->setColorArray(color.get());
    geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

    osg::Vec3Array *normals = new osg::Vec3Array;
    normals->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));
    geometry->setNormalArray(normals);
    geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
    geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, k)); // 设置关联方式

    // 添加到叶节点
    osg::ref_ptr<osg::Geode> geode = new osg::Geode();
    geode->addDrawable(geometry.get());
    root->addChild(geode.get());

    // 优化场景数据
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root.get());
    viewer->setSceneData(root.get());

    viewer->realize();
    viewer->run();

    return 0;
}

cmake

cmake_minimum_required( VERSION 2.8 )
project(test_pro)
 
# 添加c++ 11标准支持
set(CMAKE_CXX_FLAGS "-std=c++11" )

# 寻找OpenCV库
find_package(OpenCV 3.2 REQUIRED)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV 3.2 not found.")
endif()

find_package(Eigen3 REQUIRED)

find_package(OpenSceneGraph COMPONENTS 
            osg 
            osgViewer 
            OpenThreads 
            osgAnimation 
            osgGA 
            osgDB
            osgManipulator 
            osgParticle
            osgText
            osgUtil
            osgWidget
            osgShadow)

# 添加头文件
# include_directories(${OpenCV_INCLUDE_DIRS} )

# Source file
file(GLOB header_list
    ${CMAKE_CURRENT_SOURCE_DIR}/*.h)

file(GLOB source_list
    ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

add_executable(${PROJECT_NAME} ${header_list} ${source_list})
target_include_directories(${PROJECT_NAME} PUBLIC 
    ${EIGEN3_INCLUDE_DIRS} 
    ${OpenCV_INCLUDE_DIRS}
    ${OPENSCENEGRAPH_INCLUDE_DIRS})

# message(" opencv include " ${OpenCV_INCLUDE_DIRS})
# 链接OpenCV库
target_link_libraries(${PROJECT_NAME} PUBLIC 
    pthread 
    ${OpenCV_LIBRARIES}
    ${OPENSCENEGRAPH_LIBRARIES})
# message(" opencv lib " ${OpenCV_LIBRARIES})