Cesium.Entity图片纹理在不同观察角度有不同亮度

news2024/12/23 4:17:11

Cesium.Entity图片纹理在不同观察角度有不同亮度

测试代码:

viewer.entities.add({
  rectangle: {
    coordinates: Cesium.Rectangle.fromDegrees(-92.0, 30.0, -76.0, 40.0),
    material: "../images/rect.png",
  }
});

测试图片:

rect.png

这个图片可以比较明显的观察到亮度的变化!

如果亮度变化不明显,可以监测rgb的值,也会发现有所不同

测试结果:

entity rectangle使用了图片纹理,在改变查看角度后

图片的亮度发生变化

分析过程1:

光的反射分为镜面反射和漫反射两类

镜面反射导致的??

镜面反射会受到“观察角度”与“光源角度”的影响

在cesium中,调整太阳角度,观察角保持不变,并没有出现纹理亮度的变化

所以排除了纹理使用镜面反射的原因。

漫反射导致的??

在光源(太阳)和物体相对位置和角度保持不变的时候

只改变观察者的位置

是不应该出现亮度变化的

所以也排除了漫反射。

分析过程2:源码跟踪

发现是因为shader中,在眼睛坐标系下给了2个固定的光源

vec4 czm_phong(vec3 toEye, czm_material material, vec3 lightDirectionEC)
{
    // Diffuse from directional light sources at eye (for top-down)
    float diffuse = czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 0.0, 1.0), material);//固定光源1
    if (czm_sceneMode == czm_sceneMode3D) {
        // (and horizon views in 3D)
        diffuse += czm_private_getLambertDiffuseOfMaterial(vec3(0.0, 1.0, 0.0), material);//固定光源2
    }

    float specular = czm_private_getSpecularOfMaterial(lightDirectionEC, toEye, material);

    // Temporary workaround for adding ambient.
    vec3 materialDiffuse = material.diffuse * 0.5;

    vec3 ambient = materialDiffuse;
    vec3 color = ambient + material.emission;
    color += materialDiffuse * diffuse * czm_lightColor;
    color += material.specular * specular * czm_lightColor;

    return vec4(color, material.alpha);
}

思考:

关于这2个固定光源:

这2个固定光源,可以让人在任何角度,都可以看到明亮的entity

如果没有这2个光源,大家就要调整合适的太阳角度去照亮特定的entity

至于为啥要加这2个固定光源的更多原因,欢迎大家留言。

关于环境光:

为啥cesium不引入环境光这个参数信息?

解决方案:

Entity.rectangle.material="图片地址"

上述代码最后会使用ImageMaterialProperty类

模仿ImageMaterialProperty类写一个自定义的MaterialProperty

在下述shader中,把diffuse改成emission就可以了

Material.ImageType = "Image";
Material._materialCache.addMaterial(Material.ImageType, {
  fabric: {
    type: Material.ImageType,
    uniforms: {
      image: Material.DefaultImageId,
      repeat: new Cartesian2(1.0, 1.0),
      color: new Color(1.0, 1.0, 1.0, 1.0),
    },
    components: {
      //下述diffuse改成了emission就可以了
      diffuse:
        "texture2D(image, fract(repeat * materialInput.st)).rgb * color.rgb",
      alpha: "texture2D(image, fract(repeat * materialInput.st)).a * color.a",
    },
  },
  translucent: function (material) {
    return material.uniforms.color.alpha < 1.0;
  },
});

上述代码引的是ImageMaterialProperty类使用的shader

自定义shader的时候,记着修改相关变量,比如Material.ImageType的值

(关于自定义MaterialProperty,请查询相关资料,在此不深入来说)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/920717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 学习笔记 简单实验

1.代码(html) <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"counter">Counter: {{ counter }} </div> <script> const Counter {data() {return {counter: 5}} } Vue.cr…

★80交流驱动器通过rs485接口设置速度(附ascii表)

1抓取的数据及解析 2手册上的通信协议及数据帧说明 说明:双向传输项目 3硬件接线注意事项 用的RSJ45端子&#xff0c;双传项目中&#xff0c;一头用的pin6的水晶头子&#xff08;直流离心机上用过是可以的&#xff09;&#xff0c;另一个用的pin8的水晶头子&#xff0c;这里最…

Linux常用命令——dhcrelay命令

在线Linux命令查询工具 dhcrelay 使用dhcrelay命令可以提供中继DHCP和BOOTP请求 补充说明 dhcrelay命令使用dhcrelay命令可以提供中继DHCP和BOOTP请求&#xff0c;从一个没有DHCP服务器的子网直接连接到其它子网内的一个或多个DHCP服务器。该命令在DHCP中继服务器上使用&am…

【MPLS LDP】安全策略

正在备考华为认证的小伙伴应该知道&#xff0c;除了理论知识外&#xff0c;刷题也相当重要&#xff0c;周工这里有一份HCIAHCIP-Datacom带解析的最新题库 点赞留言 即可领取。 LDP协议 安全策略介绍 LDP MD5验证 MD5称为Message-Digest Algorithm 5&#xff0c;是国际标准摘…

面试题(一)

目录 一.@Transactional 原理和常见的坑 前期准备 事务不生效的几种 Case 原理 源码解读 @Transactional 执行机制 private 导致事务不生效原因 异常不匹配原因 两种 @Transactional Spring @Transactional javax.transaction.Transactional 二.@Autowired 和 @R…

