4.用三维引擎为球增加光照(代码+解析)

举报
无敌清风蓝 发表于 2023/11/30 09:06:05 2023/11/30
【摘要】 1.源码#include <osgViewer/Viewer>#include <osg/Geode>#include <osg/ShapeDrawable>#include <osg/Texture2D>#include <osgDB/ReadFile>#include <osg/Light>#include <osg/LightSource>int main(){ // 创建一个...

1.源码

#include <osgViewer/Viewer>
#include <osg/Geode>
#include <osg/ShapeDrawable>
#include <osg/Texture2D>
#include <osgDB/ReadFile>
#include <osg/Light>
#include <osg/LightSource>

int main()
{
    // 创建一个Viewer对象
    osgViewer::Viewer viewer;

    // 创建一个用于绘制形状的Geode节点
    osg::ref_ptr<osg::Geode> geode = new osg::Geode();

    // 创建一个球体,设置其半径为1.0
    osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3(), 1.0);

    // 创建一个ShapeDrawable对象,将球体添加到其中
    osg::ref_ptr<osg::ShapeDrawable> shapeDrawable = new osg::ShapeDrawable(sphere.get());

    // 设置ShapeDrawable的颜色
    shapeDrawable->setColor(osg::Vec4(1.0, 0.0, 0.0, 1.0)); // 红色

    // 将ShapeDrawable添加到Geode节点
    geode->addDrawable(shapeDrawable.get());

    // 创建一个光源
    osg::ref_ptr<osg::Light> light = new osg::Light();
    light->setLightNum(0); // 设置光源编号
    light->setPosition(osg::Vec4(0.0, 0.0, 0.0, 1.0)); // 设置光源位置
    light->setAmbient(osg::Vec4(0.2, 0.2, 0.2, 1.0)); // 设置环境光颜色
    light->setDiffuse(osg::Vec4(0.8, 0.8, 0.8, 1.0)); // 设置漫反射光颜色

    // 创建一个光源节点,并将光源添加到其中
    osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource();
    lightSource->setLight(light.get());

    // 将光源节点添加到场景图中
    viewer.setSceneData(lightSource.get());

    // 将Geode节点添加到光源节点中
    lightSource->addChild(geode.get());

    // 开始渲染循环
    return viewer.run();
}

2.说明

2.1综述

在这个示例中,我们添加了一些新的代码来创建和设置光源。首先,我们创建了一个新的osg::Light对象,并设置了它的编号、位置、环境光颜色和漫反射光颜色。然后,我们创建了一个新的osg::LightSource对象,并将光源添加到了其中。最后,我们将osg::LightSource对象添加到了场景图中,并将osg::Geode节点添加到了osg::LightSource节点中。

2.2为什么添加光照后反而更暗了

在添加光照后,球体看起来更暗可能是因为光照的设置。在我们的示例中,我们设置了环境光颜色为(0.2, 0.2, 0.2, 1.0),漫反射光颜色为(0.8, 0.8, 0.8, 1.0)。环境光是无论何时都存在的光照,而漫反射光则是从光源直接反射到眼睛的光照。如果环境光和漫反射光的颜色都比较暗,那么物体就会看起来比较暗。

此外,我们的光源位置设置在了(0.0, 0.0, 0.0),也就是原点,而我们的球体也在原点。这意味着光源正好在球体的中心,所以我们看到的球体表面其实是在光源的阴影中,这也可能使得球体看起来更暗。

如果想让球体看起来更亮,可以尝试调整环境光和漫反射光的颜色,使它们更亮,或者改变光源的位置,使其不在球体的中心。

至于怎么调整环境光和漫反射光的颜色,使它们更亮

可以尝试将它们的颜色设置得更接近白色。例如,你可以将环境光的颜色设置为(0.5, 0.5, 0.5),将漫反射光的颜色设置为(1.0, 1.0, 1.0)。这样,环境光和漫反射光就会更亮了。

// 设置环境光颜色为亮灰色
light->setAmbient(osg::Vec4(0.5, 0.5, 0.5, 1.0));

// 设置漫反射光颜色为白色
light->setDiffuse(osg::Vec4(1.0, 1.0, 1.0, 1.0));

2.3环境光和漫反射光

在计算机图形学中,环境光(Ambient Light)和漫反射光(Diffuse Light)是两种常见的光照类型,它们都可以有颜色。

  • 环境光是无论何时都存在的光照,它来自所有方向,对场景中的所有物体都有影响。环境光的颜色通常用来模拟全局的背景光或者天空光。
  • 漫反射光则是从光源直接反射到眼睛的光照。当光线照射到物体表面时,会在各个方向上均匀地散射出去,这就是漫反射光。漫反射光的颜色通常取决于物体的颜色和光源的颜色。

在计算机图形学中,我们通常使用RGB颜色模型来表示颜色,其中R、G、B分别代表红色、绿色和蓝色,每种颜色的取值范围通常是0到1。例如,红色可以表示为(1, 0, 0),绿色可以表示为(0, 1, 0),蓝色可以表示为(0, 0, 1),白色可以表示为(1, 1, 1),黑色可以表示为(0, 0, 0)。因此,当我们说光源有颜色时,其实是指光源发出的光的颜色(漫反射光)。例如,如果一个光源发出红色的光,那么这个光源的颜色就是红色。

2.4 Vec4的第四个参数是什么意思

osg::Vec4中,最后一个参数通常用来表示透明度,也被称为alpha值。它的取值范围通常是0到1,其中0表示完全透明,1表示完全不透明。例如,osg::Vec4(0.0, 1.0, 0.0, 1.0)表示的是完全不透明的绿色,而osg::Vec4(0.0, 1.0, 0.0, 0.5)表示的是半透明的绿色。在一些情况下,这个alpha值可以用来创建透明或半透明的效果。但是,请注意,并非所有的图形硬件和驱动程序都支持alpha混合,而且在使用alpha混合时,可能需要正确地排序和渲染透明物体,以得到正确的结果

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。