├── .gitignore ├── 03_EmptyExample ├── CMakeLists.txt └── main.cpp ├── 03_MonitorRFC ├── CMakeLists.txt └── main.cpp ├── 03_ReadFromCommandLine ├── CMakeLists.txt └── main.cpp ├── 03_RedirectNotifier ├── CMakeLists.txt └── main.cpp ├── 04_ColoredQuad ├── CMakeLists.txt └── main.cpp ├── 04_DrawOctahedron ├── CMakeLists.txt └── main.cpp ├── 04_OpenGLTeapot ├── CMakeLists.txt └── main.cpp ├── 04_PrimitiveFunctor ├── CMakeLists.txt └── main.cpp ├── 04_SimpleObject ├── CMakeLists.txt └── main.cpp ├── 04_TessellatePolygon ├── CMakeLists.txt └── main.cpp ├── 05_AddModel ├── CMakeLists.txt └── main.cpp ├── 05_AnalyzeStructure ├── CMakeLists.txt └── main.cpp ├── 05_LodNode ├── CMakeLists.txt └── main.cpp ├── 05_ProxyNode ├── CMakeLists.txt └── main.cpp ├── 05_SwitchAnimate ├── CMakeLists.txt └── main.cpp ├── 05_SwitchNode ├── CMakeLists.txt └── main.cpp ├── 05_TranslateNode ├── CMakeLists.txt └── main.cpp ├── 06_BezierCurve ├── CMakeLists.txt └── main.cpp ├── 06_CartoonCow ├── CMakeLists.txt └── main.cpp ├── 06_Fog ├── CMakeLists.txt └── main.cpp ├── 06_Lighting ├── CMakeLists.txt └── main.cpp ├── 06_PolygonMode ├── CMakeLists.txt └── main.cpp ├── 06_StateSetInherit ├── CMakeLists.txt └── main.cpp ├── 06_Texture2D ├── CMakeLists.txt └── main.cpp ├── 06_Translucent ├── CMakeLists.txt └── main.cpp ├── 07_FrameLoop ├── CMakeLists.txt └── main.cpp ├── 07_HUD ├── CMakeLists.txt └── main.cpp ├── 07_MultiSampling ├── CMakeLists.txt └── main.cpp ├── 07_MultipleScene ├── CMakeLists.txt └── main.cpp ├── 07_RTT ├── CMakeLists.txt └── main.cpp ├── 08_AnimateCharacter ├── CMakeLists.txt └── main.cpp ├── 08_AnimationChannel ├── CMakeLists.txt └── main.cpp ├── 08_AnimationPath ├── CMakeLists.txt └── main.cpp ├── 08_FadingIn ├── CMakeLists.txt └── main.cpp ├── 08_Flashing ├── CMakeLists.txt └── main.cpp ├── 08_GeometryDynamically ├── CMakeLists.txt └── main.cpp ├── 08_SwitchUpdate ├── CMakeLists.txt └── main.cpp ├── 09_DrivingCessna ├── CMakeLists.txt └── main.cpp ├── 09_GCTraits ├── CMakeLists.txt └── main.cpp ├── 09_PickingGeometry ├── CMakeLists.txt └── main.cpp ├── 09_UserTimer ├── CMakeLists.txt └── main.cpp ├── 09_Win32Handler ├── CMakeLists.txt └── main.cpp ├── 10_CustomFormat ├── CMakeLists.txt └── main.cpp ├── 11_Billboard ├── CMakeLists.txt └── main.cpp ├── 11_Outline ├── CMakeLists.txt └── main.cpp ├── 11_ParticleSystem ├── CMakeLists.txt └── main.cpp ├── 11_Shadow ├── CMakeLists.txt ├── main - 副本.cpp └── main.cpp ├── 11_Text ├── CMakeLists.txt └── main.cpp ├── 11_Text3D ├── CMakeLists.txt └── main.cpp ├── 12_MultiThread ├── CMakeLists.txt └── main.cpp ├── 12_Occluder ├── CMakeLists.txt └── main.cpp ├── 12_QuadTree ├── CMakeLists.txt └── main.cpp ├── 12_SharingTexture ├── CMakeLists.txt └── main.cpp ├── 12_ThreadingModel ├── CMakeLists.txt └── main.cpp ├── OSGCookExample └── OSGCookExample │ ├── PickHandler.cpp │ ├── common.cpp │ ├── libutil.cpp │ └── main.cpp └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *project/ 2 | *.vs/ 3 | *vs2015_64/ 4 | OSGCookExample/ 5 | *build.bat 6 | .gitignore 7 | -------------------------------------------------------------------------------- /03_EmptyExample/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName EmptyExample) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /03_EmptyExample/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int main(int argc, char** argv) 6 | { 7 | osg::ref_ptr root = osgDB::readNodeFile("cessna.osg"); 8 | osgViewer::Viewer viewer; 9 | viewer.setUpViewInWindow(50, 50, 800, 600); 10 | viewer.setSceneData(root.get()); 11 | return viewer.run(); 12 | } 13 | -------------------------------------------------------------------------------- /03_MonitorRFC/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName MonitorRFC) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /03_MonitorRFC/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | class MonitoringTarget : public osg::Referenced 8 | { 9 | public: 10 | MonitoringTarget(int id) : _id(id) 11 | { 12 | std::cout << "Constructing target " << _id << std::endl; 13 | } 14 | 15 | protected: 16 | virtual ~MonitoringTarget() 17 | { 18 | std::cout << "Destroying target " << _id << std::endl; 19 | } 20 | 21 | int _id; 22 | }; 23 | 24 | MonitoringTarget* createMonitoringTarget(int id) 25 | { 26 | osg::ref_ptr target = new MonitoringTarget(id); 27 | return target.release(); 28 | } 29 | 30 | int main(int argc, char** argv) 31 | { 32 | osg::ref_ptr target = new MonitoringTarget(0); 33 | std::cout << "Referenced count before referring: " 34 | << target->referenceCount() << std::endl; 35 | osg::ref_ptr anotherTarget = target; 36 | std::cout << "Referenced count after referring: " 37 | << target->referenceCount() << std::endl; 38 | 39 | for (unsigned int i = 1; i < 5; i++) 40 | { 41 | osg::ref_ptr subTarget = new MonitoringTarget(i); 42 | } 43 | std::cout << std::endl; 44 | 45 | for (unsigned int i = 6; i < 10; i++) 46 | { 47 | MonitoringTarget* subTarget = createMonitoringTarget(i); 48 | } 49 | 50 | osg::Matrixd m = osg::Matrixd::rotate(osg::DegreesToRadians(70.0), osg::X_AXIS) * 51 | osg::Matrixd::rotate(osg::DegreesToRadians(30.0), osg::Y_AXIS) * osg::Matrixd::rotate(osg::DegreesToRadians(90.0), osg::Z_AXIS); 52 | osg::Vec3d v = osg::Vec3d(0.0, 1.0, 0.0); 53 | v = v * m; 54 | std::cout << v.x() << ", " << v.y() << ", " << v.z() << std::endl; 55 | osg::Vec3d v2(v.x(), v.y(), 0.0); 56 | v2.normalize(); 57 | double yaw = osg::RadiansToDegrees(acos(v2.y())); 58 | if (v2.x() > 0) 59 | yaw = -yaw; 60 | std::cout << "yaw: " << yaw << std::endl; 61 | 62 | double pv = v2.x()*v.x() + v2.y()*v.y(); 63 | double pitch = acos(pv); 64 | pitch = osg::RadiansToDegrees(pitch); 65 | std::cout << "pitch: "<< pitch << std::endl; 66 | 67 | system("pause"); 68 | return 0; 69 | } 70 | -------------------------------------------------------------------------------- /03_ReadFromCommandLine/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName ReadFromCommandLine) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /03_ReadFromCommandLine/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | // #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ArgumentParser arguments(&argc, argv); 9 | std::string filename; 10 | arguments.read("--model", filename); 11 | 12 | osg::ref_ptr root = osgDB::readNodeFile(filename); 13 | osgViewer::Viewer viewer; 14 | viewer.setUpViewInWindow(50, 50, 800, 600); 15 | viewer.setSceneData(root.get()); 16 | return viewer.run(); 17 | } 18 | -------------------------------------------------------------------------------- /03_RedirectNotifier/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName RedirectNotifier) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /03_RedirectNotifier/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | class LogFileHandler : public osg::NotifyHandler 7 | { 8 | public: 9 | LogFileHandler(const char* filename) 10 | { 11 | _log.open(filename); 12 | } 13 | ~LogFileHandler() 14 | { 15 | _log.close(); 16 | } 17 | virtual void notify(osg::NotifySeverity severity, const char *message) 18 | { 19 | _log << message; 20 | } 21 | 22 | private: 23 | std::ofstream _log; 24 | }; 25 | 26 | int main(int argc, char** argv) 27 | { 28 | osg::setNotifyLevel(osg::INFO); 29 | osg::setNotifyHandler(new LogFileHandler("output.txt")); 30 | 31 | osg::ref_ptr root = osgDB::readNodeFile("cessna.osg"); 32 | osgViewer::Viewer viewer; 33 | viewer.setUpViewInWindow(50, 50, 800, 600); 34 | viewer.setSceneData(root.get()); 35 | 36 | OSG_FATAL << "Test Fatal notify."; 37 | 38 | return viewer.run(); 39 | } 40 | -------------------------------------------------------------------------------- /04_ColoredQuad/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName ColoredQuad) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /04_ColoredQuad/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char** argv) 8 | { 9 | osg::ref_ptr geom = new osg::Geometry; 10 | osg::ref_ptr verts = new osg::Vec3Array; 11 | verts->push_back(osg::Vec3(0.0f, 0.0f, 0.0f)); 12 | verts->push_back(osg::Vec3(1.0f, 0.0f, 0.0f)); 13 | verts->push_back(osg::Vec3(1.0f, 0.0f, 1.0f)); 14 | verts->push_back(osg::Vec3(0.0f, 0.0f, 1.0f)); 15 | osg::ref_ptr normals = new osg::Vec3Array; 16 | normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); 17 | osg::ref_ptr colors = new osg::Vec3Array; 18 | colors->push_back(osg::Vec3(1.0f, 0.0f, 0.0f)); 19 | colors->push_back(osg::Vec3(0.0f, 1.0f, 0.0f)); 20 | colors->push_back(osg::Vec3(0.0f, 0.0f, 1.0f)); 21 | colors->push_back(osg::Vec3(1.0f, 1.0f, 1.0f)); 22 | geom->setVertexArray(verts.get()); 23 | geom->setNormalArray(normals.get()); 24 | geom->setColorArray(colors.get()); 25 | geom->setNormalBinding(osg::Geometry::BIND_OVERALL); 26 | geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX); 27 | geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4)); 28 | osg::ref_ptr geode = new osg::Geode; 29 | geode->addDrawable(geom.get()); 30 | 31 | osgViewer::Viewer viewer; 32 | viewer.setUpViewInWindow(50, 50, 800, 600); 33 | viewer.setSceneData(geode.get()); 34 | return viewer.run(); 35 | } 36 | -------------------------------------------------------------------------------- /04_DrawOctahedron/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName DrawOctahedron) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /04_DrawOctahedron/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int main(int argc, char** argv) 9 | { 10 | osg::ref_ptr vertices = new osg::Vec3Array(6); 11 | (*vertices)[0].set(0.0f, 0.0f, 1.0f); 12 | (*vertices)[1].set(-0.5f, -0.5f, 0.0f); 13 | (*vertices)[2].set( 0.5f, -0.5f, 0.0f); 14 | (*vertices)[3].set(0.5f, 0.5f, 0.0f); 15 | (*vertices)[4].set(-0.5f, 0.5f, 0.0f); 16 | (*vertices)[5].set(0.0f, 0.0f, -1.0f); 17 | 18 | osg::ref_ptr indices = new osg::DrawElementsUInt(GL_TRIANGLES, 24); 19 | (*indices)[0] = 0; 20 | (*indices)[1] = 1; 21 | (*indices)[2] = 2; 22 | (*indices)[3] = 0; 23 | (*indices)[4] = 2; 24 | (*indices)[5] = 3; 25 | (*indices)[6] = 0; 26 | (*indices)[7] = 3; 27 | (*indices)[8] = 4; 28 | (*indices)[9] = 0; 29 | (*indices)[10] = 4; 30 | (*indices)[11] = 1; 31 | (*indices)[12] = 5; 32 | (*indices)[13] = 2; 33 | (*indices)[14] = 1; 34 | (*indices)[15] = 5; 35 | (*indices)[16] = 3; 36 | (*indices)[17] = 2; 37 | (*indices)[18] = 5; 38 | (*indices)[19] = 4; 39 | (*indices)[20] = 3; 40 | (*indices)[21] = 5; 41 | (*indices)[22] = 1; 42 | (*indices)[23] = 4; 43 | 44 | osg::ref_ptr geom = new osg::Geometry; 45 | geom->setVertexArray(vertices.get()); 46 | geom->addPrimitiveSet(indices.get()); 47 | osgUtil::SmoothingVisitor::smooth(*geom); 48 | 49 | osg::ref_ptr geode = new osg::Geode; 50 | geode->addDrawable(geom.get()); 51 | 52 | osgViewer::Viewer viewer; 53 | viewer.setUpViewInWindow(50, 50, 800, 600); 54 | viewer.setSceneData(geode.get()); 55 | return viewer.run(); 56 | } 57 | -------------------------------------------------------------------------------- /04_OpenGLTeapot/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName OpenGLTeapot) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(glut) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} GLUT) 24 | -------------------------------------------------------------------------------- /04_OpenGLTeapot/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | class TeapotDrawable : public osg::Drawable 9 | { 10 | public: 11 | TeapotDrawable(float size = 1.0f) : _size(size) { } 12 | TeapotDrawable(const TeapotDrawable& copy, 13 | const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY) : 14 | osg::Drawable(copy, copyop), _size(copy._size) {} 15 | META_Object(osg, TeapotDrawable); 16 | virtual osg::BoundingSphere computeBound() const; 17 | virtual void drawImplementation(osg::RenderInfo& renderInfo) const; 18 | protected: 19 | float _size; 20 | }; 21 | 22 | osg::BoundingSphere TeapotDrawable::computeBound() const 23 | { 24 | return osg::BoundingSphere(osg::Vec3(0.0f, 0.0f, 0.0f), _size); 25 | } 26 | 27 | void TeapotDrawable::drawImplementation(osg::RenderInfo& renderInfo) const 28 | { 29 | glFrontFace(GL_CW); 30 | glutSolidTeapot(_size); 31 | glFrontFace(GL_CCW); 32 | } 33 | 34 | int main(int argc, char** argv) 35 | { 36 | osg::ref_ptr root = new osg::Geode; 37 | root->addDrawable(new TeapotDrawable(1.0)); 38 | osgViewer::Viewer viewer; 39 | viewer.setUpViewInWindow(50, 50, 800, 600); 40 | viewer.setSceneData(root.get()); 41 | return viewer.run(); 42 | } 43 | -------------------------------------------------------------------------------- /04_PrimitiveFunctor/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName PrimitiveFunctor) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /04_PrimitiveFunctor/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | std::ostream& operator<<(std::ostream& os, const osg::Vec3& v) 7 | { 8 | os << v.x() << ", " << v.y() << ", " << v.z(); 9 | return os; 10 | } 11 | 12 | struct FaceCollector 13 | { 14 | void operator()(const osg::Vec3& v1, const osg::Vec3& v2, const osg::Vec3& v3) 15 | { 16 | std::cout << "Face vertices: " << v1 << "; " << v2 << "; " << v3 << std::endl; 17 | } 18 | 19 | void operator()(const osg::Vec3& v1, const osg::Vec3& v2, const osg::Vec3& v3, bool) 20 | { 21 | std::cout << "Face vertices: " << v1 << "; " << v2 << "; " << v3 << std::endl; 22 | } 23 | }; 24 | 25 | int main(int argc, char** argv) 26 | { 27 | osg::ref_ptr vertices = new osg::Vec3Array; 28 | vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f)); 29 | vertices->push_back(osg::Vec3(0.0f, 0.0f, 1.0f)); 30 | vertices->push_back(osg::Vec3(1.0f, 0.0f, 0.0f)); 31 | vertices->push_back(osg::Vec3(1.0f, 0.0f, 1.5f)); 32 | vertices->push_back(osg::Vec3(2.0f, 0.0f, 0.0f)); 33 | vertices->push_back(osg::Vec3(2.0f, 0.0f, 1.0f)); 34 | vertices->push_back(osg::Vec3(3.0f, 0.0f, 0.0f)); 35 | vertices->push_back(osg::Vec3(3.0f, 0.0f, 1.5f)); 36 | vertices->push_back(osg::Vec3(4.0f, 0.0f, 0.0f)); 37 | vertices->push_back(osg::Vec3(4.0f, 0.0f, 1.0f)); 38 | 39 | osg::ref_ptr normal = new osg::Vec3Array; 40 | normal->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); 41 | 42 | osg::ref_ptr geom = new osg::Geometry; 43 | geom->setVertexArray(vertices); 44 | geom->setNormalArray(normal); 45 | geom->setNormalBinding(osg::Geometry::BIND_OVERALL); 46 | geom->addPrimitiveSet(new osg::DrawArrays(GL_QUAD_STRIP, 0, 10)); 47 | 48 | osg::TriangleFunctor triangleFunctor; 49 | geom->accept(triangleFunctor); 50 | 51 | osg::ref_ptr root = new osg::Geode; 52 | root->addDrawable(geom.get()); 53 | osgViewer::Viewer viewer; 54 | viewer.setUpViewInWindow(50, 50, 800, 600); 55 | viewer.setSceneData(root.get()); 56 | return viewer.run(); 57 | } 58 | -------------------------------------------------------------------------------- /04_SimpleObject/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName SimpleObject) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /04_SimpleObject/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr shape1 = new osg::ShapeDrawable; 9 | osg::ref_ptr shape2 = new osg::ShapeDrawable; 10 | osg::ref_ptr shape3 = new osg::ShapeDrawable; 11 | shape1->setShape(new osg::Box(osg::Vec3(-3.0f, 0.0f, 0.0f), 2.0f, 2.0f, 1.0f)); 12 | shape2->setShape(new osg::Sphere(osg::Vec3(3.0f, 0.0f, 0.0f), 1.0f)); 13 | shape3->setShape(new osg::Cone(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f, 1.0f)); 14 | shape2->setColor(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f)); 15 | shape3->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f)); 16 | 17 | osg::ref_ptr geode = new osg::Geode; 18 | geode->addDrawable(shape1.get()); 19 | geode->addDrawable(shape2.get()); 20 | geode->addDrawable(shape3.get()); 21 | 22 | osgViewer::Viewer viewer; 23 | viewer.setUpViewInWindow(50, 50, 800, 600); 24 | viewer.setSceneData(geode.get()); 25 | return viewer.run(); 26 | } 27 | -------------------------------------------------------------------------------- /04_TessellatePolygon/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName TessellatePolygon) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /04_TessellatePolygon/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char** argv) 8 | { 9 | osg::ref_ptr vertices = new osg::Vec3Array; 10 | vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f)); 11 | vertices->push_back(osg::Vec3(2.0f, 0.0f, 0.0f)); 12 | vertices->push_back(osg::Vec3(2.0f, 0.0f, 1.0f)); 13 | vertices->push_back(osg::Vec3(1.0f, 0.0f, 1.0f)); 14 | vertices->push_back(osg::Vec3(1.0f, 0.0f, 2.0f)); 15 | vertices->push_back(osg::Vec3(2.0f, 0.0f, 2.0f)); 16 | vertices->push_back(osg::Vec3(2.0f, 0.0f, 3.0f)); 17 | vertices->push_back(osg::Vec3(0.0f, 0.0f, 3.0f)); 18 | osg::ref_ptr normals = new osg::Vec3Array; 19 | normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); 20 | 21 | osg::ref_ptr geom = new osg::Geometry; 22 | geom->setVertexArray(vertices); 23 | geom->setNormalArray(normals); 24 | geom->setNormalBinding(osg::Geometry::BIND_OVERALL); 25 | geom->addPrimitiveSet(new osg::DrawArrays(GL_POLYGON, 0, 8)); 26 | 27 | osgUtil::Tessellator tessellator; 28 | tessellator.retessellatePolygons(*geom); 29 | 30 | osg::ref_ptr geode = new osg::Geode; 31 | geode->addDrawable(geom.get()); 32 | 33 | osgViewer::Viewer viewer; 34 | viewer.setUpViewInWindow(50, 50, 800, 600); 35 | viewer.setSceneData(geode.get()); 36 | return viewer.run(); 37 | } 38 | -------------------------------------------------------------------------------- /05_AddModel/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName AddModel) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /05_AddModel/main.cpp: -------------------------------------------------------------------------------- 1 | // osg::Group::addChild 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char** argv) 8 | { 9 | osg::ref_ptr model1 = osgDB::readNodeFile("cessna.osg"); 10 | osg::ref_ptr model2 = osgDB::readNodeFile("cow.osg"); 11 | osg::ref_ptr root = new osg::Group; 12 | root->addChild(model1.get()); 13 | root->addChild(model2.get()); 14 | osgViewer::Viewer viewer; 15 | viewer.setUpViewInWindow(50, 50, 800, 600); 16 | viewer.setSceneData(root.get()); 17 | return viewer.run(); 18 | } 19 | -------------------------------------------------------------------------------- /05_AnalyzeStructure/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName AnalyzeStructure) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /05_AnalyzeStructure/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | class InfoVisitor : public osg::NodeVisitor 7 | { 8 | public: 9 | InfoVisitor() : _level(0) 10 | { 11 | setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); 12 | } 13 | 14 | std::string space() 15 | { 16 | return std::string(_level * 2, ' '); 17 | } 18 | 19 | virtual void apply(osg::Node& node); 20 | virtual void apply(osg::Geode& geode); 21 | 22 | private: 23 | unsigned int _level; 24 | }; 25 | 26 | void InfoVisitor::apply(osg::Node& node) 27 | { 28 | std::cout << space() << node.libraryName() << "::" 29 | << node.className() << std::endl; 30 | 31 | _level++; 32 | traverse(node); 33 | _level--; 34 | } 35 | 36 | void InfoVisitor::apply(osg::Geode& geode) 37 | { 38 | std::cout << space() << geode.libraryName() << "::" 39 | << geode.className() << std::endl; 40 | 41 | _level++; 42 | for (unsigned int i = 0; i < geode.getNumDrawables(); i++) 43 | { 44 | osg::Drawable* drawable = geode.getDrawable(i); 45 | std::cout << space() << drawable->libraryName() << "::" 46 | << drawable->className() << std::endl; 47 | } 48 | 49 | traverse(geode); 50 | _level--; 51 | } 52 | 53 | int main(int argc, char** argv) 54 | { 55 | osg::ref_ptr root = osgDB::readNodeFile("cessnafire.osg"); 56 | InfoVisitor infoVisitor; 57 | root->accept(infoVisitor); 58 | osgViewer::Viewer viewer; 59 | viewer.setUpViewInWindow(50, 50, 800, 600); 60 | viewer.setSceneData(root.get()); 61 | return viewer.run(); 62 | } 63 | -------------------------------------------------------------------------------- /05_LodNode/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName LodNode) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /05_LodNode/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char** argv) 8 | { 9 | osg::ref_ptr model3 = osgDB::readNodeFile("cessna.osg"); 10 | osg::ref_ptr model2 = dynamic_cast(model3->clone(osg::CopyOp::DEEP_COPY_ALL)); 11 | osg::ref_ptr model1 = dynamic_cast(model3->clone(osg::CopyOp::DEEP_COPY_ALL)); 12 | 13 | osgUtil::Simplifier simplifier; 14 | simplifier.setSampleRatio(0.5); 15 | model2->accept(simplifier); 16 | simplifier.setSampleRatio(0.1); 17 | model1->accept(simplifier); 18 | 19 | osg::ref_ptr root = new osg::LOD; 20 | root->addChild(model1, 200.0f, FLT_MAX); 21 | root->addChild(model2, 50.0f, 200.0); 22 | root->addChild(model3, 0.0f, 50.0); 23 | 24 | osgViewer::Viewer viewer; 25 | viewer.setUpViewInWindow(50, 50, 800, 600); 26 | viewer.setSceneData(root.get()); 27 | return viewer.run(); 28 | } 29 | -------------------------------------------------------------------------------- /05_ProxyNode/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName ProxyNode) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /05_ProxyNode/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr root = new osg::ProxyNode; 9 | root->setFileName(0, "cow.osg"); 10 | osgViewer::Viewer viewer; 11 | viewer.setUpViewInWindow(50, 50, 800, 600); 12 | viewer.setSceneData(root.get()); 13 | return viewer.run(); 14 | } 15 | -------------------------------------------------------------------------------- /05_SwitchAnimate/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName SwitchAnimate) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /05_SwitchAnimate/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | class AnimatingSwitch : public osg::Switch 7 | { 8 | public: 9 | AnimatingSwitch() : osg::Switch(), _count(0) {} 10 | AnimatingSwitch(const AnimatingSwitch& copy, const osg::CopyOp& copyop) : 11 | osg::Switch(copy, copyop), _count(copy._count) {} 12 | 13 | META_Node(osg, AnimatingSwitch); 14 | 15 | virtual void traverse(osg::NodeVisitor& nv); 16 | 17 | protected: 18 | unsigned int _count; 19 | }; 20 | 21 | void AnimatingSwitch::traverse(osg::NodeVisitor& nv) 22 | { 23 | if (!((++_count) % 60)) 24 | { 25 | setValue(0, !getValue(0)); 26 | setValue(1, !getValue(1)); 27 | } 28 | 29 | osg::Switch::traverse(nv); 30 | } 31 | 32 | int main(int argc, char** argv) 33 | { 34 | osg::ref_ptr model1 = osgDB::readNodeFile("cessna.osg"); 35 | osg::ref_ptr model2 = osgDB::readNodeFile("cessnafire.osg"); 36 | osg::ref_ptr root = new AnimatingSwitch; 37 | root->addChild(model1.get(), true); 38 | root->addChild(model2.get(), false); 39 | osgViewer::Viewer viewer; 40 | viewer.setUpViewInWindow(50, 50, 800, 600); 41 | viewer.setSceneData(root.get()); 42 | return viewer.run(); 43 | } 44 | -------------------------------------------------------------------------------- /05_SwitchNode/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName SwitchNode) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /05_SwitchNode/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr model1 = osgDB::readNodeFile("cessna.osg"); 9 | osg::ref_ptr model2 = osgDB::readNodeFile("cessnafire.osg"); 10 | osg::ref_ptr root = new osg::Switch; 11 | root->addChild(model1, false); 12 | root->addChild(model2, true); 13 | osgViewer::Viewer viewer; 14 | viewer.setUpViewInWindow(50, 50, 800, 600); 15 | viewer.setSceneData(root.get()); 16 | return viewer.run(); 17 | } 18 | -------------------------------------------------------------------------------- /05_TranslateNode/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName TranslateNode) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /05_TranslateNode/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr model = osgDB::readNodeFile("cessna.osg"); 9 | osg::ref_ptr transformation1 = new osg::MatrixTransform; 10 | transformation1->setMatrix(osg::Matrix::translate(-25.0f, 0.0f, 0.0f)); 11 | transformation1->addChild(model.get()); 12 | osg::ref_ptr transformation2 = new osg::MatrixTransform; 13 | transformation2->setMatrix(osg::Matrix::translate(25.0f, 0.0f, 0.0f)); 14 | transformation2->addChild(model.get()); 15 | 16 | osg::ref_ptr root = new osg::Group; 17 | root->addChild(transformation1.get()); 18 | root->addChild(transformation2.get()); 19 | 20 | osgViewer::Viewer viewer; 21 | viewer.setUpViewInWindow(50, 50, 800, 600); 22 | viewer.setSceneData(root.get()); 23 | return viewer.run(); 24 | } 25 | -------------------------------------------------------------------------------- /06_BezierCurve/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName BezierCurve) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_BezierCurve/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | static const char* vertSource = { 8 | "#version 120\n" 9 | "#extension GL_EXT_geometry_shader4 : enable\n" 10 | "void main()\n" 11 | "{ gl_Position = ftransform(); }\n" 12 | }; 13 | 14 | static const char* geomSource = { 15 | "#version 120\n" 16 | "#extension GL_EXT_geometry_shader4 : enable\n" 17 | "uniform int segments;\n" 18 | "void main(void)\n" 19 | "{\n" 20 | " float delta = 1.0 / float(segments);\n" 21 | " vec4 v;\n" 22 | " for ( int i=0; i<=segments; ++i )\n" 23 | " {\n" 24 | " float t = delta * float(i);\n" 25 | " float t2 = t * t;\n" 26 | " float one_minus_t = 1.0 - t;\n" 27 | " float one_minus_t2 = one_minus_t * one_minus_t;\n" 28 | " v = gl_PositionIn[0] * one_minus_t2 * one_minus_t + \n" 29 | " gl_PositionIn[1] * 3.0 * t * one_minus_t2 +\n" 30 | " gl_PositionIn[2] * 3.0 * t2 * one_minus_t +\n" 31 | " gl_PositionIn[3] * t2 * t;\n" 32 | " gl_Position = v;\n" 33 | " EmitVertex();\n" 34 | " }\n" 35 | " EndPrimitive();\n" 36 | "}\n" 37 | }; 38 | 39 | int main(int argc, char** argv) 40 | { 41 | osg::ref_ptr vertices = new osg::Vec3Array; 42 | vertices->push_back(osg::Vec3(0.0f, 0.0f, 0.0f)); 43 | vertices->push_back(osg::Vec3(1.0f, 1.0f, 1.0f)); 44 | vertices->push_back(osg::Vec3(2.0f, 1.0f, -1.0f)); 45 | vertices->push_back(osg::Vec3(3.0f, 0.0f, 0.0f)); 46 | osg::ref_ptr controlPoints = new osg::Geometry; 47 | controlPoints->setVertexArray(vertices.get()); 48 | controlPoints->addPrimitiveSet( 49 | new osg::DrawArrays(GL_LINES_ADJACENCY_EXT, 0, 4)); 50 | osg::ref_ptr geode = new osg::Geode; 51 | geode->addDrawable(controlPoints.get()); 52 | 53 | int segments = 10; 54 | osg::ref_ptr program = new osg::Program; 55 | program->addShader( 56 | new osg::Shader(osg::Shader::VERTEX, vertSource)); 57 | program->addShader( 58 | new osg::Shader(osg::Shader::GEOMETRY, geomSource)); 59 | program->setParameter(GL_GEOMETRY_VERTICES_OUT_EXT, segments + 1); 60 | program->setParameter(GL_GEOMETRY_INPUT_TYPE_EXT, 61 | GL_LINES_ADJACENCY_EXT); 62 | program->setParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT, 63 | GL_LINE_STRIP); 64 | 65 | osg::ref_ptr lineWidth = new osg::LineWidth; 66 | lineWidth->setWidth(2.0f); 67 | 68 | osg::StateSet* stateset = geode->getOrCreateStateSet(); 69 | stateset->setAttributeAndModes(program.get()); 70 | stateset->setAttribute(lineWidth.get()); 71 | stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF); 72 | stateset->addUniform(new osg::Uniform("segments", segments)); 73 | 74 | osgViewer::Viewer viewer; 75 | viewer.setUpViewInWindow(50, 50, 800, 600); 76 | viewer.setSceneData(geode.get()); 77 | return viewer.run(); 78 | } 79 | -------------------------------------------------------------------------------- /06_CartoonCow/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName CartoonCow) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_CartoonCow/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | static const char* vertSource = { 7 | "varying vec3 normal;\n" 8 | "void main()\n" 9 | "{\n" 10 | " normal = normalize(gl_NormalMatrix * gl_Normal);\n" 11 | " gl_Position = ftransform();\n" 12 | "}\n" 13 | }; 14 | 15 | static const char* fragSource = { 16 | "uniform vec4 color1;\n" 17 | "uniform vec4 color2;\n" 18 | "uniform vec4 color3;\n" 19 | "uniform vec4 color4;\n" 20 | "varying vec3 normal;\n" 21 | "void main()\n" 22 | "{\n" 23 | " float intensity = dot(vec3(gl_LightSource[0].position), normal); \n" 24 | " if (intensity > 0.95) gl_FragColor = color1;\n" 25 | " else if (intensity > 0.5) gl_FragColor = color2;\n" 26 | " else if (intensity > 0.25) gl_FragColor = color3;\n" 27 | " else gl_FragColor = color4;\n" 28 | "}\n" 29 | }; 30 | 31 | int main(int argc, char** argv) 32 | { 33 | osg::ref_ptr vertShader = 34 | new osg::Shader(osg::Shader::VERTEX, vertSource); 35 | osg::ref_ptr fragShader = 36 | new osg::Shader(osg::Shader::FRAGMENT, fragSource); 37 | osg::ref_ptr program = new osg::Program; 38 | program->addShader(vertShader.get()); 39 | program->addShader(fragShader.get()); 40 | 41 | osg::ref_ptr model = osgDB::readNodeFile("cow.osg"); 42 | osg::StateSet* stateset = model->getOrCreateStateSet(); 43 | stateset->setAttributeAndModes(program.get()); 44 | stateset->addUniform( 45 | new osg::Uniform("color1", osg::Vec4( 46 | 1.0f, 0.5f, 0.5f, 1.0f))); 47 | stateset->addUniform( 48 | new osg::Uniform("color2", osg::Vec4( 49 | 0.5f, 0.2f, 0.2f, 1.0f))); 50 | stateset->addUniform( 51 | new osg::Uniform("color3", osg::Vec4( 52 | 0.2f, 0.1f, 0.1f, 1.0f))); 53 | stateset->addUniform( 54 | new osg::Uniform("color4", osg::Vec4( 55 | 0.1f, 0.05f, 0.05f, 1.0f))); 56 | 57 | osgViewer::Viewer viewer; 58 | viewer.setUpViewInWindow(50, 50, 800, 600); 59 | viewer.setSceneData(model.get()); 60 | return viewer.run(); 61 | } 62 | -------------------------------------------------------------------------------- /06_Fog/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Fog) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_Fog/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr fog = new osg::Fog; 9 | fog->setMode(osg::Fog::LINEAR); 10 | fog->setStart(500.0f); 11 | fog->setEnd(2500.0f); 12 | fog->setColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); 13 | osg::ref_ptr model = osgDB::readNodeFile("lz.osg"); 14 | model->getOrCreateStateSet()->setAttributeAndModes(fog.get()); 15 | osgViewer::Viewer viewer; 16 | viewer.setUpViewInWindow(50, 50, 800, 600); 17 | viewer.setSceneData(model.get()); 18 | return viewer.run(); 19 | } 20 | -------------------------------------------------------------------------------- /06_Lighting/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Lighting) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_Lighting/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | osg::Node* createLightSource(unsigned int num, 8 | const osg::Vec3& trans, 9 | const osg::Vec4& color) 10 | { 11 | osg::ref_ptr light = new osg::Light; 12 | light->setLightNum(num); 13 | light->setDiffuse(color); 14 | light->setPosition(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); 15 | 16 | osg::ref_ptr lightSource = new 17 | osg::LightSource; 18 | lightSource->setLight(light); 19 | osg::ref_ptr sourceTrans = 20 | new osg::MatrixTransform; 21 | sourceTrans->setMatrix(osg::Matrix::translate(trans)); 22 | sourceTrans->addChild(lightSource.get()); 23 | return sourceTrans.release(); 24 | } 25 | 26 | int main(int argc, char** argv) 27 | { 28 | osg::ref_ptr model = osgDB::readNodeFile("cessna.osg"); 29 | osg::ref_ptr root = new osg::Group; 30 | root->addChild(model.get()); 31 | osg::Node* light0 = createLightSource( 32 | 0, osg::Vec3(-20.0f, 0.0f, 0.0f), osg::Vec4( 33 | 1.0f, 1.0f, 0.0f, 1.0f)); 34 | osg::Node* light1 = createLightSource( 35 | 1, osg::Vec3(0.0f, -20.0f, 0.0f), osg::Vec4(0.0f, 1.0f, 1.0f, 1.0f) 36 | ); 37 | root->getOrCreateStateSet()->setMode(GL_LIGHT0, 38 | osg::StateAttribute::ON); 39 | root->getOrCreateStateSet()->setMode(GL_LIGHT1, 40 | osg::StateAttribute::ON); 41 | root->addChild(light0); 42 | root->addChild(light1); 43 | 44 | osgViewer::Viewer viewer; 45 | viewer.setUpViewInWindow(50, 50, 800, 600); 46 | viewer.setSceneData(root.get()); 47 | return viewer.run(); 48 | } 49 | -------------------------------------------------------------------------------- /06_PolygonMode/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName EmptyExample) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_PolygonMode/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char** argv) 8 | { 9 | osg::ref_ptr model = osgDB::readNodeFile("cessna.osg"); 10 | osg::ref_ptr transform1 = new osg::MatrixTransform; 11 | transform1->setMatrix(osg::Matrix::translate(osg::Vec3(-25.0f, 0.0f, 0.0f))); 12 | osg::ref_ptr transform2 = new osg::MatrixTransform; 13 | transform2->setMatrix(osg::Matrix::translate(osg::Vec3(25.0f, 0.0f, 0.0f))); 14 | transform1->addChild(model); 15 | transform2->addChild(model); 16 | osg::ref_ptr pm = new osg::PolygonMode; 17 | pm->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE); 18 | transform1->getOrCreateStateSet()->setAttribute(pm.get()); 19 | 20 | osg::ref_ptr root = new osg::Group; 21 | root->addChild(transform1); 22 | root->addChild(transform2); 23 | 24 | osgViewer::Viewer viewer; 25 | viewer.setUpViewInWindow(50, 50, 800, 600); 26 | viewer.setSceneData(root.get()); 27 | return viewer.run(); 28 | } 29 | -------------------------------------------------------------------------------- /06_StateSetInherit/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName StateSetInherit) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_StateSetInherit/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char** argv) 8 | { 9 | osg::ref_ptr model = osgDB::readNodeFile("glider.osg"); 10 | osg::ref_ptr transform1 = new osg::MatrixTransform; 11 | transform1->setMatrix(osg::Matrix::translate(osg::Vec3(-0.5f, 0.0f, 0.0f))); 12 | osg::ref_ptr transform2 = new osg::MatrixTransform; 13 | transform2->setMatrix(osg::Matrix::translate(osg::Vec3(0.5f, 0.0f, 0.0f))); 14 | transform1->addChild(model); 15 | transform2->addChild(model); 16 | // osg::ref_ptr pm = new osg::PolygonMode; 17 | // pm->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE); 18 | // transform1->getOrCreateStateSet()->setAttribute(pm.get()); 19 | 20 | osg::ref_ptr root = new osg::Group; 21 | root->addChild(transform1); 22 | root->addChild(transform2); 23 | 24 | transform1->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); 25 | transform2->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF | osg::StateAttribute::PROTECTED); 26 | root->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); 27 | 28 | osgViewer::Viewer viewer; 29 | viewer.setUpViewInWindow(50, 50, 800, 600); 30 | viewer.setSceneData(root.get()); 31 | return viewer.run(); 32 | } 33 | -------------------------------------------------------------------------------- /06_Texture2D/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Texture2D) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_Texture2D/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr vertices = new osg::Vec3Array; 9 | vertices->push_back(osg::Vec3(-0.5f, 0.0f, -0.5f)); 10 | vertices->push_back(osg::Vec3(0.5f, 0.0f, -0.5f)); 11 | vertices->push_back(osg::Vec3(0.5f, 0.0f, 0.5f)); 12 | vertices->push_back(osg::Vec3(-0.5f, 0.0f, 0.5f)); 13 | osg::ref_ptr normals = new osg::Vec3Array; 14 | normals->push_back(osg::Vec3(0.0f, -1.0f, 0.0f)); 15 | osg::ref_ptr texcoords = new osg::Vec2Array; 16 | texcoords->push_back(osg::Vec2(0.0f, 0.0f)); 17 | texcoords->push_back(osg::Vec2(0.0f, 1.0f)); 18 | texcoords->push_back(osg::Vec2(1.0f, 1.0f)); 19 | texcoords->push_back(osg::Vec2(1.0f, 0.0f)); 20 | osg::ref_ptr quad = new osg::Geometry; 21 | quad->setVertexArray(vertices.get()); 22 | quad->setNormalArray(normals.get()); 23 | quad->setNormalBinding(osg::Geometry::BIND_OVERALL); 24 | quad->setTexCoordArray(0, texcoords.get()); 25 | quad->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4)); 26 | 27 | osg::ref_ptr texture = new osg::Texture2D; 28 | osg::ref_ptr image = 29 | osgDB::readImageFile("Images/smoke4.bmp"); 30 | texture->setImage(image.get()); 31 | 32 | osg::ref_ptr root = new osg::Geode; 33 | root->addDrawable(quad.get()); 34 | root->getOrCreateStateSet()->setTextureAttributeAndModes( 35 | 0, texture.get()); 36 | 37 | osgViewer::Viewer viewer; 38 | viewer.setUpViewInWindow(50, 50, 800, 600); 39 | viewer.setSceneData(root.get()); 40 | return viewer.run(); 41 | } 42 | -------------------------------------------------------------------------------- /06_Translucent/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Translucent) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /06_Translucent/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/06_Translucent/main.cpp -------------------------------------------------------------------------------- /07_FrameLoop/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName FrameLoop) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /07_FrameLoop/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr model = osgDB::readNodeFile("lz.osg"); 9 | osgViewer::Viewer viewer; 10 | viewer.setCameraManipulator(new osgGA::TrackballManipulator); 11 | viewer.setUpViewInWindow(50, 50, 800, 600); 12 | viewer.setSceneData(model.get()); 13 | while (!viewer.done()) 14 | { 15 | viewer.frame(); 16 | std::cout << "Frame number: " << 17 | viewer.getFrameStamp()->getFrameNumber() << std::endl; 18 | } 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /07_HUD/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName HUD) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | 11 | macro(config_project PROJNAME LIBNAME) 12 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 13 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 14 | endmacro() 15 | 16 | add_executable(${ProjName} main.cpp) 17 | config_project(${ProjName} OPENTHREADS) 18 | config_project(${ProjName} OSG) 19 | config_project(${ProjName} OSGDB) 20 | config_project(${ProjName} OSGUTIL) 21 | config_project(${ProjName} OSGVIEWER) 22 | -------------------------------------------------------------------------------- /07_HUD/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ref_ptr model = osgDB::readNodeFile("lz.osg"); 9 | osg::ref_ptr hud_model = osgDB::readNodeFile("glider.osg"); 10 | osg::ref_ptr camera = new osg::Camera; 11 | camera->setClearMask(GL_DEPTH_BUFFER_BIT); 12 | camera->setRenderOrder(osg::Camera::POST_RENDER); 13 | camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); 14 | camera->setViewMatrixAsLookAt( 15 | osg::Vec3(0.0f, -5.0f, 5.0f), osg::Vec3(), 16 | osg::Vec3(0.0f, 1.0f, 1.0f) 17 | ); 18 | camera->addChild(hud_model.get()); 19 | osg::ref_ptr root = new osg::Group; 20 | root->addChild(model.get()); 21 | root->addChild( camera.get() ); 22 | 23 | osgViewer::Viewer viewer; 24 | viewer.setUpViewInWindow(50, 50, 800, 600); 25 | viewer.setSceneData(root.get()); 26 | return viewer.run(); 27 | } 28 | -------------------------------------------------------------------------------- /07_MultiSampling/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName MultiSampling) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /07_MultiSampling/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | int main(int argc, char** argv) 6 | { 7 | osg::DisplaySettings::instance()->setNumMultiSamples(4); 8 | osg::ref_ptr root = osgDB::readNodeFile("cessna.osg"); 9 | osgViewer::Viewer viewer; 10 | viewer.setUpViewInWindow(50, 50, 800, 600); 11 | viewer.setSceneData(root.get()); 12 | return viewer.run(); 13 | } 14 | -------------------------------------------------------------------------------- /07_MultipleScene/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName MultipleScene) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /07_MultipleScene/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | osgViewer::View* createView(int x, int y, int w, int h, 7 | osg::Node* scene) 8 | { 9 | osg::ref_ptr view = new osgViewer::View; 10 | view->setSceneData(scene); 11 | view->setUpViewInWindow(x, y, w, h); 12 | return view.release(); 13 | } 14 | 15 | int main(int argc, char** argv) 16 | { 17 | osg::ref_ptr model1 = osgDB::readNodeFile("cessna.osg"); 18 | osg::ref_ptr model2 = osgDB::readNodeFile("cow.osg"); 19 | osg::ref_ptr model3 = osgDB::readNodeFile("glider.osg"); 20 | osgViewer::View* view1 = createView(50, 50, 320, 240, model1); 21 | osgViewer::View* view2 = createView(370, 50, 320, 240, model2); 22 | osgViewer::View* view3 = createView(185, 310, 320, 240, model3); 23 | osgViewer::CompositeViewer viewer; 24 | viewer.addView(view1); 25 | viewer.addView(view2); 26 | viewer.addView(view3); 27 | return viewer.run(); 28 | } 29 | -------------------------------------------------------------------------------- /07_RTT/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName RTT) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /07_RTT/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | class FindTextureVisitor : public osg::NodeVisitor 9 | { 10 | public: 11 | FindTextureVisitor(osg::Texture* tex) : _texture(tex) 12 | { 13 | setTraversalMode( 14 | osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); 15 | } 16 | 17 | virtual void apply(osg::Node& node); 18 | virtual void apply(osg::Geode& geode); 19 | void replaceTexture(osg::StateSet* ss) 20 | { 21 | if (ss) 22 | { 23 | osg::Texture* oldTexture = dynamic_cast( 24 | ss->getTextureAttribute(0, osg::StateAttribute::TEXTURE) 25 | ); 26 | if (oldTexture) ss->setTextureAttribute( 27 | 0, _texture.get()); 28 | } 29 | } 30 | 31 | protected: 32 | osg::ref_ptr _texture; 33 | }; 34 | 35 | void FindTextureVisitor::apply(osg::Node& node) 36 | { 37 | replaceTexture(node.getStateSet()); 38 | traverse(node); 39 | } 40 | void FindTextureVisitor::apply(osg::Geode& geode) 41 | { 42 | replaceTexture(geode.getStateSet()); 43 | for (unsigned int i = 0; i < geode.getNumDrawables(); ++i) 44 | { 45 | replaceTexture(geode.getDrawable(i)->getStateSet()); 46 | } 47 | traverse(geode); 48 | } 49 | 50 | int main(int argc, char** argv) 51 | { 52 | osg::ref_ptr model = osgDB::readNodeFile("lz.osg"); 53 | osg::ref_ptr sub_model = osgDB::readNodeFile("glider.osg"); 54 | 55 | int tex_width = 1024, tex_height = 1024; 56 | osg::ref_ptr texture = new osg::Texture2D; 57 | texture->setTextureSize(tex_width, tex_height); 58 | texture->setInternalFormat(GL_RGBA); 59 | texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR); 60 | texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR); 61 | 62 | FindTextureVisitor ftv(texture.get()); 63 | if (model.valid()) model->accept(ftv); 64 | 65 | osg::ref_ptr camera = new osg::Camera; 66 | camera->setViewport(0, 0, tex_width, tex_height); 67 | camera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f)); 68 | camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 69 | camera->setRenderOrder(osg::Camera::PRE_RENDER); 70 | camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT); 71 | camera->attach(osg::Camera::COLOR_BUFFER, texture.get()); 72 | 73 | camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); 74 | camera->addChild(sub_model.get()); 75 | 76 | osg::ref_ptr root = new osg::Group; 77 | root->addChild(model.get()); 78 | root->addChild(camera.get()); 79 | 80 | osgViewer::Viewer viewer; 81 | viewer.setUpViewInWindow(50, 50, 800, 600); 82 | viewer.setSceneData(root.get()); 83 | viewer.setCameraManipulator(new osgGA::TrackballManipulator); 84 | float delta = 0.1f, bias = 0.0f; 85 | osg::Vec3 eye(0.0f, -5.0f, 5.0f); 86 | while (!viewer.done()) 87 | { 88 | if (bias < -1.0f) delta = 0.1f; 89 | else if (bias > 1.0f) delta = -0.1f; 90 | bias += delta; 91 | camera->setViewMatrixAsLookAt(eye, osg::Vec3(), 92 | osg::Vec3(bias, 1.0f, 1.0f)); 93 | viewer.frame(); 94 | } 95 | return 0; 96 | } 97 | -------------------------------------------------------------------------------- /08_AnimateCharacter/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName AnimateCharacter) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /08_AnimateCharacter/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(int argc, char** argv) 7 | { 8 | osg::ArgumentParser arguments(&argc, argv); 9 | bool listAll = false; 10 | std::string animationName; 11 | arguments.read("--animation", animationName); 12 | animationName = "Idle_Main"; 13 | if (arguments.read("--listall")) listAll = true; 14 | listAll = true; 15 | 16 | 17 | osg::ref_ptr model = osgDB::readNodeFile("bignathan.osg"); 18 | if (!model) return 1; 19 | 20 | osgAnimation::BasicAnimationManager* manager = 21 | dynamic_cast 22 | (model->getUpdateCallback()); 23 | if (!manager) return 1; 24 | 25 | const osgAnimation::AnimationList& animations = 26 | manager->getAnimationList(); 27 | if (listAll) std::cout << "**** Animations ****" << std::endl; 28 | for (unsigned int i = 0; i < animations.size(); ++i) 29 | { 30 | const std::string& name = animations[i]->getName(); 31 | if (name == animationName) 32 | manager->playAnimation(animations[i].get()); 33 | if (listAll) std::cout << name << std::endl; 34 | } 35 | if (listAll) 36 | { 37 | std::cout << "********************" << std::endl; 38 | //return 0; 39 | } 40 | 41 | osgViewer::Viewer viewer; 42 | viewer.setUpViewInWindow(50, 50, 800, 600); 43 | viewer.setSceneData(model.get()); 44 | return viewer.run(); 45 | } 46 | -------------------------------------------------------------------------------- /08_AnimationChannel/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName AnimationChannel) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /08_AnimationChannel/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include fo 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | void createAnimationPath(float radius, float time, 11 | osgAnimation::Vec3KeyframeContainer* container1, 12 | osgAnimation::QuatKeyframeContainer* container2) 13 | { 14 | unsigned int numSamples = 32; 15 | float delta_yaw = 2.0f * osg::PI / ((float)numSamples - 1.0f); 16 | float delta_time = time / (float)numSamples; 17 | for (unsigned int i = 0; i < numSamples; i++) 18 | { 19 | float yaw = delta_time * (float)i; 20 | osg::Vec3 pos(sinf(yaw)*radius, cosf(yaw)*radius, 0.0f); 21 | osg::Quat rot(-yaw, osg::Z_AXIS); 22 | 23 | container1->push_back(osgAnimation::Vec3Keyframe(delta_time*(float)i, pos)); 24 | container2->push_back(osgAnimation::QuatKeyframe(delta_time*(float)i, rot)); 25 | } 26 | } 27 | 28 | int main(int argc, char** argv) 29 | { 30 | osg::ref_ptr ch1 = new osgAnimation::Vec3LinearChannel; 31 | ch1->setName("position"); 32 | ch1->setTargetName("PathCallback"); 33 | osg::ref_ptr ch2 = new osgAnimation::QuatSphericalLinearChannel; 34 | ch2->setName("quat"); 35 | ch2->setTargetName("PathCallback"); 36 | createAnimationPath(50.0f, 6.0f, 37 | ch1->getOrCreateSampler()->getOrCreateKeyframeContainer(), 38 | ch2->getOrCreateSampler()->getOrCreateKeyframeContainer()); 39 | 40 | osg::ref_ptr animation = new osgAnimation::Animation; 41 | animation->setPlayMode(osgAnimation::Animation::LOOP); 42 | animation->addChannel(ch1.get()); 43 | animation->addChannel(ch2.get()); 44 | 45 | osg::ref_ptr updater = new osgAnimation::UpdateMatrixTransform("PathCallback"); 46 | updater->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("position")); 47 | updater->getStackedTransforms().push_back(new osgAnimation::StackedQuaternionElement("quat")); 48 | 49 | osg::ref_ptr animRoot = new osg::MatrixTransform; 50 | animRoot->addChild(osgDB::readNodeFile("cessna.osg.0,0,90.rot")); 51 | animRoot->setDataVariance(osg::Object::DYNAMIC); 52 | animRoot->setUpdateCallback(updater.get()); 53 | 54 | osg::ref_ptr manager = 55 | new osgAnimation::BasicAnimationManager; 56 | manager->registerAnimation(animation.get()); 57 | 58 | osg::ref_ptr root = new osg::Group; 59 | root->addChild(animRoot.get()); 60 | root->setUpdateCallback(manager.get()); 61 | 62 | manager->playAnimation(animation.get()); 63 | 64 | osgViewer::Viewer viewer; 65 | viewer.setUpViewInWindow(50, 50, 800, 600); 66 | viewer.setSceneData(root.get()); 67 | return viewer.run(); 68 | } 69 | -------------------------------------------------------------------------------- /08_AnimationPath/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName AnimationPath) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /08_AnimationPath/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | osg::AnimationPath* createAnimationPath(float radius, float time) 8 | { 9 | osg::ref_ptr path = new 10 | osg::AnimationPath; 11 | path->setLoopMode(osg::AnimationPath::LOOP); 12 | 13 | unsigned int numSamples = 32; 14 | float delta_yaw = 2.0f * osg::PI / ((float)numSamples - 1.0f); 15 | float delta_time = time / (float)numSamples; 16 | for (unsigned int i = 0; i < numSamples; ++i) 17 | { 18 | float yaw = delta_yaw * (float)i; 19 | osg::Vec3 pos(sinf(yaw)*radius, cosf(yaw)*radius, 0.0f); 20 | osg::Quat rot(-yaw, osg::Z_AXIS); 21 | path->insert(delta_time * (float)i, 22 | osg::AnimationPath::ControlPoint(pos, rot) 23 | ); 24 | } 25 | return path.release(); 26 | } 27 | 28 | int main(int argc, char** argv) 29 | { 30 | osg::ref_ptr model = 31 | osgDB::readNodeFile("cessna.osg.0,0,90.rot"); 32 | osg::ref_ptr root = new 33 | osg::MatrixTransform; 34 | root->addChild(model.get()); 35 | 36 | osg::ref_ptr apcb = new 37 | osg::AnimationPathCallback; 38 | apcb->setAnimationPath(createAnimationPath(50.0f, 6.0f)); 39 | root->setUpdateCallback(apcb.get()); 40 | 41 | osgViewer::Viewer viewer; 42 | viewer.setUpViewInWindow(50, 50, 800, 600); 43 | viewer.setSceneData(root.get()); 44 | return viewer.run(); 45 | } 46 | -------------------------------------------------------------------------------- /08_FadingIn/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName FadingIn) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /08_FadingIn/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | class AlphaFadingCallback : public osg::StateAttributeCallback 11 | { 12 | public: 13 | AlphaFadingCallback() 14 | { 15 | _motion = new osgAnimation::InOutCubicMotion(0.0f, 1.0f); 16 | } 17 | 18 | virtual void operator()(osg::StateAttribute*, osg::NodeVisitor*); 19 | protected: 20 | osg::ref_ptr _motion; 21 | }; 22 | 23 | void AlphaFadingCallback::operator()(osg::StateAttribute* sa, 24 | osg::NodeVisitor* nv) 25 | { 26 | osg::Material* material = static_cast(sa); 27 | if (material) 28 | { 29 | _motion->update(0.005); 30 | 31 | float alpha = _motion->getValue(); 32 | material->setDiffuse(osg::Material::FRONT_AND_BACK, 33 | osg::Vec4(0.0f, 1.0f, 1.0f, alpha) 34 | ); 35 | } 36 | } 37 | 38 | int main(int argc, char** argv) 39 | { 40 | osg::ref_ptr quad = osg::createTexturedQuadGeometry( 41 | osg::Vec3(-0.5f, 0.0f, -0.5f), 42 | osg::Vec3(1.0f, 0.0f, 0.0f), osg::Vec3(0.0f, 0.0f, 1.0f) 43 | ); 44 | osg::ref_ptr geode = new osg::Geode; 45 | geode->addDrawable(quad.get()); 46 | 47 | osg::ref_ptr material = new osg::Material; 48 | material->setAmbient(osg::Material::FRONT_AND_BACK, 49 | osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); 50 | material->setDiffuse(osg::Material::FRONT_AND_BACK, 51 | osg::Vec4(0.0f, 1.0f, 1.0f, 0.5f)); 52 | material->setUpdateCallback(new AlphaFadingCallback); 53 | 54 | geode->getOrCreateStateSet()->setAttributeAndModes( 55 | material.get()); 56 | geode->getOrCreateStateSet()->setAttributeAndModes( 57 | new osg::BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); 58 | geode->getOrCreateStateSet()->setRenderingHint( 59 | osg::StateSet::TRANSPARENT_BIN); 60 | 61 | osg::ref_ptr root = new osg::Group; 62 | root->addChild(geode.get()); 63 | root->addChild(osgDB::readNodeFile("glider.osg")); 64 | 65 | osgViewer::Viewer viewer; 66 | viewer.setUpViewInWindow(50, 50, 800, 600); 67 | viewer.setSceneData(root.get()); 68 | return viewer.run(); 69 | } 70 | -------------------------------------------------------------------------------- /08_Flashing/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName FlashingSpotLight) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /08_Flashing/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | osg::Image* createSpotLight(const osg::Vec4& centerColor, 10 | const osg::Vec4& bgColor, 11 | unsigned int size, float power) 12 | { 13 | osg::ref_ptr image = new osg::Image; 14 | image->allocateImage(size, size, 1, GL_RGBA, 15 | GL_UNSIGNED_BYTE); 16 | 17 | float mid = (float(size) - 1) * 0.5f; 18 | float div = 2.0f / float(size); 19 | for (unsigned int r = 0; r < size; ++r) 20 | { 21 | unsigned char* ptr = image->data(0, r); 22 | for (unsigned int c = 0; c < size; ++c) 23 | { 24 | float dx = (float(c) - mid)*div; 25 | float dy = (float(r) - mid)*div; 26 | float r = powf(1.0f - sqrtf(dx*dx + dy*dy), power); 27 | if (r < 0.0f) r = 0.0f; 28 | osg::Vec4 color = centerColor*r + bgColor*(1.0f - r); 29 | *ptr++ = (unsigned char)((color[0]) * 255.0f); 30 | *ptr++ = (unsigned char)((color[1]) * 255.0f); 31 | *ptr++ = (unsigned char)((color[2]) * 255.0f); 32 | *ptr++ = (unsigned char)((color[3]) * 255.0f); 33 | } 34 | } 35 | return image.release(); 36 | } 37 | 38 | int main(int argc, char** argv) 39 | { 40 | osg::Vec4 centerColor(1.0f, 1.0f, 0.0f, 1.0f); 41 | osg::Vec4 bgColor(0.0f, 0.0f, 0.0f, 1.0f); 42 | osg::ref_ptr sequence = new 43 | osg::ImageSequence; 44 | sequence->addImage(createSpotLight(centerColor, bgColor, 64, 45 | 3.0f)); 46 | sequence->addImage(createSpotLight(centerColor, bgColor, 64, 47 | 3.5f)); 48 | sequence->addImage(createSpotLight(centerColor, bgColor, 64, 49 | 4.0f)); 50 | sequence->addImage(createSpotLight(centerColor, bgColor, 64, 51 | 3.5f)); 52 | 53 | osg::ref_ptr texture = new osg::Texture2D; 54 | texture->setImage(sequence.get()); 55 | 56 | osg::ref_ptr geode = new osg::Geode; 57 | geode->addDrawable(osg::createTexturedQuadGeometry( 58 | osg::Vec3(), osg::Vec3(1.0, 0.0, 0.0), osg::Vec3(0.0, 0.0, 1.0)) 59 | ); 60 | geode->getOrCreateStateSet()->setTextureAttributeAndModes( 61 | 0, texture.get(), osg::StateAttribute::ON); 62 | sequence->setLength(0.5); 63 | sequence->play(); 64 | 65 | osgViewer::Viewer viewer; 66 | viewer.setUpViewInWindow(50, 50, 800, 600); 67 | viewer.setSceneData(geode.get()); 68 | return viewer.run(); 69 | } 70 | -------------------------------------------------------------------------------- /08_GeometryDynamically/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName GeometryDynamically) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /08_GeometryDynamically/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/08_GeometryDynamically/main.cpp -------------------------------------------------------------------------------- /08_SwitchUpdate/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName SwitchUpdate) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /08_SwitchUpdate/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | class SwitchingCallback : public osg::NodeCallback 7 | { 8 | public: 9 | SwitchingCallback() : _count(0) {} 10 | virtual void operator()(osg::Node* node, 11 | osg::NodeVisitor* nv); 12 | 13 | protected: 14 | unsigned int _count; 15 | }; 16 | 17 | void SwitchingCallback::operator()(osg::Node* node, 18 | osg::NodeVisitor* nv) 19 | { 20 | osg::Switch* switchNode = static_cast(node); 21 | if (!((++_count) % 60) && switchNode) 22 | { 23 | switchNode->setValue(0, !switchNode->getValue(0)); 24 | switchNode->setValue(1, !switchNode->getValue(1)); 25 | } 26 | traverse(node, nv); 27 | } 28 | 29 | int main(int argc, char** argv) 30 | { 31 | osg::ref_ptr model1 = osgDB::readNodeFile( 32 | "cessna.osg"); 33 | osg::ref_ptr model2 = osgDB::readNodeFile("cessnafire.osg"); 34 | osg::ref_ptr root = new osg::Switch; 35 | root->addChild(model1.get(), false); 36 | root->addChild(model2.get(), true); 37 | root->setUpdateCallback(new SwitchingCallback); 38 | 39 | osgViewer::Viewer viewer; 40 | viewer.setUpViewInWindow(50, 50, 800, 600); 41 | viewer.setSceneData(root.get()); 42 | return viewer.run(); 43 | } 44 | -------------------------------------------------------------------------------- /09_DrivingCessna/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName DrivingCessna) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /09_DrivingCessna/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | class ModelController : public osgGA::GUIEventHandler 8 | { 9 | public: 10 | ModelController(osg::MatrixTransform* node) : 11 | _model(node) {} 12 | 13 | virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa); 14 | 15 | private: 16 | osg::ref_ptr _model; 17 | }; 18 | 19 | bool ModelController::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) 20 | { 21 | if (!_model) 22 | return false; 23 | osg::Matrix matrix = _model->getMatrix(); 24 | switch (ea.getEventType()) 25 | { 26 | case osgGA::GUIEventAdapter::KEYDOWN: 27 | switch (ea.getKey()) 28 | { 29 | case 'a':case 'A': 30 | matrix *= osg::Matrix::rotate(-0.1f, osg::Z_AXIS); 31 | break; 32 | case 'd':case 'D': 33 | matrix *= osg::Matrix::rotate(0.1f, osg::Z_AXIS); 34 | break; 35 | case 'w':case 'W': 36 | matrix *= osg::Matrix::rotate(-0.1f, osg::X_AXIS); 37 | break; 38 | case 's':case 'S': 39 | matrix *= osg::Matrix::rotate(0.1f, osg::X_AXIS); 40 | break; 41 | default: 42 | break; 43 | } 44 | _model->setMatrix(matrix); 45 | break; 46 | default: 47 | break; 48 | } 49 | return false; 50 | } 51 | 52 | int main(int argc, char** argv) 53 | { 54 | osg::ref_ptr model = osgDB::readNodeFile("cessna.osg"); 55 | osg::ref_ptr mt = new osg::MatrixTransform; 56 | mt->addChild(model.get()); 57 | osg::ref_ptr root = new osg::Group; 58 | root->addChild(mt.get()); 59 | 60 | osg::ref_ptr mc = new ModelController(mt.get()); 61 | 62 | osgViewer::Viewer viewer; 63 | viewer.addEventHandler(mc.get()); 64 | viewer.getCamera()->setViewMatrixAsLookAt( 65 | osg::Vec3(0.0, -100.0, 0.0), osg::Vec3(), osg::Vec3(0.0, 0.0, 1.0)); 66 | viewer.getCamera()->setAllowEventFocus(false); 67 | 68 | viewer.setUpViewInWindow(50, 50, 800, 600); 69 | viewer.setSceneData(root.get()); 70 | return viewer.run(); 71 | } 72 | -------------------------------------------------------------------------------- /09_GCTraits/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName GCTraits) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /09_GCTraits/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/09_GCTraits/main.cpp -------------------------------------------------------------------------------- /09_PickingGeometry/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName PickingGeometry) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /09_PickingGeometry/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/09_PickingGeometry/main.cpp -------------------------------------------------------------------------------- /09_UserTimer/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName UserTimer) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /09_UserTimer/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | struct TimeInfo : public osg::Referenced 9 | { 10 | TimeInfo(unsigned int c) : _count(c) {} 11 | unsigned int _count; 12 | }; 13 | 14 | class TimerHandler : public osgGA::GUIEventHandler 15 | { 16 | public: 17 | TimerHandler(osg::Switch* sw) : _switch(sw), _count(0) {} 18 | virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter &aa); 19 | 20 | private: 21 | osg::ref_ptr _switch; 22 | unsigned int _count; 23 | }; 24 | 25 | bool TimerHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter &aa) 26 | { 27 | switch (ea.getEventType()) 28 | { 29 | case osgGA::GUIEventAdapter::FRAME: 30 | if (_count % 100 == 0) 31 | { 32 | osgViewer::Viewer* viewer = dynamic_cast(&aa); 33 | if (viewer) 34 | { 35 | viewer->getEventQueue()->userEvent(new TimeInfo(_count)); 36 | } 37 | } 38 | _count++; 39 | break; 40 | case osgGA::GUIEventAdapter::USER: 41 | if (_switch.valid()) 42 | { 43 | const TimeInfo* ti = dynamic_cast(ea.getUserData() 44 | ); 45 | std::cout << "Timer event at: " << ti->_count << std::endl; 46 | 47 | _switch->setValue(0, !_switch->getValue(0)); 48 | _switch->setValue(1, !_switch->getValue(1)); 49 | } 50 | break; 51 | default: 52 | break; 53 | } 54 | return false; 55 | } 56 | 57 | int main(int argc, char** argv) 58 | { 59 | osg::ref_ptr model1 = osgDB::readNodeFile("cessna.osg"); 60 | osg::ref_ptr model2 = osgDB::readNodeFile("cessnafire.osg"); 61 | osg::ref_ptr root = new osg::Switch; 62 | root->addChild(model1.get(), false); 63 | root->addChild(model2.get(), true); 64 | 65 | osgViewer::Viewer viewer; 66 | viewer.setUpViewInWindow(50, 50, 800, 600); 67 | viewer.setSceneData(root.get()); 68 | viewer.addEventHandler(new TimerHandler(root.get())); 69 | return viewer.run(); 70 | } 71 | -------------------------------------------------------------------------------- /09_Win32Handler/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Win32Handler) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /09_Win32Handler/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/09_Win32Handler/main.cpp -------------------------------------------------------------------------------- /10_CustomFormat/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName CustomFormat) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_library(${ProjName} SHARED main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /10_CustomFormat/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | class ReaderWriterTRI : public osgDB::ReaderWriter 9 | { 10 | public: 11 | ReaderWriterTRI(); 12 | 13 | virtual ReadResult readNode( 14 | const std::string&, const osgDB::ReaderWriter::Options*) const; 15 | virtual ReadResult readNode( 16 | std::istream&, const osgDB::ReaderWriter::Options*) const; 17 | }; 18 | 19 | ReaderWriterTRI::ReaderWriterTRI() 20 | { 21 | supportsExtension("tri", "Triangle strip points"); 22 | } 23 | 24 | ReaderWriterTRI::ReadResult ReaderWriterTRI::readNode( 25 | const std::string& file, const osgDB::ReaderWriter::Options* options) const 26 | { 27 | std::string ext = osgDB::getLowerCaseFileExtension(file); 28 | if (!acceptsExtension(ext)) return 29 | ReadResult::FILE_NOT_HANDLED; 30 | std::string fileName = osgDB::findDataFile(file, options); 31 | if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; 32 | 33 | std::ifstream stream(fileName.c_str(), std::ios::in); 34 | if (!stream) return ReadResult::ERROR_IN_READING_FILE; 35 | return readNode(stream, options); 36 | } 37 | 38 | ReaderWriterTRI::ReadResult ReaderWriterTRI::readNode( 39 | std::istream& stream, const osgDB::ReaderWriter::Options*) const 40 | { 41 | unsigned int index = 0, numPoints = 0; 42 | stream >> numPoints; 43 | 44 | osg::ref_ptr va = new osg::Vec3Array; 45 | while (index < numPoints && !stream.eof() && 46 | !(stream.rdstate()&std::istream::failbit)) 47 | { 48 | osg::Vec3 point; 49 | stream >> point.x() >> point.y() >> point.z(); 50 | va->push_back(point); 51 | index++; 52 | } 53 | 54 | osg::ref_ptr geom = new osg::Geometry; 55 | geom->setVertexArray(va.get()); 56 | geom->addPrimitiveSet( 57 | new osg::DrawArrays(GL_TRIANGLE_STRIP, 0, numPoints)); 58 | 59 | osgUtil::SmoothingVisitor smoother; 60 | smoother.smooth(*geom); 61 | 62 | osg::ref_ptr geode = new osg::Geode; 63 | geode->addDrawable(geom.get()); 64 | return geode.release(); 65 | } 66 | 67 | REGISTER_OSGPLUGIN(tri, ReaderWriterTRI) -------------------------------------------------------------------------------- /11_Billboard/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Billboard) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | 12 | macro(config_project PROJNAME LIBNAME) 13 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 14 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 15 | endmacro() 16 | 17 | add_executable(${ProjName} main.cpp) 18 | config_project(${ProjName} OPENTHREADS) 19 | config_project(${ProjName} OSG) 20 | config_project(${ProjName} OSGDB) 21 | config_project(${ProjName} OSGUTIL) 22 | config_project(${ProjName} OSGVIEWER) 23 | config_project(${ProjName} OSGGA) 24 | -------------------------------------------------------------------------------- /11_Billboard/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | osg::Geometry* createQuad() 8 | { 9 | osg::ref_ptr texture = new osg::Texture2D; 10 | osg::ref_ptr image = 11 | osgDB::readImageFile("Images/osg256.png"); 12 | texture->setImage(image.get()); 13 | 14 | osg::ref_ptr quad = 15 | osg::createTexturedQuadGeometry( 16 | osg::Vec3(-0.5f, 0.0f, -0.5f), 17 | osg::Vec3(1.0f, 0.0f, 0.0f), 18 | osg::Vec3(0.0f, 0.0f, 1.0f)); 19 | osg::StateSet* ss = quad->getOrCreateStateSet(); 20 | ss->setTextureAttributeAndModes(0, texture.get()); 21 | return quad.release(); 22 | } 23 | 24 | int main(int argc, char** argv) 25 | { 26 | osg::ref_ptr geode = new osg::Billboard; 27 | geode->setMode(osg::Billboard::POINT_ROT_EYE); 28 | // geode->setMode(osg::Billboard::POINT_ROT_WORLD); 29 | 30 | osg::Geometry* quad = createQuad(); 31 | for (unsigned int i = 0; i < 10; ++i) 32 | { 33 | float id = (float)i; 34 | geode->addDrawable(quad, osg::Vec3(-2.5f + 0.2f*id, id, 0.0f)); 35 | geode->addDrawable(quad, osg::Vec3(2.5f - 0.2f*id, id, 0.0f)); 36 | } 37 | osg::StateSet* ss = geode->getOrCreateStateSet(); 38 | ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); 39 | 40 | osgViewer::Viewer viewer; 41 | viewer.setUpViewInWindow(50, 50, 800, 600); 42 | viewer.setSceneData(geode.get()); 43 | return viewer.run(); 44 | } 45 | -------------------------------------------------------------------------------- /11_Outline/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Outline) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgFX) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGFX) 26 | -------------------------------------------------------------------------------- /11_Outline/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char** argv) 8 | { 9 | osg::ref_ptr model = osgDB::readNodeFile("cessna.osg"); 10 | 11 | osg::ref_ptr outline = new osgFX::Outline; 12 | outline->setWidth(8); 13 | outline->setColor(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); 14 | outline->addChild(model.get()); 15 | 16 | osg::DisplaySettings::instance()->setMinimumNumStencilBits(1); 17 | 18 | 19 | osgViewer::Viewer viewer; 20 | viewer.getCamera()->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 21 | viewer.setUpViewInWindow(50, 50, 800, 600); 22 | viewer.setSceneData(outline.get()); 23 | return viewer.run(); 24 | } 25 | -------------------------------------------------------------------------------- /11_ParticleSystem/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName ParticleSystem) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgParticle) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGPARTICLE) 26 | -------------------------------------------------------------------------------- /11_ParticleSystem/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | osgParticle::ParticleSystem* createParticleSystem( 18 | osg::Group* parent) 19 | { 20 | osg::ref_ptr ps = 21 | new osgParticle::ParticleSystem; 22 | ps->getDefaultParticleTemplate().setShape( 23 | osgParticle::Particle::POINT); 24 | 25 | osg::ref_ptr blendFunc = new osg::BlendFunc; 26 | blendFunc->setFunction(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 27 | osg::ref_ptr texture = new osg::Texture2D; 28 | texture->setImage(osgDB::readImageFile("Images/smoke.rgb")); 29 | 30 | osg::StateSet* ss = ps->getOrCreateStateSet(); 31 | ss->setAttributeAndModes(blendFunc.get()); 32 | ss->setTextureAttributeAndModes(0, texture.get()); 33 | ss->setAttribute(new osg::Point(20.0f)); 34 | ss->setTextureAttributeAndModes(0, new osg::PointSprite); 35 | ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF); 36 | ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); 37 | 38 | osg::ref_ptr rrc = 39 | new osgParticle::RandomRateCounter; 40 | rrc->setRateRange(500, 800); 41 | 42 | osg::ref_ptr emitter = 43 | new osgParticle::ModularEmitter; 44 | emitter->setParticleSystem(ps.get()); 45 | emitter->setCounter(rrc.get()); 46 | 47 | osg::ref_ptr accel = 48 | new osgParticle::AccelOperator; 49 | accel->setToGravity(); 50 | 51 | osg::ref_ptr program = 52 | new osgParticle::ModularProgram; 53 | program->setParticleSystem(ps.get()); 54 | program->addOperator(accel.get()); 55 | 56 | osg::ref_ptr geode = new osg::Geode; 57 | geode->addDrawable(ps.get()); 58 | parent->addChild(emitter.get()); 59 | parent->addChild(program.get()); 60 | parent->addChild(geode.get()); 61 | return ps.get(); 62 | } 63 | 64 | int main(int argc, char** argv) 65 | { 66 | osg::ref_ptr mt = new osg::MatrixTransform; 67 | mt->setMatrix(osg::Matrix::translate(1.0f, 0.0f, 0.0f)); 68 | 69 | osgParticle::ParticleSystem* ps = createParticleSystem(mt.get() 70 | ); 71 | osg::ref_ptr updater = 72 | new osgParticle::ParticleSystemUpdater; 73 | updater->addParticleSystem(ps); 74 | 75 | osg::ref_ptr root = new osg::Group; 76 | root->addChild(updater.get()); 77 | root->addChild(mt.get()); 78 | root->addChild(osgDB::readNodeFile("axes.osg")); 79 | 80 | osgViewer::Viewer viewer; 81 | viewer.setUpViewInWindow(50, 50, 800, 600); 82 | viewer.setSceneData(root.get()); 83 | return viewer.run(); 84 | } 85 | -------------------------------------------------------------------------------- /11_Shadow/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Shadow) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgShadow) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGSHADOW) 26 | -------------------------------------------------------------------------------- /11_Shadow/main - 副本.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | osg::AnimationPath* createAnimationPath(float radius, float time) 10 | { 11 | osg::ref_ptr path = 12 | new osg::AnimationPath; 13 | path->setLoopMode(osg::AnimationPath::LOOP); 14 | 15 | unsigned int numSamples = 32; 16 | float delta_yaw = 2.0f * osg::PI / ((float)numSamples - 1.0f); 17 | float delta_time = time / (float)numSamples; 18 | for (unsigned int i = 0; i < numSamples; ++i) 19 | { 20 | float yaw = delta_yaw * (float)i; 21 | osg::Vec3 pos(sinf(yaw)*radius, cosf(yaw)*radius, 0.0f); 22 | osg::Quat rot(-yaw, osg::Z_AXIS); 23 | path->insert(delta_time * (float)i, 24 | osg::AnimationPath::ControlPoint(pos, rot) 25 | ); 26 | } 27 | return path.release(); 28 | } 29 | 30 | int main(int argc, char** argv) 31 | { 32 | unsigned int rcvShadowMask = 0x1; 33 | unsigned int castShadowMask = 0x2; 34 | 35 | osg::ref_ptr groundNode = 36 | new osg::MatrixTransform; 37 | groundNode->addChild(osgDB::readNodeFile("lz.osg")); 38 | groundNode->setMatrix(osg::Matrix::translate(0.0f, 0.0f, -200.0f)); 39 | groundNode->setNodeMask(rcvShadowMask); 40 | 41 | osg::ref_ptr cessnaNode = 42 | new osg::MatrixTransform; 43 | cessnaNode->addChild(osgDB::readNodeFile("cessna.osg.0,0,90.rot")); 44 | cessnaNode->setNodeMask(castShadowMask); 45 | osg::ref_ptr apcb =new osg::AnimationPathCallback; 46 | apcb->setAnimationPath(createAnimationPath(50.0f, 6.0f)); 47 | cessnaNode->setUpdateCallback(apcb.get()); 48 | 49 | osg::ref_ptr truckNode = 50 | new osg::MatrixTransform; 51 | truckNode->addChild(osgDB::readNodeFile("dumptruck.osg")); 52 | truckNode->setMatrix(osg::Matrix::translate(0.0f, 0.0f, -100.0f)); 53 | truckNode->setNodeMask(rcvShadowMask | castShadowMask); 54 | 55 | osg::ref_ptr source = new osg::LightSource; 56 | source->getLight()->setPosition(osg::Vec4(4.0, 4.0, 10.0, 0.0)); 57 | source->getLight()->setAmbient(osg::Vec4(0.2, 0.2, 0.2, 1.0)); 58 | source->getLight()->setDiffuse(osg::Vec4(0.8, 0.8, 0.8, 1.0)); 59 | 60 | osg::ref_ptr sm = new osgShadow::ShadowMap; 61 | sm->setLight(source.get()); 62 | sm->setTextureSize(osg::Vec2s(1024, 1024)); 63 | sm->setTextureUnit(1); 64 | 65 | osg::ref_ptr root = 66 | new osgShadow::ShadowedScene; 67 | root->setShadowTechnique(sm.get()); 68 | root->setReceivesShadowTraversalMask(rcvShadowMask); 69 | root->setCastsShadowTraversalMask(castShadowMask); 70 | 71 | root->addChild(groundNode.get()); 72 | root->addChild(cessnaNode.get()); 73 | root->addChild(truckNode.get()); 74 | root->addChild(source.get()); 75 | 76 | osgViewer::Viewer viewer; 77 | viewer.setUpViewInWindow(50, 50, 800, 600); 78 | viewer.setSceneData(root.get()); 79 | return viewer.run(); 80 | } 81 | -------------------------------------------------------------------------------- /11_Shadow/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/11_Shadow/main.cpp -------------------------------------------------------------------------------- /11_Text/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Text) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgText) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGTEXT) 26 | -------------------------------------------------------------------------------- /11_Text/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | osg::ref_ptr g_font = osgText::readFontFile("fonts/arial.ttf"); 9 | 10 | osg::Camera* createHUDCamera(double left, double right, 11 | double bottom, double top) 12 | { 13 | osg::ref_ptr camera = new osg::Camera; 14 | camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF); 15 | camera->setClearMask(GL_DEPTH_BUFFER_BIT); 16 | camera->setRenderOrder(osg::Camera::POST_RENDER); 17 | camera->setAllowEventFocus(false); 18 | camera->setProjectionMatrix( 19 | osg::Matrix::ortho2D(left, right, bottom, top)); 20 | return camera.release(); 21 | } 22 | 23 | osgText::Text* createText(const osg::Vec3& pos, 24 | const std::string& content, 25 | float size) 26 | { 27 | osg::ref_ptr text = new osgText::Text; 28 | text->setFont(g_font.get()); 29 | text->setCharacterSize(size); 30 | text->setAxisAlignment(osgText::TextBase::XY_PLANE); 31 | text->setPosition(pos); 32 | text->setText(content); 33 | return text.release(); 34 | } 35 | 36 | int main(int argc, char** argv) 37 | { 38 | osg::ref_ptr textGeode = new osg::Geode; 39 | textGeode->addDrawable(createText( 40 | osg::Vec3(150.0f, 500.0f, 0.0f), 41 | "The Cessna monoplane", 42 | 20.0f) 43 | ); 44 | textGeode->addDrawable(createText( 45 | osg::Vec3(150.0f, 450.0f, 0.0f), 46 | "Six-seat, low-wing and twin-engined", 47 | 15.0f) 48 | ); 49 | 50 | osg::Camera* camera = createHUDCamera(0, 1024, 0, 768); 51 | camera->addChild(textGeode.get()); 52 | camera->getOrCreateStateSet()->setMode( 53 | GL_LIGHTING, osg::StateAttribute::OFF); 54 | 55 | osg::ref_ptr root = new osg::Group; 56 | root->addChild(osgDB::readNodeFile("cessna.osg")); 57 | root->addChild(camera); 58 | 59 | osgViewer::Viewer viewer; 60 | viewer.setUpViewInWindow(50, 50, 800, 600); 61 | viewer.setSceneData(root.get()); 62 | return viewer.run(); 63 | } 64 | -------------------------------------------------------------------------------- /11_Text3D/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Text3D) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgText) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGTEXT) 26 | -------------------------------------------------------------------------------- /11_Text3D/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | osg::ref_ptr g_font3D = osgText::readFont3DFile("fonts/arial.ttf"); 9 | 10 | osgText::Text3D* createText3D(const osg::Vec3& pos, 11 | const std::string& content, 12 | float size, float depth) 13 | { 14 | osg::ref_ptr text = new osgText::Text3D; 15 | text->setFont(g_font3D.get()); 16 | text->setCharacterSize(size); 17 | text->setCharacterDepth(depth); 18 | text->setAxisAlignment(osgText::TextBase::XZ_PLANE); 19 | text->setPosition(pos); 20 | text->setText(content); 21 | return text.release(); 22 | } 23 | 24 | int main(int argc, char** argv) 25 | { 26 | osg::ref_ptr textGeode = new osg::Geode; 27 | textGeode->addDrawable( 28 | createText3D(osg::Vec3(), "The Cessna", 20.0f, 10.0f)); 29 | 30 | osg::ref_ptr textNode = new 31 | osg::MatrixTransform; 32 | textNode->setMatrix(osg::Matrix::translate(0.0f, 0.0f, 10.0f)); 33 | textNode->addChild(textGeode.get()); 34 | 35 | osg::ref_ptr root = new osg::Group; 36 | root->addChild(osgDB::readNodeFile("cessna.osg")); 37 | root->addChild(textNode.get()); 38 | osgViewer::Viewer viewer; 39 | viewer.setUpViewInWindow(50, 50, 800, 600); 40 | viewer.setSceneData(root.get()); 41 | return viewer.run(); 42 | } 43 | -------------------------------------------------------------------------------- /12_MultiThread/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName MultiThread) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | find_package(osgText) 13 | find_package(OpenThreads) 14 | 15 | macro(config_project PROJNAME LIBNAME) 16 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 17 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 18 | endmacro() 19 | 20 | add_executable(${ProjName} main.cpp) 21 | config_project(${ProjName} OPENTHREADS) 22 | config_project(${ProjName} OSG) 23 | config_project(${ProjName} OSGDB) 24 | config_project(${ProjName} OSGUTIL) 25 | config_project(${ProjName} OSGVIEWER) 26 | config_project(${ProjName} OSGGA) 27 | config_project(${ProjName} OSGANIMATION) 28 | config_project(${ProjName} OSGTEXT) 29 | config_project(${ProjName} OPENTHREADS) 30 | -------------------------------------------------------------------------------- /12_MultiThread/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/12_MultiThread/main.cpp -------------------------------------------------------------------------------- /12_Occluder/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName Occluder) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /12_Occluder/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #define RAND(min, max) \ 9 | ((min) + (float)rand()/(RAND_MAX+1) * ((max)-(min))) 10 | 11 | // 随机创建(-100.0, 1.0, -100.0) 到 (100.0, 100.0, 100.0) 范围内的大小为(1.0, 1.0) 的四边形 12 | osg::Geode* createMassiveQuads(unsigned int number) 13 | { 14 | osg::ref_ptr geode = new osg::Geode; 15 | for (unsigned int i = 0; i < number; ++i) 16 | { 17 | osg::Vec3 randomCenter; 18 | randomCenter.x() = RAND(-100.0f, 100.0f); 19 | randomCenter.y() = RAND(1.0f, 100.0f); 20 | randomCenter.z() = RAND(-100.0f, 100.0f); 21 | 22 | osg::ref_ptr quad = 23 | osg::createTexturedQuadGeometry( 24 | randomCenter, 25 | osg::Vec3(1.0f, 0.0f, 0.0f), 26 | osg::Vec3(0.0f, 0.0f, 1.0f) 27 | ); 28 | geode->addDrawable(quad.get()); 29 | } 30 | return geode.release(); 31 | } 32 | 33 | int main(int argc, char** argv) 34 | { 35 | osg::ref_ptr occluderNode = new osg::OccluderNode; 36 | osg::ref_ptr cpo = new 37 | osg::ConvexPlanarOccluder; 38 | cpo->getOccluder().add(osg::Vec3(-120.0f, 0.0f, -120.0f)); 39 | cpo->getOccluder().add(osg::Vec3(120.0f, 0.0f, -120.0f)); 40 | cpo->getOccluder().add(osg::Vec3(120.0f, 0.0f, 120.0f)); 41 | cpo->getOccluder().add(osg::Vec3(-120.0f, 0.0f, 120.0f)); 42 | occluderNode->setOccluder(cpo.get()); 43 | 44 | osg::ref_ptr occluderGeode = new osg::Geode; 45 | occluderGeode->addDrawable(osg::createTexturedQuadGeometry( 46 | osg::Vec3(-120.0f, 0.0f, -120.0f), 47 | osg::Vec3(240.0f, 0.0f, 0.0f), 48 | osg::Vec3(0.0f, 0.0f, 240.0f)) 49 | ); 50 | occluderNode->addChild(occluderGeode.get()); 51 | 52 | osg::ref_ptr root = new osg::Group; 53 | root->addChild(createMassiveQuads(100000)); 54 | root->addChild(occluderNode.get()); 55 | root->getOrCreateStateSet()->setMode( 56 | GL_LIGHTING, osg::StateAttribute::OFF); 57 | 58 | osgViewer::Viewer viewer; 59 | viewer.addEventHandler(new osgViewer::StatsHandler); 60 | viewer.setUpViewInWindow(50, 50, 800, 600); 61 | viewer.setSceneData(root.get()); 62 | return viewer.run(); 63 | } 64 | -------------------------------------------------------------------------------- /12_QuadTree/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName QuadTree) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /12_QuadTree/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/12_QuadTree/main.cpp -------------------------------------------------------------------------------- /12_SharingTexture/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName SharingTexture) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /12_SharingTexture/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #define RAND(min, max) \ 10 | ((min) + (float)rand()/(RAND_MAX+1) * ((max)-(min))) 11 | 12 | osg::Geode* createMassiveQuads(unsigned int number, 13 | const std::string& imageFile) 14 | { 15 | osg::ref_ptr geode = new osg::Geode; 16 | for (unsigned int i = 0; i < number; ++i) 17 | { 18 | osg::Vec3 randomCenter; 19 | randomCenter.x() = RAND(-100.0f, 100.0f); 20 | randomCenter.y() = RAND(1.0f, 100.0f); 21 | randomCenter.z() = RAND(-100.0f, 100.0f); 22 | 23 | osg::ref_ptr quad = 24 | osg::createTexturedQuadGeometry( 25 | randomCenter, 26 | osg::Vec3(1.0f, 0.0f, 0.0f), 27 | osg::Vec3(0.0f, 0.0f, 1.0f) 28 | ); 29 | 30 | osg::ref_ptr texture = new osg::Texture2D; 31 | texture->setImage(osgDB::readImageFile(imageFile)); 32 | quad->getOrCreateStateSet()->setTextureAttributeAndModes( 33 | 0, texture.get()); 34 | geode->addDrawable(quad.get()); 35 | } 36 | return geode.release(); 37 | } 38 | 39 | class ReadAndShareImageCallback : public osgDB::ReadFileCallback 40 | { 41 | public: 42 | virtual osgDB::ReaderWriter::ReadResult readImage( 43 | const std::string& filename, const osgDB::Options* options 44 | ); 45 | 46 | protected: 47 | osg::Image* getImageByName(const std::string& filename) 48 | { 49 | ImageMap::iterator itr = _imageMap.find(filename); 50 | if (itr != _imageMap.end()) return itr->second.get(); 51 | return NULL; 52 | } 53 | 54 | typedef std::map > 55 | ImageMap; 56 | ImageMap _imageMap; 57 | }; 58 | 59 | osgDB::ReaderWriter::ReadResult ReadAndShareImageCallback::readImage( 60 | const std::string& filename, const osgDB::Options* options) 61 | { 62 | osg::Image* image = getImageByName(filename); 63 | if (!image) 64 | { 65 | osgDB::ReaderWriter::ReadResult rr; 66 | rr = osgDB::Registry::instance()->readImageImplementation( 67 | filename, options); 68 | if (rr.success()) _imageMap[filename] = rr.getImage(); 69 | return rr; 70 | } 71 | return image; 72 | } 73 | 74 | int main(int argc, char** argv) 75 | { 76 | osgDB::Registry::instance()->setReadFileCallback( 77 | new ReadAndShareImageCallback); 78 | osgDB::Registry::instance()->getOrCreateSharedStateManager(); 79 | 80 | osg::ref_ptr root = new osg::Group; 81 | root->addChild(createMassiveQuads(500, "Images/lz.rgb")); 82 | root->addChild(createMassiveQuads(500, "Images/osg64.png")); 83 | 84 | osgDB::SharedStateManager* ssm = 85 | osgDB::Registry::instance()->getSharedStateManager(); 86 | if (ssm) ssm->share(root.get()); 87 | 88 | osgViewer::Viewer viewer; 89 | viewer.setUpViewInWindow(50, 50, 800, 600); 90 | viewer.setSceneData(root.get()); 91 | return viewer.run(); 92 | } 93 | -------------------------------------------------------------------------------- /12_ThreadingModel/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.6) 2 | set(ProjName ThreadingModel) 3 | project(${ProjName}) 4 | 5 | find_package(OpenThreads) 6 | find_package(osg) 7 | find_package(osgDB) 8 | find_package(osgUtil) 9 | find_package(osgViewer) 10 | find_package(osgGA) 11 | find_package(osgAnimation) 12 | 13 | macro(config_project PROJNAME LIBNAME) 14 | include_directories( ${${LIBNAME}_INCLUDE_DIR} ) 15 | target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARY} ) 16 | endmacro() 17 | 18 | add_executable(${ProjName} main.cpp) 19 | config_project(${ProjName} OPENTHREADS) 20 | config_project(${ProjName} OSG) 21 | config_project(${ProjName} OSGDB) 22 | config_project(${ProjName} OSGUTIL) 23 | config_project(${ProjName} OSGVIEWER) 24 | config_project(${ProjName} OSGGA) 25 | config_project(${ProjName} OSGANIMATION) 26 | -------------------------------------------------------------------------------- /12_ThreadingModel/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #define RAND(min, max) \ 8 | ((min) + (float)rand()/(RAND_MAX+1)*((max)-(min))) 9 | 10 | osg::Geode* createMassiveQuads(unsigned int number) 11 | { 12 | osg::ref_ptr geode = new osg::Geode; 13 | for (unsigned int i = 0; i < number; ++i) 14 | { 15 | osg::Vec3 randomCenter; 16 | randomCenter.x() = RAND(-100.0f, 100.0f); 17 | randomCenter.y() = RAND(1.0f, 100.0f); 18 | randomCenter.z() = RAND(-100.0f, 100.0f); 19 | 20 | osg::ref_ptr quad = 21 | osg::createTexturedQuadGeometry( 22 | randomCenter, 23 | osg::Vec3(1.0f, 0.0f, 0.0f), 24 | osg::Vec3(0.0f, 0.0f, 1.0f) 25 | ); 26 | geode->addDrawable(quad.get()); 27 | } 28 | return geode.release(); 29 | } 30 | 31 | osgViewer::View* createView(int x, int y, int w, int h, osg::Node* scene) 32 | { 33 | osg::ref_ptr view = new osgViewer::View; 34 | view->setSceneData(scene); 35 | view->setUpViewInWindow(x, y, w, h); 36 | return view.release(); 37 | } 38 | 39 | int main(int argc, char** argv) 40 | { 41 | osg::ArgumentParser arguments(&argc, argv); 42 | osgViewer::ViewerBase::ThreadingModel th = 43 | osgViewer::ViewerBase::AutomaticSelection; 44 | if (arguments.read("--single")) th = osgViewer::ViewerBase::SingleThreaded; 45 | else if (arguments.read("--useContext")) th = osgViewer::ViewerBase::ThreadPerContext; 46 | else if (arguments.read("--useCamera")) th = osgViewer::ViewerBase::ThreadPerCamera; 47 | 48 | osgViewer::View* view1 = createView(50, 50, 640, 480, 49 | createMassiveQuads(10000)); 50 | osgViewer::View* view2 = createView(50, 550, 320, 240, 51 | createMassiveQuads(5000)); 52 | osgViewer::View* view3 = createView(370, 550, 320, 240, 53 | createMassiveQuads(5000)); 54 | view1->addEventHandler(new osgViewer::StatsHandler); 55 | 56 | osgViewer::CompositeViewer viewer; 57 | viewer.setThreadingModel(th); 58 | viewer.addView(view1); 59 | viewer.addView(view2); 60 | viewer.addView(view3); 61 | return viewer.run(); 62 | } 63 | -------------------------------------------------------------------------------- /OSGCookExample/OSGCookExample/PickHandler.cpp: -------------------------------------------------------------------------------- 1 | #include "PickHandler.h" 2 | -------------------------------------------------------------------------------- /OSGCookExample/OSGCookExample/common.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/OSGCookExample/OSGCookExample/common.cpp -------------------------------------------------------------------------------- /OSGCookExample/OSGCookExample/libutil.cpp: -------------------------------------------------------------------------------- 1 | #pragma comment(lib, "opengl32.lib") 2 | #ifdef _DEBUG 3 | #pragma comment(lib, "OpenThreadsd.lib") 4 | #pragma comment(lib, "osgd.lib") 5 | #pragma comment(lib, "osgAnimationd.lib") 6 | #pragma comment(lib, "osgDBd.lib") 7 | #pragma comment(lib, "osgFXd.lib") 8 | #pragma comment(lib, "osgGAd.lib") 9 | #pragma comment(lib, "osgManipulatord.lib") 10 | #pragma comment(lib, "osgParticled.lib") 11 | #pragma comment(lib, "osgPresentationd.lib") 12 | #pragma comment(lib, "osgShadowd.lib") 13 | #pragma comment(lib, "osgSimd.lib") 14 | #pragma comment(lib, "osgTerraind.lib") 15 | #pragma comment(lib, "osgTextd.lib") 16 | #pragma comment(lib, "osgUId.lib") 17 | #pragma comment(lib, "osgUtild.lib") 18 | #pragma comment(lib, "osgViewerd.lib") 19 | #pragma comment(lib, "osgVolumed.lib") 20 | #pragma comment(lib, "osgWidgetd.lib") 21 | #else 22 | #pragma comment(lib, "OpenThreads.lib") 23 | #pragma comment(lib, "osg.lib") 24 | #pragma comment(lib, "osgAnimation.lib") 25 | #pragma comment(lib, "osgDB.lib") 26 | #pragma comment(lib, "osgFX.lib") 27 | #pragma comment(lib, "osgGA.lib") 28 | #pragma comment(lib, "osgManipulator.lib") 29 | #pragma comment(lib, "osgParticle.lib") 30 | #pragma comment(lib, "osgPresentation.lib") 31 | #pragma comment(lib, "osgShadow.lib") 32 | #pragma comment(lib, "osgSim.lib") 33 | #pragma comment(lib, "osgTerrain.lib") 34 | #pragma comment(lib, "osgText.lib") 35 | #pragma comment(lib, "osgUI.lib") 36 | #pragma comment(lib, "osgUtil.lib") 37 | #pragma comment(lib, "osgViewer.lib") 38 | #pragma comment(lib, "osgVolume.lib") 39 | #pragma comment(lib, "osgWidget.lib") 40 | #endif -------------------------------------------------------------------------------- /OSGCookExample/OSGCookExample/main.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XiaBingGame/OSGBeginnerTutorial/8a0df32cf78ea5ab9db9a8167299d4f4d4ba5291/OSGCookExample/OSGCookExample/main.cpp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenSceneGraph 3.0 - Beginner's Guide 源码 2 | * 03_MonitorRFC 3 | - 查看引用计数的变化 4 | - osg::Referenced::referenceCount() --- 查看引用计数 5 | * 03_ReadFromCommandLine 6 | - 从命令行读取文件 7 | - osg::ArgumentParser 8 | - osg::ArgumentParser::read("--parameter", value) 读取参数 9 | * 03_RedirectNotifier 10 | - 设置输出调试信息到文件 11 | - 派生类 osg::NotifyHandler 12 | - 重写 notify() 方法 13 | - osg::setNotifyLevel() / osg::setNotifyHandler() 方法 14 | ``` 15 | OSG_FATAL << "Test Fatal notify."; 16 | ``` 17 | * 04_ColoredQuad 18 | - 绘制一个四边形 19 | - Geode 20 | - Geometry 21 | - VertexArray 22 | - NormalArray 23 | - ColorArray 24 | - PrimitiveSet:添加 DrawArrays 和 DrawElements 25 | - addDrawable: 添加几何体 26 | * 04_DrawOctahedron 27 | - 主要讲述如何通过索引创建一个几何体 28 | - 绘制一个多面体, 主要是讲图元, osg::DrawElementsUInt 可以创建一个索引数组, geometry 调用 addPrimitiveSet() 添加它. 29 | - osgUtil::SmoothingVisitor::smooth 平滑一个几何体, 主要是可以为一个几何体生成法线 30 | * 04_OpenGLTeapot 31 | - 自定义 drawable, 进行自定义绘制, 通过 OpenGL 函数进行绘制, 需要实现下面的两个函数 32 | - osg::Drawable::computeBound() --- 返回对应的围绕盒 33 | - osg::Drawable::drawImplementation() --- 绘制部分, 其内可以调用opengl的相关函数进行绘制。 34 | * 04_PrimitiveFunctor 35 | - 仿函数, 可以统计多边形面信息 36 | - 本例介绍了 osg::TriangleFunctor, 这里使用其打印面信息,调用模板类的 operator() 函数进行自定义操作, osg::TriangleFunctor 在模拟绘制三角形时调用. 37 | - 主要原理 osg::Drawable::accept(Functor), 使用 Functor 的函数代替 OpenGL 的绘制函数, 可绘制对象调用仿函数,参数是三个顶点 38 | * 04_SimpleObject 39 | - 几个简单的形状 box, sphere, cone 40 | - osg::ShapeDrawable::setShape() --- 设置不同的形状 41 | * 04_TessellatePolygon 42 | - 凹多边形转凸多边形(分形化一个 Geometry) 43 | - osgUtil::Tessellator 44 | - retessellatePolygons() 分形化一个几何体 45 | - 这里对几何体 Tessellator 之后再将其添加至 geode 内 46 | * 05_AddModel 47 | - osg::Group::addChild 48 | * 05_AnalyzeStructure 49 | - 遍历节点, 打印出其库名和类名 50 | - 从 osg::NodeVisitor 派生 51 | - 构造函数设置遍历模式 setTraversalMode(), 本例使用 osg::NodeVisitor::TRAVERSE_ALL_CHILDREN. 52 | - 重写 apply 函数 53 | - osg::Object::libraryName() 输出库名, osg::Object::className() 输出类名 54 | - osg::Geode::getNumDrawables() 获取所有可绘制对象的数量, osg::Geode::getDrawable() 获取某个可绘制对象. 55 | * 05_LodNode 56 | - 实现一个LOD节点 57 | - osgUtil::Simplifier --- 简化几何体 58 | - osg::LOD --- addChild, 添加子节点。 59 | * 05_ProxyNode 60 | - osg::ProxyNode 61 | - setFileName --- 显示的时候再加载 62 | * 05_SwitchAnimate 63 | - osg::Switch 64 | - setValue 设置可见性 65 | - 重写 osg::Switch::traverse 方法, 其在各种遍历会调用, 如更新遍历, 剔除遍历 66 | - 本例通过遍历次数实现动画 67 | * 05_SwitchNode 68 | - osg::Switch 69 | - addChild 方法 70 | * 05_TranslateNode 71 | - osg::MatrixTransform 72 | - setMatrix 73 | - osg::Matrix::translate 74 | * 06_BezierCurve 75 | - 使用几何着色器创建贝塞尔曲线, 几何着色器插值生成顶点 76 | - 设置输出类型为 GL_LINE_STRIP, 输入类型为 GL_LINES_ADJACENCY_EXT 77 | - 通过 osg::Program::setParameter 设置参数, 本例三个参数 GL_GEOMETRY_VERTICES_OUT_EXT 和 GL_GEOMETRY_INPUT_TYPE_EXT, GL_GEOMETRY_OUTPUT_TYPE_EXT 78 | - 顶点输出数量,几何着色器的输入类型,几何着色器的输出类型 79 | - 使用 line adjacency 图元作为输入, 该输入有四个元素 80 | - 几何着色器输入有 gl_PositionIn 数组, 通过 EmitVertex() 输出顶点, EndPrimitive() 结束图元绘制 81 | * 06_CartoonCow 82 | - 使用着色器进行卡通着色 83 | - 根据点乘光的方向和法线向量设置颜色值 84 | * 06_Fog 85 | - osg::Fog 的使用,作为 osg::StateSet 的属性 86 | - setMode,setStart,setEnd,setColor 87 | * 06_Lighting 88 | - 创建 osg::LightSource --- 光源实体, 是一个节点 89 | - 创建 osg::Light --- 光源属性 90 | - setLight 91 | - setLightNum --- 设置光源序号 92 | - 将 LightSource 添加至场景中 93 | * 06_PolygonMode 94 | - 线框模式绘制 95 | - osg::PolygonMode 96 | - setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE) 97 | * 06_StateSetInherit 98 | - 状态属性的继承关系 99 | - osg::StateAttribute::OVERRIDE,osg::StateAttribute::PROTECTED 100 | - osg::StateAttribute::PROTECTED 不被上层覆盖 101 | * 06_Texture2D 102 | - 创建一个四边形,然后贴上纹理 103 | * 06_Translucent --- 创建透明物体 104 | - 创建球体几何体 105 | - osg::BlendFunc: GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA 106 | * 07_FrameLoop 107 | - 本例演示输出帧号 108 | - osgViewer::done() 是否结束 109 | - osgViewer::frame() 运行一帧 110 | - osgViewer::Viewer::getFrameStamp()::getFrameNumber(): 得到帧号 111 | * 07_HUD 112 | - 创建一个相机绘制 HUD 内容,相机有自己的矩阵,而后添加子节点 113 | - 实现步骤 114 | - 创建相机 osg::Camera 115 | - 设置清除 mask 116 | - 设置渲染顺序为 osg::Camera::POST_RENDER 117 | - 设置参考坐标系为 osg::Camera::ABSOLUTE_RF 118 | - 设置视图矩阵 119 | - 添加子节点 120 | - 添加作为场景根节点的子节点 121 | * 07_MultipleScene(多窗口场景) 122 | - osgViewer::View --- 创建一个单独的窗口,在其内绘制视图场景 123 | - osgViewer::CompositeViewer::addView --- 添加这样的视图窗口 124 | - 管理多个 osgViewer::View 125 | * 07_MultiSampling(多重采样) 126 | - osg::DisplaySettings::setNumMultiSamples() --- 设置多重采样的参数 127 | * 07_RTT(渲染到纹理) 128 | - osg::Camera::setRenderTargetImplementation() --- 设置渲染到帧缓存对象 129 | - osg::Camera::attach() --- 渲染至纹理 130 | - 从 osg::NodeVisitor 派生一个访问器, 替换其内使用的问题 131 | ``` 132 | osg::Texture* oldTexture = dynamic_cast(ss->getTextureAttribute(0, osg::StateAttribute::TEXTURE)); 133 | if (oldTexture) ss->setTextureAttribute(0, _texture.get()); 134 | ``` 135 | - osg::StateSet 调用 getTextureAttribute 以及osg::StateAttribute::TEXTURE 参数获得纹理. 136 | - 替换所有 Node 和 Geode 的纹理, 如果为 Geode, 则替换其内所包含可渲染对象的所有纹理 137 | - 步骤 138 | - 创建一个纹理 osg::Texture 139 | - 创建相机, 设置视口为纹理大小 140 | - 背景颜色, clearMask, renderOrder 141 | - setRenderTargetImplementation 为帧缓存 142 | - attach 一个纹理 143 | - setReferenceFrame 144 | - setReferenceFrame( osg::Transform::ABSOLUTE_RF ) 等同于 glLoadMatrix. 要切换回去则用 osg::Transform::RELATIVE_RF 145 | - setViewMatrixAsLookAt 146 | * 08_AnimateCharacter 147 | - osgAnimation::BasicAnimationManager --- 派生自更新回调 148 | - getAnimationList() --- 得到动画列表 149 | - osgAnimation::Animation 150 | - playAnimation() --- 应用上面动画列表中的一个动画 151 | * 08_AnimationChannel 152 | - osgAnimation::Vec3Keyframe, osgAnimation::QuatKeyframe 关键帧组成 osgAnimation::Vec3KeyframeContainer 和 osgAnimation::QuatKeyframeContainer 两个容器 153 | - osgAnimation::Vec3LinearChannel/osgAnimation::QuatSphericalLinearChannel 154 | - 对于 channel 其有自身的 sampler, 每个sampler 内又包含一个插值器和一个 keyframe 容器. 155 | - getOrCreateSampler() 156 | - getOrCreateKeyframeContainer --- 得到容器 157 | - sampler 的容器插入关键帧. 158 | - osgAnimation::Animation 159 | - setPlayMode 160 | - addChannel 161 | - 动画播放时根据内包含的频道更新数值. 162 | - osgAnimation::UpdateMatrixTransform 163 | - getStackedTransforms() 164 | - 这是个容器, 保存 osgAnimation::StackedTranslateElement 元素 和 osgAnimation::StackedQuaternionElement 元素,这些名称的名字和之前 channel 的名字一样 165 | - 这是一个节点更新回调, 之前播放动画的时候, 会更新其内的频道值, 而这些频道值则会更新上面容器内的值.因此更新了该类关联的变换矩阵 166 | - osgAnimation::BasicAnimationManager 167 | - registerAnimation 注册一个动画 168 | - 这也是一个更新回调 169 | - playAnimation 播放动画 170 | - 总结如下: 171 | - 需要设置一个节点的更新回调为 BasicAnimationManger 类型, 主要用途为播放其内的 Animation 172 | - 矩阵变换节点需要有个更新回调为 UpdateMatrixTransform 类型, 主要用途是使用 Animation 更新后的结果更新矩阵变换节点. 注意该矩阵变换节点使用的矩阵等于频道内的平移和旋转. 173 | - 动画会包含所有需要更新的频道. 174 | - 每个频道有自己的sampler, sampler 包含自己的插值器和关键帧容器. 175 | * 08_AnimationPath 176 | - 实现动画路径 177 | - osg::AnimationPath 178 | - setLoopMode: 设置循环模式 179 | - insert: 插入一个控制点 180 | - osg::AnimationPathCallback 节点回调 181 | - setAnimationPath 设置路径(osg::AnimationPath) 182 | - 通常设置为节点更新回调 183 | * 08_FadingIn 184 | - 演示了 osg::Matrial 属性以及其相应的回调, 并演示了 osgAnimation::InOutCubicMotion 185 | - 设置对象的状态属性更新回调 186 | - osg::StateAttributeCallback 派生自 osg::Callback 187 | - bool run() 188 | - void operator(), 两个参数, 分别为 osg::StateAttribute 和 osg::NodeVisitor 指针 189 | - 本例修改 osg::Material 内 Diffuse 的 alpha 值, osg::Material 从 osg::StateAttribute 指针而来 190 | - osg::StateAttribute 可以设置更新回调 191 | - osgAnimation::InOutCubicMotion 192 | - 本例使用 update 更新, 使用 getValue 获取其值 193 | - 类型别名 osgAnimation::MathMotionTemplate 194 | - 结构体 MathMotionTemplate 派生自 osgAnimation::Motion 195 | - osgAnimation::Motion 196 | - 纯基类函数 getValueInNormalizedRange, 第一个参数是时间比例(当前时间/总时间),第二个参数为返回的结果 197 | - MathMotionTemplate 重写了函数 getValueInNormalizedRange, 调用了模板类的 getValueAt 函数 198 | - 结构体 InOutCubicFunction 重写了 getValueAt 函数, 三次方来回运动 199 | * 08_Flashing 200 | - 设置连续图像动画, 使用 osg::ImageSequence 201 | - addImage() --- 添加图像 202 | - setLength() --- 设置时间长度 203 | - play() --- 播放 204 | - 可以学会如何创建 osg::Image 205 | - allocateImage 分配内存 206 | - data() 某一行列的数据指针 207 | - osg::Texture2D 纹理 208 | - setImage() 目标可以是 osg::ImageSequence 209 | * 08_GeometryDynamically 210 | - 通过更新回调更改一个几何体, 该回调为 osg::Drawable::UpdateCallback 的派生类 211 | - 同时演示了 osg::Drawable 的更新回调, 其更新回调重写的是 update() 函数 212 | - 更新几何数组后调用函数 osg::Geometry::dirtyDisplayList() 和 osg::Geometry::dirtyBound() 更新显示列表和围绕盒 213 | * 08_SwitchUpdate 214 | - 通过更新回调切换Switch节点子节点的状态 215 | * 09_DrivingCessna 216 | - osg::Camera 217 | - setAllowEventFocus() 是否允许其关联窗口产生的事件影响到该相机 218 | - setViewMatrixAsLookAt() 设置视图矩阵 219 | - osgViewer::Viewer 220 | - addEventHandler() 添加事件处理(处理窗口事件) 221 | - osgGA::GUIEventHandler 派生窗口事件处理类 222 | - 重写 bool handle() 函数 223 | - osgGA::GUIEventAdapter 获取键盘鼠标事件 224 | * 09_GCTraits 225 | - osg::GraphicsContext::Traits 创建一个 traits 226 | - osg::GraphicsContext::createGraphicsContext 使用该 traits 创建一个窗口 osg::GraphicsContext 227 | - osg::Camera 创建一个相机 228 | - setGraphicsContext 设置其窗口上下文 229 | - setProjectionMatrixAsPerspective 设置投影矩阵 230 | - osgViewer::Viewer 231 | - setCamera 设置相机 232 | * 09_PickingGeometry --- 选择框 233 | - 展示了如何创建选择框 234 | - 线框,禁光照, 矩阵变换节点 235 | - 通过矩阵变换绘制和移动线框 236 | - 鼠标点击创建框框, 通过 MatrixTransform 实现 237 | - NodeMask 的使用 238 | - 本例使用相机接受相交访问器(osgUtil::IntersectionVisitor) 239 | - 鼠标点击相交检测 240 | - osgUtil::IntersectionVisitor 访问, 使用相机 accept 调用该 visitor 241 | - osg::computeLocalToWorld 计算矩阵 242 | * 09_UserTimer --- 可以添加一个用户事件 243 | - 本例是在 Frame 事件中添加用户事件 244 | - osgGA::GUIEventAdapter::FRAME 可以处理帧事件 245 | - viewer->getEventQueue()->userEvent() --- 添加一个用户事件 246 | * 09_Win32Handler --- Win32 API 和 osg 247 | - WM_CREATE 事件创建一个 osgViewer 而后用线程推进 248 | - 设置 traits->inheritedWindowData = windata(为窗口句柄) 249 | * 10_CustomFormat --- 自定义格式插件读写 250 | - 派生自 osgDB::ReaderWriter 251 | - REGISTER_OSGPLUGIN 宏注册 252 | * 11_Billboard 公告板 253 | - osg::Billboard 254 | - setMode: osg::Billboard::POINT_ROT_EYE 255 | - addDrawable: 添加一个可绘制对象, 因为 Billboard 派生自 osg::Geode 256 | * 11_Outline 给物体添加轮廓线效果. 257 | - osgFX::Outline 258 | - setWidth 259 | - setColor 260 | - addChild 261 | * 11_ParticleSystem 粒子系统 262 | - osgParticle::ParticleSystem 263 | - osg::PointSprite 264 | - osgParticle::RandomRateCounter 265 | - osgParticle::ModularEmitter 266 | - osgParticle::AccelOperator 267 | - osgParticle::ModularProgram 268 | * 11_Shadow 阴影效果 269 | - osg::Node 270 | - setNodeMask() --- 设置节点的 Mask 271 | - osg::AnimationPathCallback 动画路径回调 272 | - setAnimationPath() --- 设置动画路径 273 | - osg::LightSource 光源 274 | - getLight() 275 | - osgShadow::ShadowMap 276 | - setLight 277 | - setTextureSize 278 | - setTextureUnit 279 | - osgShadow::ShadowedScene 这是一个节点 280 | - setShadowTechnique 设置阴影技术 281 | - setReceivesShadowTraversalMask 设置阴影接受 mask 282 | - setCastsShadowTraversalMask 设置阴影投射 mask 283 | * 11_Text 输出文字 284 | - osg::Camera 285 | - 设置投影矩阵 286 | - 创建 HUD 相机用于绘制文本 287 | - osgText::Text 288 | - setFont 289 | - setCharacterSize 290 | - setAxisAlignment 291 | - setPosition 292 | * 11_Text3D --- 3D 字体, 当成一个 3D 模型 293 | - osgText::Text3D 294 | - setFont 295 | - setCharacterSize 296 | - setCharacterDepth 297 | - setAxisAlignment 298 | - setPosition 299 | - setText 300 | * 12_MultiThread --- 多线程程序 301 | - 本例演示键盘输入, 屏幕显示输入内容. 302 | - OpenThreads::Thread 派生一个线程类 303 | - OpenThreads::Mutex 互斥信号 304 | - OpenThreads::ScopedLock 锁 305 | - OpenThreads::startThread --- 开启线程 306 | - osgText::Text 307 | - setText: 设置文本 308 | * 12_Occluder 309 | - osg::OccluderNode 派生自 osg::Group, 主要用于提供钩子添加 ConvexPlanarOccluders 至场景中. 310 | - setOccluder(): 添加一个 ConvexPlanarOccluder 311 | - osg::ConvexPlanarOccluder 其内有 ConvexPlanarPolygon& 312 | - osg::ConvexPlanarPolygon 313 | - add 添加顶点 314 | - 只需要把 OccluderNode 添加至场景就可以实现遮挡 315 | * 12_QuadTree --- 使用 pageLOD 创建四叉树 316 | - osg::HeightField 派生自 osg::Shape 317 | - setSkirtHeight 设置边裙高度 318 | - setOrigin 设置原点,这里设置左下角为原点 319 | - setHeight 320 | - setXInterval, setYInterval 321 | - osg::PagedLOD 322 | - insertChild 323 | - setFileName 324 | - setCenterMode 325 | - setCenter 326 | - setRadius 327 | - setRange 328 | * 12_SharingTexture 329 | - 当读写图像文件时, 如果之前已经读取则不用再次访问硬盘, 直接从内存中获取. 330 | - osgDB::Registry::instance()->setReadFileCallback() 设置读文件回调 331 | - osgDB::ReadFileCallback 读文件回调类, 重写 readImage 函数 332 | - osgDB::Registry::instance()->readImageImplementation 调用底层的实现 333 | - osgDB::Registry::instance()->getOrCreateSharedStateManager 创建共享状态管理器 334 | - osgDB::SharedStateManager 335 | - share 336 | * 12_ThreadingModel 337 | - osgViewer::ViewerBase::ThreadingModel 线程模型 338 | - osgViewer::ViewerBase::AutomaticSelection 339 | - osgViewer::ViewerBase::SingleThreaded 340 | - osgViewer::ViewerBase::ThreadPerContext 341 | - osgViewer::ViewerBase::ThreadPerCamera 342 | - osgViewer::CompositeViewer 343 | - addView 添加多个 View 344 | - setThreadingMode --- 设置线程模式 345 | --------------------------------------------------------------------------------