EasyExcel实现文件分批次导入

文章目录 EasyExcel引入依赖表结构项目结构DozerUtils工具类实体类StudentController监听类ServiceServiceImplmapper 启动项目测试测试数据PostMan测试 EasyExcel EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存…

智能交通顶会 IEEE ITSC工作 LimSim:长期交互式多场景交通仿真器(已开源)

交通仿真器是自动驾驶技术发展的重要支撑。交通仿真器可以在虚拟环境中仿真各种交通场景和车辆行驶情况&#xff0c;从而提高测试效率、降低测试风险、提高测试准确性和加速开发周期&#xff0c;是自动驾驶技术验证和优化的重要手段之一。 **LimSim是由上海人工智能实验室智能…

怎么把PDF转成Word?需要注意什么事项?

PDF是一种常见的文档格式&#xff0c;但是与Word文档不同&#xff0c;PDF文件通常不能直接编辑。如果您想编辑PDF文件中的文本&#xff0c;或者想将PDF文件转换为Word文档&#xff0c;下面我们就来看一看把PDF转成Word有哪些方法和注意事项。 PDF转Word工具 有许多将PDF转换为…

AndroidStudio升级后总是Read Time Out的解决办法

AndroidStudio升级后在gradle的时候总是Time out&#xff0c;遇到过多次&#xff0c;总结一下解决办法 1、gradle下载超时 在工程目录../gradle/wrapper/gradle-wrapper.properties中找到gradle版本的下载链接&#xff0c;如下图&#xff1a; 将其复制到迅雷里下载&#xff0…

vue和react学哪一个比较有助于以后发展?

前言 首先声明vue和react这两个框架都是很优秀的前端框架&#xff0c;使用的人群下载量上数量也是相当的庞大&#xff0c;这篇文章没有贬低或者攻击任何一个框架的意思&#xff0c;只在于根据答主的问题来对这两个框架做出对比&#xff0c;以方便大家更加清晰的了解到当下vue和…

小迪和小捷的太空之旅——汽车篇

前情提要 书接上回&#xff0c;小迪与小捷接到外星人的委托&#xff0c;前往其母星拿取特殊小硬件。 在这个陌生的星球&#xff0c;小迪和小捷将遇到怎样的故事呢&#xff1f;

flask实现获取到上传的文件--postman实战

python&#xff1a; index_page.route("/upload",methods["POST"]) def upload():f request.files[file]return "request:%s,params:%s,var_a:%s" % (request.method, request.files, f)postman测试 也可以使用curl进行测试&#xff0c;post可…

高防护等级工业RFID读写器

工业环境恶劣&#xff0c;RFID工业读写器要能够在工业领域应用必须满足一定的防护等级&#xff0c;才能避免外界灰尘油污对设备产生影响&#xff0c;因此企业选择一款高防护等级的读写器尤为重要。下面本文就为大家介绍一下工业读写器对应的防护等级&#xff0c;给大家一个参考…

Wireshark数据抓包分析之互联网控制报文协议_ICMP

一、实验目的: 通过使用wireshark抓取的ICMP数据包对这个ICMP控制报文进行分析 二、预备知识&#xff1a; 1.ICMP协议概述&#xff1a;ICMP是Internet Control Message Protocol的缩写&#xff0c;即互联网控制报文协议。它是TCP/IP协议族的一个子协议&#xff0c;用于IP主机、…

c++ qt--页面布局(第五部分)

c qt–页面布局&#xff08;第五部分&#xff09; 一.页面布局 在设计页面的左侧一栏的组件中我们可以看到进行页面布局的一些组件 布局组件的使用 1.水平布局 使用&#xff1a;将别的组件拖到水平布局的组件中即可&#xff0c;可以选择是在哪个位置 2.垂直布局 使用&…

线性代数的学习和整理5: 矩阵的加减乘除及其几何意义

目录 1 矩阵加法 1.1 矩阵加法的定义 1.2 加法的属性 1.2.1 只有同类型&#xff0c;相同n*m的矩阵才可以相加 1.2.1 矩阵加法的可交换律&#xff1a; 1.2.2 矩阵加法的可结合律&#xff1a; 1.3矩阵加法的几何意义 2 矩阵的减法 2.1 矩阵减法定义和原理基本同 矩阵的…

MongoDB【CRUD练习-条件查询-文档关系】

练习1-CRUD // 进入test数据库 use test; // 查询文档内容 db.students.find(); // 显示当前数据库中所有集合 show collections; // 向数据库的user集合中插入一个文档 db.users.insertOne({username: "lyh"} ); // 查看当前数据库中所有的集合 发现users集合被创建…

JavaFX笔记

设置透明 group.setOpacity(0.5);&#xff0c;这里给group设置了半透明&#xff0c;其中的组件也会跟着变化。 按钮的字体 按钮背景 麻烦方法 paint是颜色 CornerRadii是圆角的弧度 CSS方法 单击事件

java八股文面试[java基础]——反射

知识来源&#xff1a; 【23版面试突击】讲讲JAVA的反射机制_哔哩哔哩_bilibili

华为云服务器部署mysql

1. 下载mysql压缩包 本机是64位&#xff0c;直接用命令安装 msyql官网&#xff1a; https://dev.mysql.com/downloads/mysql/ 去网站看下所需的版本&#xff0c;修改下列命令 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.…