【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 Limited

newmtl 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看起来还是一样的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宿舍管理系统代码详解(操作界面)

目录 一、前端代码 1.样式展示 2.代码详解 <1>主页面列表部分 &#xff08;1&#xff09;template部分 &#xff08;2&#xff09;script部分 <2>新增页面 &#xff08;1&#xff09;template部分 &#xff08;2&#xff09;script部分 <3>修改页面…

Mongodb介绍及springboot集成增删改查

文章目录 1. MongoDB相关概念1.1 业务应用场景1.2 MongoDB简介1.3 体系结构1.4 数据模型1.5 MongoDB的特点 2. docker安装mongodb3. springboot集成3.1 文件结构3.2 增删改查3.2.1 增加insert3.2.2 保存save3.2.3 更新update3.2.4 查询3.2.5 删除 1. MongoDB相关概念 1.1 业务…

vue3快速入门(局部使用)

目录 前置知识JavaScript-导入导出 入门操作 变量渲染页面 局部使用vue的实现步骤 vue指令 v-for v-bind v-if v-show v-on v-model 生命周期 前置知识JavaScript-导入导出 正常情况在html导入js文件是全部导入&#xff0c;这样会导致性能上的损失 。 JS提供的…

上位机图像处理和嵌入式模块部署(f103 mcu运行freertos)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 mcu一般有两个用途,一个是控制,一个是非控制。控制类的应用一般要求实时性比较高,什么时候做什么,都是有严格的时间要求的。而非控制类的应用,则要求实现尽可能多的功能,比如…

构建智慧城市公共服务系统的功能架构设计

随着城市化进程的加速&#xff0c;城市公共服务系统在保障居民生活品质、提升城市管理水平方面扮演着愈发重要的角色。构建智慧城市公共服务系统的功能架构设计至关重要&#xff0c;它不仅需要充分考虑居民需求与城市管理的实际情况&#xff0c;还需要整合先进的科技手段&#…

冷冻式压缩空气干燥机常见几种系统原理图

冷冻式压缩空气干燥机 我们以两种典型的设计流程图为例 1.干式蒸发型&#xff0c;这类冷干机是我们最为常见的设计型式。下图为deltech公司的典型流程图 此类设备各家设计不同的最大区别基本就是在换热器的结构型式上有比较大的区别。换热器主要有&#xff1a;管壳式、铝板换、…

echarts饼图图例右侧纵向排列

如图所示&#xff0c;一开始&#xff0c;我设置了图例的right和top值&#xff0c;还有orient&#xff0c;但图例始终不能纵向排成一排&#xff0c;要么上面两个一行&#xff0c;要么最后两个一行&#xff0c;最后我发现同时设置一下left的值就可以了&#xff0c;如下所示&#…

51单片机-实机演示(按键)

书接上回。http://t.csdnimg.cn/4wSSW 目录 一.按下灭&#xff0c;松开亮 二.两个按键控制两个灯 三.点一下灯开&#xff0c;在按一下关 四。优化按键消抖 1.加入bit变量 一.按下灭&#xff0c;松开亮 代码 #include <reg52.h> //此文件中定义了单片机的一些特…

关于Iterator 和ListIterator的详解

1.Iterator Iterator的定义如下&#xff1a; public interface Iterator<E> {} Iterator是一个接口&#xff0c;它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下&#xff1a; forEachRemaining(Consumer<? super E> act…

Android Studio开发之路(十三)主题影响Button颜色问题解决及button自定义样式

一、问题描述 在开发过程中发现安卓的默认主题色是紫色&#xff0c;并且会导致button也是紫色&#xff0c;有时直接在xml布局文件中直接设置button的背景色或者设置背景图片不起效果 方案一、如果是app&#xff0c;可以直接设置主题颜色 比如&#xff0c;将主题设置为白色&a…

GNSS的经纬度使用float还是doubble数据类型存储传输?

1. 背景 当你在使用导航、打车、定位等等场景下&#xff0c;一定会有形或者无形的使用位置服务&#xff0c;位置服务的基础功能功能就是向你提供位置信息&#xff0c;而经纬度是位置信息的主要信息&#xff0c;一般情况可以简单的认为位置信息就是经纬度信息。经纬度使用小数进…

五分钟”手撕“异常

目录 一、什么是异常 二、异常的体系和分类 三、异常的处理 1.抛出异常 2.异常的捕获 异常声明throws&#xff1a; try-catch处理 四、finally finally一定会被执行吗&#xff1f; 五、throw和throws区别 六、异常处理的流程 七、自定义异常 一、什么是异常 顾名…

Java顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

ESP8266 接入阿里云物联网云平台

AT指令集参考资料 乐鑫科技&#xff1a;基础 AT 命令集 概念浅析 物模型 是对设备在云端的功能描述&#xff0c;包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型&#xff0c;称之为TSL&#xff08;即 Thing Specification Language&#xff0…

【学习笔记】3D-2D:PnP

主要解决什么问题&#xff1f; 主要解决的是已知空间中N个3D点及其图像中的2D点坐标&#xff0c;求相机在空间中的位置与姿态 求解PnP问题最少需要几个点&#xff1f; 最少只需要3个点对 求解PnP问题的常用方法 主要有用3对点估计位姿的P3P&#xff0c;另外还有DLT&#x…

前端如何学会全栈分页开发?源码和思路都在这了

本项目代码已开源&#xff0c;具体见&#xff1a; 前端工程&#xff1a;vue3-ts-blog-frontend 后端工程&#xff1a;express-blog-backend 数据库初始化脚本&#xff1a;关注公众号程序员白彬&#xff0c;回复关键字“博客数据库脚本”&#xff0c;即可获取。 前言 这是博客系…

商标注册申请名称的概率,多想名称选通过率好的!

近日给深圳客户申请的商标初审下来了&#xff0c;两个类别都下的初审&#xff0c;和当初的判断基本一致&#xff0c;普推知产老杨当时沟通说需要做担保申请注册也可以&#xff0c;后面选择了管家注册&#xff0c;最近大量的帮客户检索商标名称&#xff0c;分享下经验。 两个字基…

STM32H7系统窗口看门狗 (WWDG)应用方法介绍

目录 概述 1 认识窗口看门狗 (WWDG) 1.1 窗口看门狗定义 1.2 WWDG 主要特性 2 WWDG 功能说明 2.1 WWDG框图 2.2 WWDG 内部信号 2.3 控制递减计数器 2.4 看门狗中断高级特性 2.5 如何设置看门狗超时 3 WWDG 寄存器 3.1 控制寄存器 (WWDG_CR) 3.2 配置寄存器 (W…

如何调用通义千问大模型API

目录 登录阿里云 大模型服务平台百炼 登录控制台 QWen Long QWen 通义千问开源系列 大语言模型 OpenAI接口兼容 登录阿里云 阿里云-计算&#xff0c;为了无法计算的价值 大模型服务平台百炼 降价信息&#xff1a; 登录控制台 右上角取得API key 创建Key QWen Long qw…

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

前言&#xff1a;有时候远程服务器的进程你想偷偷去围观一下有哪些&#xff0c;或者对一些比较调皮的进程进行封杀&#xff0c;或者对一些自己研发的服务进行远程手动启动或者重启等&#xff0c;又不想打开远程桌面&#xff0c;只想悄咪咪地执行&#xff0c;那也许下面的文章会…