⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwriter3dc.cpp

📁 最新osg包
💻 CPP
字号:
#include <osg/Notify>#include <osg/Geode>#include <osg/Geometry>#include <osgDB/FileNameUtils>#include <osgDB/FileUtils>#include <osgDB/fstream>#include <osgDB/Registry>#include <iostream>#include <stdio.h>using namespace osg;class ReaderWriter3DC : public osgDB::ReaderWriter{    public:            ReaderWriter3DC()        {            supportsExtension("3dc","3DC point cloud format");            supportsExtension("asc","3DC point cloud format");        }            virtual const char* className() const { return "3DC point cloud reader"; }                virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options) const        {            std::string ext = osgDB::getLowerCaseFileExtension(file);            if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;            std::string fileName = osgDB::findDataFile( file, options );            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;                        osg::notify(osg::INFO) << "Reading file "<<fileName<<std::endl;                const int LINE_SIZE = 1024;            char line[LINE_SIZE];                        osgDB::ifstream fin(fileName.c_str());                        unsigned int num = 0;            while (fin)            {                fin.getline(line,LINE_SIZE);                if (line[0]=='#')                {                    // comment line                    osg::notify(osg::INFO) <<"Comment: "<<line<<std::endl;                }                else                {                    ++num;                }            }                                    osg::notify(osg::INFO) << "num="<<num<<std::endl;                        unsigned int targetNumVertices = 10000;                           osg::Geode* geode = new osg::Geode;            osg::Geometry* geometry = new osg::Geometry;                        osg::Vec3Array* vertices = new osg::Vec3Array;            osg::Vec3Array* normals = new osg::Vec3Array;            osg::Vec4ubArray* colours = new osg::Vec4ubArray;                        vertices->reserve(targetNumVertices);            normals->reserve(targetNumVertices);            colours->reserve(targetNumVertices);                        fin.close();                        osgDB::ifstream fin2(fileName.c_str());            while (fin2)            {                fin2.getline(line,LINE_SIZE);                if (line[0]=='#')                {                    // comment line                    osg::notify(osg::INFO) <<"Comment: "<<line<<std::endl;                }                else if (strlen(line)>0)                {                    ++num;                                        osg::Vec3 pos,normal;                    int r,g,b;                                        int a = sscanf(line,"%f %f %f %d %d %d %f %f %f",                                   &pos.x(),&pos.y(),&pos.z(),                                   &r,&g,&b,                                   &normal.x(),&normal.y(),&normal.z());                                                                                    if (a)                    {                                            if (vertices->size()>=targetNumVertices)                        {                            // finishing setting up the current geometry and add it to the geode.                            geometry->setUseDisplayList(true);                                geometry->setUseVertexBufferObjects(true);                                geometry->setVertexArray(vertices);                            geometry->setNormalArray(normals);                            geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);                            geometry->setColorArray(colours);                            geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);                            geometry->addPrimitiveSet(new osg::DrawArrays(GL_POINTS,0,vertices->size()));                                                        geode->addDrawable(geometry);                            // allocate a new geometry                                                        geometry = new osg::Geometry;                            vertices = new osg::Vec3Array;                            normals = new osg::Vec3Array;                            colours = new osg::Vec4ubArray;                            vertices->reserve(targetNumVertices);                            normals->reserve(targetNumVertices);                            colours->reserve(targetNumVertices);                        }                                                                                vertices->push_back(pos);                        normals->push_back(normal);                        colours->push_back(osg::Vec4ub(r,g,b,255));                                            }                }                            }            geometry->setUseDisplayList(true);            geometry->setUseVertexBufferObjects(true);                geometry->setVertexArray(vertices);            geometry->setNormalArray(normals);            geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);            geometry->setColorArray(colours);            geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);            geometry->addPrimitiveSet(new osg::DrawArrays(GL_POINTS,0,vertices->size()));            geode->addDrawable(geometry);                return geode;            }    };// now register with Registry to instantiate the above// reader/writer.REGISTER_OSGPLUGIN(3dc, ReaderWriter3DC)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -