- 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
- Geometry
- 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 --- 显示的时候再加载
- osg::ProxyNode
- 05_SwitchAnimate
- osg::Switch
- setValue 设置可见性
- 重写 osg::Switch::traverse 方法, 其在各种遍历会调用, 如更新遍历, 剔除遍历
- 本例通过遍历次数实现动画
- osg::Switch
- 05_SwitchNode
- osg::Switch
- addChild 方法
- osg::Switch
- 05_TranslateNode
- osg::MatrixTransform
- setMatrix
- osg::Matrix::translate
- osg::MatrixTransform
- 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
- Fog 的使用
- 06_Lighting
- 创建 osg::LightSource --- 光源实体
- 创建 osg::Light --- 光源属性
- setLight
- setLightNum --- 设置光源序号
- 将 LightSource 添加至场景中
- 创建 osg::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<osg::Texture*>(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() --- 应用上面动画列表中的一个动画
- osgAnimation::BasicAnimationManager --- 派生自更新回调
- 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 的名字一样
- 这是一个节点更新回调, 之前播放动画的时候, 会更新其内的频道值, 而这些频道值则会更新上面容器内的值.因此更新了该类关联的变换矩阵
- getStackedTransforms()
- 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 函数
- osgAnimation::Motion
- 结构体 InOutCubicFunction 重写了 getValueAt 函数, 三次方来回运动
- 08_Flashing
- 设置连续图像动画, 使用 osg::ImageSequence
- addImage() --- 添加图像
- setLength() --- 设置时间长度
- play() --- 播放
- 可以学会如何创建 osg::Image
- allocateImage 分配内存
- data() 某一行列的数据指针
- osg::Texture2D 纹理
- setImage() 目标可以是 osg::ImageSequence
- 设置连续图像动画, 使用 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 获取键盘鼠标事件
- 重写 bool handle() 函数
- osg::Camera
- 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
- osg::Billboard
- 11_Outline 给物体添加轮廓线效果.
- osgFX::Outline
- setWidth
- setColor
- addChild
- osgFX::Outline
- 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
- osg::Node
- 11_Text 输出文字
- osg::Camera
- 设置投影矩阵
- 创建 HUD 相机用于绘制文本
- osgText::Text
- setFont
- setCharacterSize
- setAxisAlignment
- setPosition
- osg::Camera
- 11_Text3D --- 3D 字体, 当成一个 3D 模型
- osgText::Text3D
- setFont
- setCharacterSize
- setCharacterDepth
- setAxisAlignment
- setPosition
- setText
- osgText::Text3D
- 12_MultiThread --- 多线程程序
- 本例演示键盘输入, 屏幕显示输入内容.
- OpenThreads::Thread 派生一个线程类
- OpenThreads::Mutex 互斥信号
- OpenThreads::ScopedLockOpenThreads::Mutex 锁
- OpenThreads::startThread --- 开启线程
- osgText::Text
- setText: 设置文本
- 12_Occluder
- osg::OccluderNode 派生自 osg::Group, 主要用于提供钩子添加 ConvexPlanarOccluders 至场景中.
- setOccluder(): 添加一个 ConvexPlanarOccluder
- osg::ConvexPlanarOccluder 其内有 ConvexPlanarPolygon&
- osg::ConvexPlanarPolygon
- add 添加顶点
- 只需要把 OccluderNode 添加至场景就可以实现遮挡
- osg::OccluderNode 派生自 osg::Group, 主要用于提供钩子添加 ConvexPlanarOccluders 至场景中.
- 12_QuadTree --- 使用 pageLOD 创建四叉树
- osg::HeightField 派生自 osg::Shape
- setSkirtHeight 设置边裙高度
- setOrigin 设置原点,这里设置左下角为原点
- setHeight
- setXInterval, setYInterval
- osg::PagedLOD
- insertChild
- setFileName
- setCenterMode
- setCenter
- setRadius
- setRange
- osg::HeightField 派生自 osg::Shape
- 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 --- 设置线程模式
- osgViewer::ViewerBase::ThreadingModel 线程模型