【Chrono Engine学习总结】6-创建自定义场景-6.2-chrono中的光线设置

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。

上一篇文章中,自己【用sketchup重建了三维场景】,但导入chrono中颜色很不正确,几乎都是白色的,但也不是完全白色。经过了一系列的测试,找到了问题。

在这里插入图片描述

说明:由于本人不专门搞三维重建,因此可能有表述用词不严谨,本文仅供说明含义,没有去究用词。

1、obj格式文件的存储

从Sketchup导出带纹理信息的obj文件后,会生成三个文件:xxx.obj, xxx.mtl,和xxx文件夹在这里插入图片描述

其中,xxx.obj是三维模型,不带有任何贴图,没有颜色的。mtl文件为material的缩写,表示模型的材质,xxx文件夹是具体的贴图图片。

进一步解释,就是在(chrono/meshlab/cloudcompare)打开一个obj文件时,如果找到了obj文件对应的mtl文件,就会根据mtl文件中定义的每个mesh面的参数,加载贴图。

一个典型的mtl文件的内容如下:

## Alias OBJ Material File
# Exported from SketchUp, (c) 2000-2012 Trimble Navigation Limitednewmtl TGA2021_6_302
Ka 0.200000 0.000000 0.000000
Kd 0.349020 0.337255 0.313725
Ks 0.330000 0.330000 0.330000
map_Kd outdoor_simple/TGA2021_6_302.jpg# 下一个面的参数

其中Ka, Kd, Ks为三个参数,下面会讲;最后的map_Kd就是贴图,对应的贴图在xxx文件夹当中。贴在TGA2021_6_302这个面上。

如果说找不到mtl文件,或者丢失了纹理文件夹,打开obj就是一个没颜色的,如下图。同时,meshlab或者cloudcompare都会警告你没有找到对应的纹理:

在这里插入图片描述

2、mtl文件参数说明

直接贴chatgpt给出的说明:

Ka (Ambient Reflectivity, 环境反射率):
解释:Ka 用于定义材质的环境光反射率,也就是材质在环境光(ambient light)下的颜色。
格式:Ka R G B,其中 R、G、B 是红、绿、蓝三种颜色的反射率值,范围通常为 0.0 到 1.0。
作用:环境光是模拟从所有方向均匀照射到物体上的光,它的反射率决定了物体在环境光下的基本颜色。
示例:Ka 0.200000 0.200000 0.200000 表示材质在环境光下反射 20% 的红、绿、蓝光。

Kd (Diffuse Reflectivity, 漫反射率):
解释:Kd 用于定义材质的漫反射光反射率,也就是材质在漫射光(diffuse light)下的颜色。
格式:Kd R G B,同样 R、G、B 的范围为 0.0 到 1.0。
作用:漫射光是从特定方向照射到物体上,并在表面均匀反射的光。它主要影响材质的颜色和亮度。
示例:Kd 1.000000 1.000000 1.000000 表示材质在漫射光下反射 100% 的红、绿、蓝光,即材质呈现白色。

Ks (Specular Reflectivity, 镜面反射率):
解释:Ks 用于定义材质的镜面反射光反射率,也就是材质在镜面光(specular light)下的颜色。
格式:Ks R G B,同样 R、G、B 的范围为 0.0 到 1.0。
作用:镜面光是模拟光线在表面反射产生的高光(specular highlights),它的反射率决定了材质的光泽度和反射光的颜色。
示例:Ks 0.330000 0.330000 0.330000 表示材质在镜面光下反射 33% 的红、绿、蓝光。

也就是说,Ka是对“环境光/ambient light”的“显示”,Kd和Ks是对主动光的“显示”。

  • 环境光:模拟从所有方向均匀照射到物体上的光,它的反射率决定了物体在环境光下的基本颜色。
  • 特定光/主动光:不同于环境光的光线,物体受到主动光后,会“漫反射”和“镜面反射”

3、问题分析

从sketchup导出的文件可以看出,所有物体的Ka都是0,仅存在Kd和Ks。所以,这个帖图受环境光影响,只受主动光照的影响。

在这里插入图片描述
那么,既然场景中都是白色,是不是因为太亮了?
代码中的实现如下:

vis->AddLight(ChVector<>(-50, -50, 200), 300, ChColor(0.7f, 0.7f, 0.7f))
vis->AddLight(ChVector<>(+50, +50, 200), 300, ChColor(0.7f, 0.7f, 0.7f));
vis->AddLight(ChVector<>(-50, +50, 200), 300, ChColor(0.7f, 0.7f, 0.7f));
vis->AddLight(ChVector<>(+50, -50, 200), 300, ChColor(0.7f, 0.7f, 0.7f));

可以看出,之前照抄的这段代码,打了4束主动光,强度都是0.7。那么再综合Kd这个漫反射参数,可以发现,4个0.7作用下,乘以漫反射系数,仍然超过了1,因此显示出了白色。所以,如果把0.7改小,是不是会有所好转?

