当前位置: 首页 > wzjs >正文

网络营销乐云seo广州市网络seo外包

网络营销乐云seo,广州市网络seo外包,凡科论文送审平台,广州卓天跨境电商网站今天课程分为两部分,第一部分我们学习一下Scene Graph理论知识,第二部分我们熟悉下OSG的源码。 第一部分(Scene Graph) 在OpenSceneGraph中,场景图(Scene Graph)通过树状层级结构高效管理3D对…

在这里插入图片描述
今天课程分为两部分,第一部分我们学习一下Scene Graph理论知识,第二部分我们熟悉下OSG的源码。

第一部分(Scene Graph)

在OpenSceneGraph中,场景图(Scene Graph)通过树状层级结构高效管理3D对象。

场景图(Scene Graph)层级关系

以下是根节点、组节点和几何节点(Geode)的核心概念及层级关系:

根节点 (osg::Group)
│
└── 变换组节点 (osg::PositionAttitudeTransform)│├── 几何节点1 (osg::Geode) → 包含立方体│└── 子组节点 (osg::Group)│└── 几何节点2 (osg::Geode) → 包含球体

根节点(Root Node)

作用:场景图的顶层入口,所有其他节点均为其子孙节点。
类型:通常是osg::Group或osgViewer::Viewer关联的根节点。
特性

  • 无父节点。
  • 作为场景遍历的起点,渲染时从根节点开始递归处理子节点。

组节点(Group Node)

作用:组织子节点,构建层次结构。支持嵌套,用于组合变换、状态或逻辑分组。
类型:基类为osg::Group,扩展类型包括osg::Transform(变换节点)、osg::Switch(开关节点)、osg::LOD(细节层次节点)等。
特性
通过addChild()方法添加子节点(其他组节点或Geode)。

  • 示例:一个“汽车”组节点可包含“车轮”、“车身”等子组节点,每个子组可进一步细分。

几何节点(Geode)

作用:叶子节点,保存实际几何数据(如顶点、法线、纹理坐标)。
类型:osg::Geode(Geometry Node)。
特性

  • 无子节点,通过addDrawable()添加osg::Drawable对象(如osg::Geometry)。
  • 示例:一个Geode节点可包含立方体或球体的几何数据。

看的是不是云里雾里的,伟大的圣人王阳明说过,要知行合一,所以下面我们通过代码来实践。

代码实例

scene_graph.cpp

#include <osg/Geode>
#include <osg/Group>
#include <osg/ShapeDrawable>
#include <osgViewer/Viewer>
#include <osg/Material>
#include <osg/StateSet>int main()
{// 创建根节点osg::ref_ptr<osg::Group> root = new osg::Group();// 创建第一个组节点(红色方块组)osg::ref_ptr<osg::Group> redGroup = new osg::Group();// 创建第一个几何节点(红色方块)osg::ref_ptr<osg::Geode> geode1 = new osg::Geode();geode1->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(-2,0,0), 1.0f)));geode1->getOrCreateStateSet()->setAttribute(new osg::Material());osg::Material* material1 = dynamic_cast<osg::Material*>(geode1->getStateSet()->getAttribute(osg::StateAttribute::MATERIAL));if (material1){material1->setDiffuse(osg::Material::FRONT, osg::Vec4(1,0,0,1)); // 红色}// 创建第二个组节点(蓝色方块组)osg::ref_ptr<osg::Group> blueGroup = new osg::Group();// 创建第二个几何节点(蓝色方块)osg::ref_ptr<osg::Geode> geode2 = new osg::Geode();geode2->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(2,0,0), 1.0f)));geode2->getOrCreateStateSet()->setAttribute(new osg::Material());osg::Material* material2 = dynamic_cast<osg::Material*>(geode2->getStateSet()->getAttribute(osg::StateAttribute::MATERIAL));if (material2){material2->setDiffuse(osg::Material::FRONT, osg::Vec4(0,0,1,1)); // 蓝色}// 构建场景图层级关系root->addChild(redGroup);    // 根节点包含红色组root->addChild(blueGroup);   // 根节点包含蓝色组redGroup->addChild(geode1);  // 红色组包含几何体1blueGroup->addChild(geode2); // 蓝色组包含几何体2// 创建查看器并设置场景数据osgViewer::Viewer viewer;viewer.setSceneData(root.get());return viewer.run();
}

代码都有注释,还是很好理解的。

接下来就是编译文件CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
project(OSG_SceneGraph_Demo)# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找OpenSceneGraph核心组件
find_package(OpenSceneGraph REQUIRED COMPONENTS osg          # 核心库osgDB        # 文件读写osgViewer    # 查看器功能osgGA        # 图形上下文osgUtil      # 工具库
)# 包含头文件路径
include_directories(${OPENSCENEGRAPH_INCLUDE_DIR}
)# 创建可执行文件
add_executable(${PROJECT_NAME} scene_graph.cpp)# 链接OpenSceneGraph库
target_link_libraries(${PROJECT_NAME}${OPENSCENEGRAPH_LIBRARIES}# Windows需要额外链接$<$<PLATFORM_ID:Windows>:OpenThreads>
)# 配置调试模式
if(CMAKE_BUILD_TYPE STREQUAL "Debug")target_compile_definitions(${PROJECT_NAME} PRIVATE DEBUG)message(STATUS "Building in DEBUG mode")
endif()

运行效果

请添加图片描述

第二部分(源码解析)

看完了上面的实例,我们来看下源码的执行。

从上面代码我们可以看到,最后都是要走到view类的run函数。

我们来看下这个函数都干了什么?

我这里下载的是OpenSceneGraph-3.2.3版本。

首先找到源码的Viewer (OsgViewer/osgViewer.cpp)类:

