osg示例解析之osgLight(1)

OSG Examples(osgintersection)解析 OSG Examples(osgintersection)解析 效果 本例子主要是讲解在osg中怎么使用线相交(LineSegmentIntersector),来计算与地形等具有lod以及pagelod功能节点的交点。对于普通节点的相交计算使用LineSegmentIntersector就可以得到所有的交点信息,但是对于具有lod功能的节点普通的线相交计算只能计算到与当前lod等级的节点的交点信息,更高lod等级的更加精确的交点信息是得不到的。Osg为了提供类似的功能,在osgSim中定义了几种特. 阅读详情

1. 简介

osgLight示例演示了osg如何使用光照。

2. 描述

首先看一下osgLight的运行效果图,如下图所示:
osgLight

3. 创建立方体

3.1 绘制一个面

首先是创建场景中的立方体,在创建中需要创建立方体的每一个面,实现在函数 createWall中,createWall的函数原型如下

osg::Geometry* createWall(const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3,osg::StateSet* stateset)

调用它的代码如下所示:

    // create front side.
    geode->addDrawable(createWall(bb.corner(0),
                                  bb.corner(4),
                                  bb.corner(1),
                                  wall));

可以知道它是通过某个节点的包围盒来创建的,那么包围盒的corner分别是哪些点呢?也就是说这里的corner(0)到corner(7)分别指的是包围盒的哪些。查看源码可以得知:

//BoundingBox源码
inline const vec_type corner(unsigned int pos) const
{
 return vec_type(pos&1?_max.x():_min.x(),pos&2?_max.y():_min.y(),pos&4?_max.z():_min.z());
}

也就是说corner(0)到corner(7)遵循x、y、z从小到大排列,同时x优先y优先z的顺序,具体来说corner(0-7)如下图所示:

Corner顺序

通过上图以及createWall被调用的情况(前面是 0、4、1),我们可以知道该函数 createWall中的前三个参数 v1、v2、v3分别指的是一个四边形的 左下点、左上点和右下点。(如果这点不清除那么代码阅读起来会有很大的障碍)通过阅读createWall的代码可以知道,该函数主要是用来绘制立方体的一个面,这个面被细分成100x100个四边形小方格来绘制。

3.2 绘制立方体

通过6个面的绘制组装成一个立方体,立方体绘制的代码如下:

    osg::StateSet* rootStateSet = new osg::StateSet;
    root->setStateSet(rootStateSet);

    osg::StateSet* wall = new osg::StateSet;
    wall->setMode(GL_CULL_FACE,osg::StateAttribute::ON);

    osg::StateSet* floor = new osg::StateSet;
    floor->setMode(GL_CULL_FACE,osg::StateAttribute::ON);

    osg::StateSet* roof = new osg::StateSet;
    roof->setMode(GL_CULL_FACE,osg::StateAttribute::ON);

    osg::Geode* geode = new osg::Geode;

    // create front side.
    geode->addDrawable(createWall(bb.corner(0),
                                  bb.corner(4),
                                  bb.corner(1),
                                  wall));

    // right side
    geode->addDrawable(createWall(bb.corner(1),
                                  bb.corner(5),
                                  bb.corner(3),
                                  wall));

    // left side
    geode->addDrawable(createWall(bb.corner(2),
                                  bb.corner(6),
                                  bb.corner(0),
                                  wall));
    // back side
    geode->addDrawable(createWall(bb.corner(3),
                                  bb.corner(7),
                                  bb.corner(2),
                                  wall));

    // floor
    geode->addDrawable(createWall(bb.corner(0),
                                  bb.corner(1),
                                  bb.corner(2),
                                  floor));

    // roof
    geode->addDrawable(createWall(bb.corner(6),
                                  bb.corner(7),
                                  bb.corner(4),
                                  roof));

绘制六个面(设置了面的拣选,让背面被剔除掉),这些面绘制顺序是让背面朝向外,设置之后可以看到立方体内部。

3.3 绘制光源

场景中的光源绘制是在createLights函数中完成的,这个函数绘制了两个光源,一个光源固定在立方体的左上角(corner(4))的位置,另一个光源是一个移动的光源,移动的路径是立方体的8个角点组成的。

3.4 模型动画

osgLight中添加了一个模型,通过该模型计算出一个包围盒,模型中添加了动画效果,主要是通过ModelTransformCallback实现的。实现如下:

class ModelTransformCallback : public osg::NodeCallback
{
    public:

        ModelTransformCallback(const osg::BoundingSphere& bs)
        {
            _firstTime = 0.0;
            _period = 4.0f;
            _range = bs.radius()*0.5f;
        }

        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
        {
            osg::PositionAttitudeTransform* pat = dynamic_cast<osg::PositionAttitudeTransform*>(node);
            const osg::FrameStamp* frameStamp = nv->getFrameStamp();
            if (pat && frameStamp)
            {
                if (_firstTime==0.0)
                {
                    _firstTime = frameStamp->getSimulationTime();
                }

                double phase = (frameStamp->getSimulationTime()-_firstTime)/_period;
                phase -= floor(phase);
                phase *= (2.0 * osg::PI);

                osg::Quat rotation;
                rotation.makeRotate(phase,1.0f,1.0f,1.0f);

                pat->setAttitude(rotation);

                pat->setPosition(osg::Vec3(0.0f,0.0f,sin(phase))*_range);
            }

            // must traverse the Node's subgraph
            traverse(node,nv);
        }

