# OSGBeginnerTutorial **Repository Path**: tengge1/OSGBeginnerTutorial ## Basic Information - **Project Name**: OSGBeginnerTutorial - **Description**: OpenSceneGraph 3.0 - Beginner's Guide 源码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-29 - **Last Updated**: 2022-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OpenSceneGraph 3.0 - Beginner's Guide 源码 * 03_MonitorRFC - 查看引用计数的变化 - osg::Referenced::referenceCount() --- 查看引用计数 * 03_ReadFromCommandLine - 从命令行读取文件 - osg::ArgumentParser * 03_RedirectNotifier - 设置输出调试信息到文件 - 派生类 osg::NotifyHandler - 重写 notify() 方法 - osg::setNotifyLevel() / osg::setNotifyHandler() 方法 * 04_ColoredQuad - 绘制一个四边形 - Geode - Geometry - VertexArray - NormalArray - ColorArray - PrimitiveSet * 04_DrawOctahedron - 绘制一个多面体, 主要是讲图元, osg::DrawElementsUInt 可以创建一个索引数组, geometry 调用 addPrimitiveSet() 添加它. - osgUtil::SmoothingVisitor::smooth 平滑一个几何体, 主要是可以为一个几何体生成法线 * 04_OpenGLTeapot - 自定义 drawable, 进行自定义绘制 - osg::Drawable::computeBound() --- 返回对应的围绕盒 - osg::Drawable::drawImplementation() --- 绘制部分, 其内可以调用opengl的相关函数进行绘制。 * 04_PrimitiveFunctor - 仿函数, 可以统计多边形面信息 - 本例介绍了 osg::TriangleFunctor, 这里使用其打印面信息,调用模板类的 operator() 函数进行自定义操作, osg::TriangleFunctor 在模拟绘制三角形时调用. - 主要原理 osg::Drawable::accept(Functor), 使用 Functor 的函数代替 OpenGL 的绘制函数。 * 04_SimpleObject - 几个简单的形状 box, sphere, cone - osg::ShapeDrawable::setShape() * 04_TessellatePolygon - 凹多边形转凸多边形(分形化一个 Geometry) - osgUtil::Tessellator - retessellatePolygons() 分形化一个几何体 * 05_AddModel - osg::Group::addChild * 05_AnalyzeStructure - 遍历节点, 打印出其库名和类名 - 从 osg::NodeVisitor 派生 - 构造函数设置遍历模式 setTraversalMode(), 本例使用 osg::NodeVisitor::TRAVERSE_ALL_CHILDREN. - 重写 apply 函数 - osg::Object::libraryName() 输出库名, osg::Object::className() 输出类名 - osg::Geode::getNumDrawables() 获取所有可绘制对象的数量, osg::Geode::getDrawable() 获取某个可绘制对象. * 05_LodNode - osgUtil::Simplifier --- 简化几何体 - osg::LOD --- addChild, 添加子节点。 * 05_ProxyNode - osg::ProxyNode - setFileName --- 显示的时候再加载 * 05_SwitchAnimate - osg::Switch - setValue 设置可见性 - 重写 osg::Switch::traverse 方法, 其在各种遍历会调用, 如更新遍历, 剔除遍历 - 本例通过遍历次数实现动画 * 05_SwitchNode - osg::Switch - addChild 方法 * 05_TranslateNode - osg::MatrixTransform - setMatrix - osg::Matrix::translate * 06_BezierCurve - 使用几何着色器创建贝塞尔曲线, 几何着色器插值生成顶点 - 设置输出类型为 GL_LINE_STRIP, 输入类型为 GL_LINES_ADJACENCY_EXT - 通过 osg::Program::setParameter 设置参数, 本例三个参数 GL_GEOMETRY_VERTICES_OUT_EXT 和 GL_GEOMETRY_INPUT_TYPE_EXT, GL_GEOMETRY_OUTPUT_TYPE_EXT - 使用 line adjacency 图元作为输入, 该输入有四个元素 * 06_CartoonCow - 使用着色器进行卡通着色 * 06_Fog - Fog 的使用 - setMode,setStart,setEnd,setColor * 06_Lighting - 创建 osg::LightSource --- 光源实体 - 创建 osg::Light --- 光源属性 - setLight - setLightNum --- 设置光源序号 - 将 LightSource 添加至场景中 * 06_PolygonMode - 线框模式绘制 - osg::PolygonMode - setMode * 06_StateSetInherit - 状态属性的继承关系 - osg::StateAttribute::OVERRIDE,osg::StateAttribute::PROTECTED * 06_Texture2D - 创建一个四边形,然后贴上纹理 * 06_Translucent --- 创建透明物体 - 创建球体几何体 - osg::BlendFunc * 07_FrameLoop - 本例演示输出帧号 - osgViewer::Viewer::getFrameStamp()::getFrameNumber(): 得到帧号 * 07_HUD - 创建一个相机绘制 HUD 内容,相机有自己的矩阵,而后添加子节点 * 07_MultipleScene(多窗口场景) - osgViewer::View --- 创建一个单独的窗口,在其内绘制视图场景 - osgViewer::CompositeViewer::addView --- 添加这样的视图窗口 * 07_MultiSampling(多重采样) - osg::DisplaySettings::setNumMultiSamples() --- 设置多重采样 * 07_RTT(渲染到纹理) - osg::Camera::setRenderTargetImplementation() --- 设置渲染到帧缓存对象 - osg::Camera::attach() --- 渲染至纹理 - 从 osg::NodeVisitor 派生一个访问器, 替换其内使用的问题 ``` osg::Texture* oldTexture = dynamic_cast(ss->getTextureAttribute(0, osg::StateAttribute::TEXTURE)); if (oldTexture) ss->setTextureAttribute(0, _texture.get()); ``` - osg::StateSet 调用 getTextureAttribute 以及osg::StateAttribute::TEXTURE 参数获得纹理. - 替换所有 Node 和 Geode 的纹理, 如果为 Geode, 则替换其内所包含可渲染对象的所有纹理 - 步骤 - 创建一个纹理 osg::Texture - 创建相机, 设置视口为纹理大小 - 背景颜色, clearMask, renderOrder - setRenderTargetImplementation 为帧缓存 - attach 一个纹理 - setReferenceFrame - setReferenceFrame( osg::Transform::ABSOLUTE_RF ) 等同于 glLoadMatrix. 要切换回去则用 osg::Transform::RELATIVE_RF - setViewMatrixAsLookAt * 08_AnimateCharacter - osgAnimation::BasicAnimationManager --- 派生自更新回调 - getAnimationList() --- 得到动画列表 - osgAnimation::Animation - playAnimation() --- 应用上面动画列表中的一个动画 * 08_AnimationChannel - osgAnimation::Vec3Keyframe, osgAnimation::QuatKeyframe 关键帧组成 osgAnimation::Vec3KeyframeContainer 和 osgAnimation::QuatKeyframeContainer 两个容器 - osgAnimation::Vec3LinearChannel/osgAnimation::QuatSphericalLinearChannel - 对于 channel 其有自身的 sampler, 每个sampler 内又包含一个插值器和一个 keyframe 容器. - getOrCreateSampler() - getOrCreateKeyframeContainer --- 得到容器 - sampler 的容器插入关键帧. - osgAnimation::Animation - setPlayMode - addChannel - 动画播放时根据内包含的频道更新数值. - osgAnimation::UpdateMatrixTransform - getStackedTransforms() - 这是个容器, 保存 osgAnimation::StackedTranslateElement 元素 和 osgAnimation::StackedQuaternionElement 元素,这些名称的名字和之前 channel 的名字一样 - 这是一个节点更新回调, 之前播放动画的时候, 会更新其内的频道值, 而这些频道值则会更新上面容器内的值.因此更新了该类关联的变换矩阵 - osgAnimation::BasicAnimationManager - registerAnimation 注册一个动画 - 这也是一个更新回调 - playAnimation 播放动画 - 总结如下: - 需要设置一个节点的更新回调为 BasicAnimationManger 类型, 主要用途为播放其内的 Animation - 矩阵变换节点需要有个更新回调为 UpdateMatrixTransform 类型, 主要用途是使用 Animation 更新后的结果更新矩阵变换节点. 注意该矩阵变换节点使用的矩阵等于频道内的平移和旋转. - 动画会包含所有需要更新的频道. - 每个频道有自己的sampler, sampler 包含自己的插值器和关键帧容器. * 08_AnimationPath - 实现动画路径 - osg::AnimationPath - setLoopMode: 设置循环模式 - insert: 插入一个控制点 - osg::AnimationPathCallback 节点回调 - setAnimationPath 设置路径(osg::AnimationPath) - 通常设置为节点更新回调 * 08_FadingIn - 演示了 osg::Matrial 属性以及其相应的回调, 并演示了 osgAnimation::InOutCubicMotion - 设置对象的状态属性更新回调 - osg::StateAttributeCallback 派生自 osg::Callback - bool run() - void operator(), 两个参数, 分别为 osg::StateAttribute 和 osg::NodeVisitor 指针 - 本例修改 osg::Material 内 Diffuse 的 alpha 值, osg::Material 从 osg::StateAttribute 指针而来 - osg::StateAttribute 可以设置更新回调 - osgAnimation::InOutCubicMotion - 本例使用 update 更新, 使用 getValue 获取其值 - 类型别名 osgAnimation::MathMotionTemplate - 结构体 MathMotionTemplate 派生自 osgAnimation::Motion - osgAnimation::Motion - 纯基类函数 getValueInNormalizedRange, 第一个参数是时间比例(当前时间/总时间),第二个参数为返回的结果 - MathMotionTemplate 重写了函数 getValueInNormalizedRange, 调用了模板类的 getValueAt 函数 - 结构体 InOutCubicFunction 重写了 getValueAt 函数, 三次方来回运动 * 08_Flashing - 设置连续图像动画, 使用 osg::ImageSequence - addImage() --- 添加图像 - setLength() --- 设置时间长度 - play() --- 播放 - 可以学会如何创建 osg::Image - allocateImage 分配内存 - data() 某一行列的数据指针 - osg::Texture2D 纹理 - setImage() 目标可以是 osg::ImageSequence * 08_GeometryDynamically - 通过更新回调更改一个几何体, 该回调为 osg::Drawable::UpdateCallback 的派生类 - 同时演示了 osg::Drawable 的更新回调, 其更新回调重写的是 update() 函数 - 更新几何数组后调用函数 osg::Geometry::dirtyDisplayList() 和 osg::Geometry::dirtyBound() 更新显示列表和围绕盒 * 08_SwitchUpdate - 通过更新回调切换Switch节点子节点的状态 * 09_DrivingCessna - osg::Camera - setAllowEventFocus() 是否允许其关联窗口产生的事件影响到该相机 - setViewMatrixAsLookAt() 设置视图矩阵 - osgViewer::Viewer - addEventHandler() 添加事件处理(处理窗口事件) - osgGA::GUIEventHandler 派生窗口事件处理类 - 重写 bool handle() 函数 - osgGA::GUIEventAdapter 获取键盘鼠标事件 * 09_GCTraits - osg::GraphicsContext::Traits 创建一个 traits - osg::GraphicsContext::createGraphicsContext 使用该 traits 创建一个窗口 osg::GraphicsContext - osg::Camera 创建一个相机 - setGraphicsContext 设置其窗口上下文 - setProjectionMatrixAsPerspective 设置投影矩阵 - osgViewer::Viewer - setCamera 设置相机 * 09_PickingGeometry --- 选择框 - 展示了如何创建选择框 - 线框,禁光照, 矩阵变换节点 - 通过矩阵变换绘制和移动线框 - 鼠标点击创建框框, 通过 MatrixTransform 实现 - NodeMask 的使用 - 本例使用相机接受相交访问器(osgUtil::IntersectionVisitor) - 鼠标点击相交检测 - osgUtil::IntersectionVisitor 访问, 使用相机 accept 调用该 visitor - osg::computeLocalToWorld 计算矩阵 * 09_UserTimer --- 可以添加一个用户事件 - 本例是在 Frame 事件中添加用户事件 - osgGA::GUIEventAdapter::FRAME 可以处理帧事件 - viewer->getEventQueue()->userEvent() --- 添加一个用户事件 * 09_Win32Handler --- Win32 API 和 osg - WM_CREATE 事件创建一个 osgViewer 而后用线程推进 - 设置 traits->inheritedWindowData = windata(为窗口句柄) * 10_CustomFormat --- 自定义格式插件读写 - 派生自 osgDB::ReaderWriter - REGISTER_OSGPLUGIN 宏注册 * 11_Billboard 公告板 - osg::Billboard - setMode: osg::Billboard::POINT_ROT_EYE - addDrawable: 添加一个可绘制对象, 因为 Billboard 派生自 osg::Geode * 11_Outline 给物体添加轮廓线效果. - osgFX::Outline - setWidth - setColor - addChild * 11_ParticleSystem 粒子系统 - osgParticle::ParticleSystem - osg::PointSprite - osgParticle::RandomRateCounter - osgParticle::ModularEmitter - osgParticle::AccelOperator - osgParticle::ModularProgram * 11_Shadow 阴影效果 - osg::Node - setNodeMask() --- 设置节点的 Mask - osg::AnimationPathCallback 动画路径回调 - setAnimationPath() --- 设置动画路径 - osg::LightSource 光源 - getLight() - osgShadow::ShadowMap - setLight - setTextureSize - setTextureUnit - osgShadow::ShadowedScene 这是一个节点 - setShadowTechnique 设置阴影技术 - setReceivesShadowTraversalMask 设置阴影接受 mask - setCastsShadowTraversalMask 设置阴影投射 mask * 11_Text 输出文字 - osg::Camera - 设置投影矩阵 - 创建 HUD 相机用于绘制文本 - osgText::Text - setFont - setCharacterSize - setAxisAlignment - setPosition * 11_Text3D --- 3D 字体, 当成一个 3D 模型 - osgText::Text3D - setFont - setCharacterSize - setCharacterDepth - setAxisAlignment - setPosition - setText * 12_MultiThread --- 多线程程序 - 本例演示键盘输入, 屏幕显示输入内容. - OpenThreads::Thread 派生一个线程类 - OpenThreads::Mutex 互斥信号 - OpenThreads::ScopedLock 锁 - OpenThreads::startThread --- 开启线程 - osgText::Text - setText: 设置文本 * 12_Occluder - osg::OccluderNode 派生自 osg::Group, 主要用于提供钩子添加 ConvexPlanarOccluders 至场景中. - setOccluder(): 添加一个 ConvexPlanarOccluder - osg::ConvexPlanarOccluder 其内有 ConvexPlanarPolygon& - osg::ConvexPlanarPolygon - add 添加顶点 - 只需要把 OccluderNode 添加至场景就可以实现遮挡 * 12_QuadTree --- 使用 pageLOD 创建四叉树 - osg::HeightField 派生自 osg::Shape - setSkirtHeight 设置边裙高度 - setOrigin 设置原点,这里设置左下角为原点 - setHeight - setXInterval, setYInterval - osg::PagedLOD - insertChild - setFileName - setCenterMode - setCenter - setRadius - setRange * 12_SharingTexture - 当读写图像文件时, 如果之前已经读取则不用再次访问硬盘, 直接从内存中获取. - osgDB::Registry::instance()->setReadFileCallback() 设置读文件回调 - osgDB::ReadFileCallback 读文件回调类, 重写 readImage 函数 - osgDB::Registry::instance()->readImageImplementation 调用底层的实现 - osgDB::Registry::instance()->getOrCreateSharedStateManager 创建共享状态管理器 - osgDB::SharedStateManager - share * 12_ThreadingModel - osgViewer::ViewerBase::ThreadingModel 线程模型 - osgViewer::ViewerBase::AutomaticSelection - osgViewer::ViewerBase::SingleThreaded - osgViewer::ViewerBase::ThreadPerContext - osgViewer::ViewerBase::ThreadPerCamera - osgViewer::CompositeViewer - addView 添加多个 View - setThreadingMode --- 设置线程模式