【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;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&…

地理信息系统(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…

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

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

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

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

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

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

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

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

【机器学习-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;以支撑新建和编辑…

电缆厂可视化:提升生产透明度与运营效率

图扑电缆厂可视化系统通过实时监控和数据分析&#xff0c;提高生产过程的透明度和可控性&#xff0c;优化资源配置和质量管理&#xff0c;显著提升运营效率和产品质量。

电子电器架构 - AUTOSAR ON THE AIR

电子电器架构 - AUTOSAR ON THE AIR 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

Mybase长久破解

1、软件下载好之后&#xff0c;找到文件mybase8.ini文件 2、使用记事本打开&#xff0c;通过 Ctrl F 输入快速找到属性设置FirstUseOn.UserLic.App&#xff0c;将等号后面的数值删掉保存即可 3、使用防护中心–>自定义防护&#xff08;记得开启&#xff09; 4、添加规则…

Golang文件操作

文章目录 文件操作基本介绍普通的文件操作方式&#xff08;os包&#xff09;带缓冲的文件操作方式&#xff08;bufio包&#xff09;文件拷贝操作&#xff08;io包&#xff09; 命令行参数基本介绍解析命令行参数&#xff08;flag包&#xff09; JSON基本介绍JSON序列化JSON反序…

真拿AI赚到钱的人,不在朋友圈里

1 最近有张两大AI巨头对比的梗图给我看乐了&#xff0c;玩儿AI的还在做产品&#xff0c;玩儿焦虑的已经在数钱了。 这也是在做AI&#xff0c;只不过是唉声叹气的ai。 要我说&#xff0c;现在缺的根本不是AI&#xff0c;而是【有用的AI】。 恩格斯老师说过一句话&#xff1a…

科林Linux6_网络

#include<sys/socket.h> #include<arpa/inet.h> //大小端转换 #include<netdb.h> //DNS一、Socket套接字 为了开发网络应用&#xff0c;系统提供一套API函数接口&#xff0c;用于网络应用开发&#xff0c;这些接口称为套接字函数 struct sockaddr_in…

数据库管理-第194期 网络加速RDMA初探(20240526)

数据库管理194期 2024-05-26 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09;1 概念2 发展3 使用总结 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE A…