int Viewer::run()
{if (!getCameraManipulator() && getCamera()->getAllowEventFocus()){setCameraManipulator(new osgGA::TrackballManipulator());}setReleaseContextAtEndOfFrameHint(false);return ViewerBase::run();
}

这里实现和简单就是跳转了ViewerBase::run().

继续跟踪分析:

int ViewerBase::run()
{
......while(!done() && (run_frame_count_str==0 || getViewerFrameStamp()->getFrameNumber()<runTillFrameNumber)){.......frame();.......}return 0;
}

最后就执行到了ViewerBase::frame()函数。

进入这个函数我们看下它主要干了啥。

void ViewerBase::frame(double simulationTime)
{if (_done) return;// OSG_NOTICE<<std::endl<<"CompositeViewer::frame()"<<std::endl<<std::endl;if (_firstFrame){viewerInit();if (!isRealized()){realize();}_firstFrame = false;}advance(simulationTime);eventTraversal();updateTraversal();renderingTraversals();
}

我们一个一个来分析:

第一步:初始化
    if (_firstFrame){viewerInit();if (!isRealized()){realize();}_firstFrame = false;}

viewerInit(): 初始化相机、场景等核心组件。

realize(): 创建原生窗口并绑定 OpenGL 上下文(若未就绪)。

如果这是仿真系统启动后的第一帧,则执行viewerInit();此时如果还没有执行realize()函数,则执行它。

第二步:推进场景状态
    advance(simulationTime);

作用:调用场景中所有节点的 advance() 方法。
参数:simulationTime 通常表示逻辑时间(用于动画/物理模拟)。

第三步:事件处理
eventTraversal();

从窗口系统获取输入事件(键盘、鼠标等)。
通过 osgGA::EventQueue 分发事件。
触发事件处理器(osgGA::EventHandler)的回调。

第四步:场景更新
updateTraversal();

调用所有节点的 update() 回调。
更新场景图状态(位置变化、LOD切换等)。
执行 osg::NodeCallback 自定义更新逻辑。

第五步: 渲染遍历
renderingTraversals();

核心步骤:

裁剪(Cull):确定可见对象,生成渲染列表。
绘制(Draw):提交 OpenGL 命令到 GPU。
交换缓冲区:显示渲染结果(swapBuffers())。

嗯~,今天的学习需要消化消化,下课,明天见。_

参考文献

《最长的一帧》王锐(array)

在这里插入图片描述


文章转载自:

http://eZU8oLy2.pjrqL.cn
http://IlVRNPqV.pjrqL.cn
http://TUF7BM3I.pjrqL.cn
http://cxNinvOK.pjrqL.cn
http://3F5SqmbH.pjrqL.cn
http://dJkOsIXj.pjrqL.cn
http://52gu78YK.pjrqL.cn
http://O8Sd0zrf.pjrqL.cn
http://Hkk1XYyG.pjrqL.cn
http://5Nwb0aTO.pjrqL.cn
http://zLca9hzn.pjrqL.cn
http://Q5LxRKJF.pjrqL.cn
http://2FdOzsKB.pjrqL.cn
http://T23kPjri.pjrqL.cn
http://gZlOhPk1.pjrqL.cn
http://H3xmL8Er.pjrqL.cn
http://FZev5u6l.pjrqL.cn
http://htMI9l9n.pjrqL.cn
http://fFuQgGMg.pjrqL.cn
http://4Xko53Sd.pjrqL.cn
http://HsJgetXa.pjrqL.cn
http://ySD0ue8l.pjrqL.cn
http://FZfNUanL.pjrqL.cn
http://H9VB5hWm.pjrqL.cn
http://emZq2fyY.pjrqL.cn
http://1yi8qK0i.pjrqL.cn
http://rlu3WsKm.pjrqL.cn
http://btVDJdzT.pjrqL.cn
http://jh3v9MmJ.pjrqL.cn
http://mcU7DPJN.pjrqL.cn
http://www.dtcms.com/wzjs/729792.html

相关文章:

  • 服装网站建设的规划学校网站源码html
  • 亚网站建设2021国内最好用免费建站系统
  • 建同城购物网站经历成都商城网站制作
  • 创意灵感的网站沧州 网站建设
  • 宿迁市建设局网站首页小型网站开发要多少钱
  • 企业网站的建设的功能定位长沙装饰公司
  • 哪种网站开发简单net域名做企业网站怎么样
  • 免费建设网站入驻wordpress导航栏制作
  • 旅游网站设计参考文献wordpress+本地编辑
  • 织梦小说网站源码一对一专属定制方案
  • 响应式网站的制作工具室内装修设计书籍
  • php简单企业网站源码网页制作网站素材
  • 北京做网站的装修设计公司组织架构图
  • 成都网站建设优化企业排名中国建设银行信用卡中心官网
  • 贵州省建设厅官方网站电话wordpress 培训机构
  • 做a 免费网站有哪些企业网站建设需求
  • 保定网站建设公司g4560做网站服务器
  • 建网站的过程太原网站建设哪家好
  • 太仓网站开发建设服务网站建设技术优势
  • 龙华建设网站公司安徽工程建设发展有限公司
  • 绩效考核表 网站建设做网页怎么在网站播放视频
  • 建一个营销网站多少钱做暖暖欧美网站
  • 做网站费用入什么科目石家庄招聘求职信息网
  • 网站建设云主机云服务器做网站怎建立ftp和数据库
  • 网站做服装那个平台好一点wordpress反爬虫插件
  • 房地产公司网站源码河源网站制作
  • 多语言外贸企业网站源码上海网站搭建公司哪家好
  • 网站怎么自适应屏幕大小淘宝客的优惠卷网站怎么做的
  • 长春做网站外包免费简历制作app
  • 方一凡和磊儿做家教的网站安庆网络推广和竞价