改成0.2f后,确实山的颜色正常了,但问题是阴影区域颜色太暗了,看不清。
在这里插入图片描述
那么再回到Ka参数,既然都是0,那么修改Ka是不是能解决?于是将Ka的0全部修改为1试了下,没有任何效果。

什么原因呢?那就是环境中并没有“环境光”,chrono中AddLight添加的是主动光,而不是环境光。于是搜了半天,果然chrono中可以添加环境光,代码如下(添加“满”环境光,即255):

vis->GetSceneManager()->setAmbientLight(irr::video::SColor(0, 255, 255, 255));

注意:这个函数在chrono不同版本中的定义不同,请自行查找自己版本的代码对应的定义。四个参数可能是alpha, r, g, b,也可能是r,g,b,alpha;可能是u32类型,也可能是float类型。

这样,就可以看到物体“本身”的颜色了。只不过这样主动光再一叠加,主动光直射部分还是容易泛白,因此我们可以把主动光全部关掉,只留环境光。

在这里插入图片描述在这里插入图片描述

但是此时又发现了一个问题,那就是“纯色”区域显示的是灰色的,例如右侧的山峰。这是因为纯色区域在mtl文件中并没有“贴图”,只是通过Kd和Ks参数控制了颜色,因此主动光是0时环境光的Ka参数都是1,所以就会是灰色的。比如,下面这个xtl中stone1是贴图,而Vegetatin_Blur7是纯色(没有贴图文件):
在这里插入图片描述

因此,再把纯色区域的Ka不要设置成全1,而是用Kd参数即可。下图中“山”的颜色正常了。但改起来比较麻烦,可以写个脚本自动实现。

在这里插入图片描述

4、总结

啰嗦半天,更多的展示了试凑过程。总结如下:

  • obj文件的颜色来自mtl文件定义,有两种颜色:贴图或者是纯色
  • obj中的每个面有三个参数决定颜色,Ka,Kd和Ks;Ka是“环境光”的“响应”,Kd是“主动光”的散射,Ks是“主动光”的反射,大概是一个:“颜色=(环境光 x Ka) + (主动光 x Kd) + (主动光 x 观看角度 x Ks)” 这么一个关系(不是严格表达式,仅供理解)
  • chrono的光照有两种,主动光由代码AddLight添加,或者环境光由setAmbientLight添加;
  • chrono中最终显示的mesh颜色,由主动光和Kd/Ks参数作用,加上环境光和Ka作用最终实现。区域白色说明主动光+环境光过高了,黑色区域为主动光少/遮挡/环境光太暗,对应上述公式调整;
  • 调整思路,就是直接改变主动光或环境光,如果物体本身的材质差距比较大,再去编辑mtl文件修改对应参数

遗留问题/Issue

那么,有一个问题:如果修改了Kd/Ks,激光雷达在仿真时,intensity的数值是否会发生改变?换句话说,在chrono中由于光照“看起来”颜色不一样的物体,会影响lidar的采集数据么?

答:简单测了下,好像没有区别。Kd/Ks设置为0,lidar的采集intensity看起来还是一样的。

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

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

相关文章

IDE上传本地仓库到GitHub

IDE上传本地仓库到GitHub 1、选择远程仓库平台2、下载安装Git3、IDE集成Git4、本地项目上传GitHub 1、选择远程仓库平台 1.1、注册远程仓库平台 常见的远程仓库托管平台有&#xff1a; 1&#xff09;GitHub 域名&#xff1a;https://github.com 介绍&#xff1a;GitHub是全球最…

Java订餐系统源码 springboot点菜系统源码

Java订餐系统源码 springboot点菜系统源码 源码下载地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89341358 功能介绍&#xff1a; 前台登录&#xff1a;前台登录&#xff1a; ①首页&#xff1a;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&…

Stanford斯坦福 CS 224R: 深度强化学习 (3)

基于模型的强化学习 强化学习(RL)旨在让智能体通过与环境互动来学习最优策略,从而最大化累积奖励。传统的强化学习方法如Q-learning、策略梯度等,通过大量的试错来学习值函数或策略,样本效率较低。而基于模型的强化学习(MBRL)则利用对环境的预测模型来加速学习过程,大大提高了…

参数的本质:详解 JavaScript 函数的参数

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 JavaScript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 上篇文章…

地理信息系统(GIS)软件开发

地理信息系统&#xff08;GIS&#xff09;软件开发是一项复杂且系统性很强的工程&#xff0c;涉及空间数据的采集、管理、分析和展示。以下是一个典型的GIS软件开发流程&#xff0c;包括各个步骤的详细说明。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

面向对象------多态

1.多态的定义 通俗来说&#xff0c;当同一种行为或者事情发生在不同的对象上&#xff0c;这些行为或者事情最终得到的结果不同。 注意&#xff1a;多态要发生在继承的基础上。 例如&#xff1a;彩色打印机和黑白打印机。 彩色打印机和黑白打印机是不同的对象&#xff0c;但…