        double _firstTime;
        double _period;
        double _range;
};

主要是修改位置姿态节点osg::PositionAttitudeTransform类,该类与osg::MatrixTransform类似,主要区别在于osg::PositionAttitudeTransform比较直观,通过设置缩放、平移量和旋转实现。它的矩阵 Matrix = SRT(顺序是缩放、旋转、平移),在NodeCallback中一直去修改平移和旋转实现动画的效果。

osg::MatrixTransform和osg::PositionAttitudeTransform的几点区别:
1. osg::MatrixTransform按照我们给的顺序组合各种变换,比如我们先定义平移、在定义旋转和缩放,那么MatrixTransform的矩阵是
M = TRS,也就是所它会严格按照我们指定的顺序执行操作。指定的顺序不同时产生的结果差异巨大。
2. osg::PositionAttitudeTransform同时几个接口来获得平移、旋转和缩放矩阵,分别是:

1.setPosition指定平移量
2.setAttitude指定旋转量
3.setScale指定缩放量

不管我们设置的顺序如何,它的结果矩阵M=SRT(先缩放再旋转最后平移)总是按固定的顺序进行。除此之外osg::PositionAttitudeTransform还可以设置旋转和缩放的轴心位置(一般来说旋转和缩放是以原点为轴心进行的),但是PositionAttitudeTransform提供了让我们以其他位置为轴心进行旋转和缩放。

  1. 如果我们想用MatrixTranform实现与PositionAttitudeTransform同样的效果,那么就必须设置三个矩阵相乘的顺序是SRT。如果PositionAttitudeTransform设置了轴心位置,那么在作平移和旋转变换的时候还需要注意应该先平移到轴心位置,再旋转(和缩放),再平移回去。
OSG编程指南<十七>:OSG光照与材质 OSG光照与材质:设定环境光和聚光灯示例 阅读详情

相关推荐

OSG 光照效果(一)

OSG 光照效果(一)

dayuhaitang1的博客 620

osglight解析

<br /><br />osglight解析如下: <br />// callback to make the loaded model oscilate up and down.<br />class ModelTransformCallback : public osg::NodeCallback<br />{<br />    public:<br />        ModelTransformCallback(const osg::BoundingSphere& bs)<br />       

tmljs1988的专栏 3589

OSG Example(osg的例子程序代码)

编译好的osg的所有例子的原程序 希望对大家有用

快速学习OSG(5)——light-聚光灯

light

weixin_56464957的博客 1067

从零部署奥比中光Gemini335L:Python SDK编译与手眼标定环境实战

本文提供了一份从零部署奥比中光Gemini 335L深度相机的完整实战指南。详细介绍了驱动安装、Python SDK编译、CMake配置及虚拟环境搭建等关键步骤,并重点解析了如何通过编译生成Python模块,最终实现深度图与点云数据获取,为后续的机械臂手眼标定工作奠定坚实基础。

weixin_29031161的博客 398

FreeRTOS移植实战:从零开始在STM32上搭建多任务系统(含Proteus仿真配置)

本文详细介绍了如何在STM32平台上从零开始移植FreeRTOS,并搭建多任务系统,包含Proteus仿真配置。通过环境准备、源码移植、多任务设计到仿真调试的全流程实战,帮助开发者快速掌握FreeRTOS在STM32上的应用技巧,提升嵌入式开发效率。

weixin_33737134的博客 232

OSG学习:纹理映射(七)——聚光灯

以下内容来自:  1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社  2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社 3、自己的总结 下载完整工程OSG_15_TextureSpotLight 创建C++项目后,首先需要配置OSG环境,具体步骤看OSG学习:WIN10系统下OSG+VS2017编译及...

韶光 2088

rfid标签技术原理

奇怪的是,RFID标签技术原理的深入剖析不仅揭示了其背后的奥秘,也让我们更加全面地认识到这一技术在数字化转型中的重要性和潜力。随着技术的不断进步和应用场景的不断拓展,RFID标签将在更多领域发挥重要作用,为物联网、智能制造等领域的发展注入新的活力。这意味着在一个读写器的覆盖范围内,可以同时读取多个RFID标签的数据,大大提高了数据收集的速度和效率。:RFID标签的“大脑”,负责存储和处理数据。芯片内部集成了存储器、控制逻辑和射频接口等电路,能够接收来自读写器的射频信号,执行相应的数据处理和通信任务。

x3088的博客 2159

快速学习OSG(2)——光照

三分钟学习OSG光照

weixin_56464957的博客 3061

文石NoteX3国行版安装 Google Play经验分享

文石NoteX3国行版安装 Google Play经验分享。

2301_80693261的博客 7603

Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南

本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。

yolo5detector的博客 272

第三节:闪电特效

大家好,上一节我们学习了如何给鱼身上加上波光的效果。这一节,我们将学习如何制作攻击时的闪电特效。 《捕鱼达人》中的闪电,是通过以下几个步骤来实现的: 一、构建三角形条带。 二、采用随机函数来扰动条带顶点。 三、快速反复循环一,二步骤。 这个过程主要使用到以下三个类: (1)VertexVector:用于存储顶点和索引的类。 (2)N

xuehaiwuya_1的专栏 1782

Python量化- Black-Litterman 模型

​​​​​​​Black-Litterman 模型由 Fischer Black 和 Robert Litterman 于 1992 年开发,采用贝叶斯方法进行资产配置。该模型通过结合先前的回报估计(可以从多个来源得出)并结合投资者对未来回报的独特预期来优化分配权重。

探索人工智能领域 1030

osg - 光照

osg osg::Light 光源 osg::LightSource 简单光源 osg::SpotLight 聚光灯 代码示例

liangfei868的博客 2282

从零开始学习AI人工智能本体论:概念与实战

本文旨在为初学者提供一个全面而易于理解的人工智能本体论入门指南。我们将覆盖从基本概念到实际应用的全过程,帮助读者理解本体论在AI系统中的核心作用。核心概念与联系:介绍本体论的基本概念和原理核心算法与操作步骤:详细讲解本体构建和推理方法项目实战:通过实际案例展示本体论的应用实际应用场景:探讨本体论在不同领域的应用未来发展趋势:展望本体论在AI领域的前景本体论(Ontology): 在AI中,指对特定领域概念及其关系的明确形式化描述。

AI智能探索者的博客 868

LIN协议V2.2A版介绍

IN 协议规范2.2A 版(2010 年 12 月发布)是面向低成本汽车网络的标准,核心采用单主多从架构,支持最高20kbit/s速率,通过单总线实现通信;定义了完整的协议栈(含协议层、传输层、物理层等),规定了帧结构(含 Break 字段、Sync 字节、保护标识符 PID、数据字段、校验和)、5 类帧类型(无条件帧、事件触发帧等)及调度表机制以保障确定性传输;

qflook的博客 319

移动端天气系统--【下雨】效果之【雷电】的实现和分析

文章目录一、环境二、方案对比三、思路概述四、关键技术点五、效果优化六、性能优化七、遇到的问题八、参考 文章较长,建议跳到感兴趣的部分阅读,转载请标明出处。 一、环境 Win/Android/iOS,Unity3D 二、方案对比   j基于分型图形学的方法   基于特效的方法 三、思路概述   L System的应用,解决重合位置的亮度问题,怎么产生分支,怎么形成曲折,其他配合要素 闪电,声音 ...

u013229693的博客 2211

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

利用OSG实现发光的效果(blooming)

详细实现可见: 利用OSG实现发光的效果(blooming)

searobbers_duck的博客 2166

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

osg示例解析之osgcamera(1)

osgcamera示例的解析

Frank的专栏 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

osgEarth示例分析——osgerth_mrt

osgearth_mrt示例,展示了一个带呼吸灯光环的地球,点击地球,会获取到一些视点信息。

优快云的博客 1244

OSG的例子分析:osgAnimate

http://hi.baidu.com/mjting/blog/item/109a506083ff244ceaf8f8f0.html美国海军研究生学校教程 http://faculty.nps.edu/jasullivan/osgTutorials/index.htm/* OpenSceneGraph example, osganimate.** Permission is hereby

杨德龙的专栏 3230

osg绘制立方体

#include <iostream> #include <osgViewer/Viewer> #include <osg/Node> //#include <osgDB/ReadFile> //#include <osgDB/WriteFile> #include <osgUtil\Optimizer> #include <osg/Geode> #include <osg/Group> #include &

我不是码农的博客~~~ 1587

OSG 学习第四天:光照

OSG 光照 1、osg::Light OSG将OpenGL中的glLight()作了一个light状态的类封装,用于保存灯光的模式与属性参数信息。 osg::Light类派生自osg::StateAttribute类,继承了对模式与属性参数信息的操作接口。 2.osg::LightSource osg::Light

MissXy_的博客 4364

OSG灯光

在场景中增加光源是很简单的,光源在OSG中被当做渲染的节点。必须注意的是物体有发现才能对灯光进行响应,灯光对没有法线的物体是没有效果的。      在场景中加入灯光的顺序一般如下,首先创建一个osg::Light类,然后指定灯光的位置,以及相关的衰减参数,没有衰减的灯光将会照亮场景中的每一个角落,没有纹理的模型全部渲染成灯光的颜色;创建osg::Light之后,创建一个LihghtSource类

wzh-whu 5209

OSG粒子系统特效-----雨雪、爆炸、烟雾

OSG粒子系统特效-----雨雪、爆炸、烟雾

欧特GO 1630
上一篇: OpenGL API 之 glTexEnv
下一篇: OpenGL基本图元转换为GL_TRIANGLES
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值