详细分析Element中的MessageBox基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 确认框2.2 警告框2.3 对话框 3. this.$confirm 前言 详细知识推荐阅读&#xff1a;详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#xff09; MessageBox则常用于Vue2 1. 基本知识 MessageBox 是 Element UI 提供…

Liunx学习随笔

Linux学习随笔 一.前期准备1.安装Vmware Workstation软件2.下载linux镜像3.安装操作系统 夕阳无限好&#xff0c;只是近黄昏&#xff0c;时隔一年&#xff0c;重新提笔 没有比脚更远的路&#xff0c;没有比人更高的山 一.前期准备 1.安装Vmware Workstation软件 下载地址&am…

加载页面 跳转 新页面 vue

通常&#xff0c;我们点页面上的详情&#xff0c;或者编辑&#xff0c;需要加载一个新的页面出来。 vue中加载页面的方法&#xff1a; 在父页面中&#xff08;通常是某个模块目录下的index.vue&#xff09;&#xff0c;先写这行代码&#xff1a; import AddEditForm from ./…

南京观海微电子----升压和降压模块电路解析

(一)升压模块 1. 如果是交流电压升压&#xff0c;那非常简单&#xff0c;只要选择变比合适的变压器就行(1:3和1:4.17); 2. 如果是直流电压升压&#xff0c;从12v升到36v也很容易&#xff0c;可选择用的开关稳压器很多&#xff0c;例如 :Cs5171.Cs5172.Cs5173.Cs5174.Mc33063.…

SQLAlchemy备忘

orm备忘 upsert&#xff0c;存在及更新&#xff0c;不存在则插入 from sqlalchemy.dialects.mysql import insertinsert_stmt insert(FileModule).values(file_pathpar_dict.file, module_keypar_dict.module_key,module_namepar_dict.module_name, project_idpar_dict.proj…

【调和级数】100321. 优质数对的总数 II

本文涉及知识点 调和级数 质数、最大公约数、菲蜀定理 LeetCode100321. 优质数对的总数 II 给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;则称数对 (i, j) 为 优质数对&#…

[Android]在后台线程执行耗时操作,然后在主线程更新UI

1.Coroutines&#xff08;官方推荐&#xff09; Coroutines 提供了一种轻量级的线程管理方式&#xff0c;使得在后台线程执行任务和在主线程更新 UI 变得简单。以下是如何在 Kotlin 中使用 Coroutines 来处理耗时逻辑并更新 UI 的步骤&#xff1a; 添加 Coroutines 依赖: 首…

数据结构·一篇搞定队列!

hello&#xff0c;大家好啊&#xff0c;肖恩又拖更了&#xff0c;你们听我狡辩&#xff0c;前段时间有期中考试&#xff0c;so我就没什么时间写这个&#xff0c;在这给大家道个歉&#x1f62d;&#x1f62d;&#x1f62d; 我后面一定尽力不拖更 那么接下来&#xff0c;我们来看…

Greenplum使用hbase外部表

概述 GP可以通过pxf协议上的hbase外表功能&#xff0c; 在数据库中创建外部表&#xff0c;映射hbase table&#xff0c;以直接在gp中访问 hbase数据&#xff0c;方便将hbase的查询结果集保留在gp中 hbase端准备 HBase基础概念&#xff1a; •HBase 列包含两个组件&#xff1…

粒子辐照环境中相机镜头防护及LabVIEW图像处理注意事项

在粒子辐照环境测试电路板性能的实验中&#xff0c;需要对相机镜头进行有效防护&#xff0c;同时利用LabVIEW进行图像识别和处理。本文将讨论相机镜头防护的关键因素和LabVIEW处理过程中的注意事项&#xff0c;包括防辐射材料选择、辐射屏蔽措施、散热管理、空间布局及LabVIEW软…

c++11:左值引用和右值引用《全家桶》

总结一下C11中涉及到左值引用和右值引用的场景。 1 左值引用和右值引用的区别 左值引用 定义&#xff1a;对左值的引用。目的是避免内存拷贝&#xff0c;类似c中的指针,两个场景&#xff1a;函数传参、函数返回值。 右值引用 定义&#xff1a;对右值的引用。两个场景&#…

【机器学习-k近邻算法-01】 | Scikit-Learn工具包进阶指南:机器学习sklearn.neighbors模块之k近邻算法实战

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

骑行 - 新区永旺出发的环太湖路线

环过好几次太湖&#xff0c;但对路线都没太在意&#xff0c;都是跟着别人走的。这次自己制定一个路书&#xff0c;方便下次自己一个人环太湖时使用。 开始是使用高德地图做路书&#xff0c;只能在PC上做。我用的是网页版&#xff0c;每次选点太麻烦了。要输入地址搜索&#xff…

开源博客项目Blog .NET Core源码学习(27:App.Hosting项目结构分析-15)

本文学习并分析App.Hosting项目中后台管理页面的角色管理页面。   角色管理页面用于显示、检索、新建、编辑、删除角色数据同时支持按角色分配菜单权限&#xff0c;以便按角色控制后台管理页面的菜单访问权限。角色管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑…