【Chrono Engine学习总结】2-可视化

news2024/12/26 11:13:10

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

0、基本概念

类型说明:
Chrono的可视化包括两块:实时可视化,以及离线/后处理可视化。
其中,实时可视化,又包括:Irrlicht、VSG、OpenGL 三个模块。这里采用最基础的Irrlicht。
https://api.projectchrono.org/manual_visualization.html

可视化、ChBody和碰撞
ChBody只是一个物体,具体的是一个ChPhysicsItem,并不存在碰撞,也可以显示成别的样子。
如果需要碰撞检测,需要将需要可视化的东西绑定到一个ChBody上。

1、参考代码

ChSystemNSC sys;			// 创建系统

// 创建一个ChBody(物理模型),具体地,是一个EasyBox,参数分别为:长宽高、密度,等;
auto box_body = chrono_types::make_shared<ChBodyEasyBox>(10, 10, 1, 1000, true, false);
box_body->SetPos({ 0, 0, -1 });		// 设定这个长方体在空间中的位置
box_body->SetBodyFixed(true);			// 设定固定
sys.Add(box_body);			// 将这个物体添加到物理环境sys中

// 创建一个可以可视化的物体(视觉模型),这个物体的大小尺寸与上面的ChBody是一样的。
// 但这两个东西可以不一样,即可视化的内容、与实际的物体,可以不一样。
auto b1_vis = chrono_types::make_shared<chrono::ChVisualShapeBox>(10, 10, 1);
b1_vis->SetColor(chrono::ChColor(0.2f, 0.5f, 0));
box_body->AddVisualShape(b1_vis, ChFrame<>({ 0,0,0 }, QUNIT));		// 将这个可视化的形状与box_body这个物理模型完全重合

// Irrlicht引擎配置
auto vis = chrono_types::make_shared<chrono::irrlicht::ChVisualSystemIrrlicht>();	// 采用irrlicht的ChVisualSystemIrrlicht作为可视化管理
vis->AttachSystem(&sys);
vis->SetWindowSize(800, 600);
vis->SetWindowTitle("Chrono::Irrlicht visualization");
vis->Initialize();												// vis的初始化,包括相机、光照等配置;
vis->AddCamera({ 0,0,50 }, { 0,0,-1 });			// 设置相机的位置、朝向(设置在z轴50m处,方向朝 -z 方向,即向下)
vis->AddTypicalLights();
vis->AddSkyBox();

// 运行
while (ch_time < end_time && vis->Run()) {
   vis->BeginScene();
   vis->Render();
   vis->EndScene()
   sys.DoStepDynamics(step_size);
   ch_time = (float)sys.GetChTime();
}

一些说明:

  • sys.Add() 添加的是一个ChPhysicsItem,不能添加ChVisualShape。从继承关系图可以看出来,上面代码中的box_body “是一个” ChBody,“是一个”ChPhysicsItem,因此可以用sys.Add()进行添加。

在这里插入图片描述- 上面代码的b1_vis是一个ChVisualShape,同样可以看出,它是一个ChVisualShape(是最基本的基类)。对于一个ChPhysicItem具有AddVisualShape成员函数,可以将ChVisualShape加到其属性中。

在这里插入图片描述

2、可视化自定义的3D形状

上面采用的是简单的ChShape,往往需要使用自己的形状。
还好,官方给了参考例子。
demo_IRR_assets.cpp,参考这个例子,可以把任意3D形状放进去。部分参考代码如下:

auto objmesh = chrono_types::make_shared<ChVisualShapeModelFile>();
objmesh->SetFilename(GetChronoDataFile("models/forklift/body.obj"));		// 载入一个obj模型;
body->AddVisualShape(objmesh, ChFrame<>(ChVector<>(0, 0, 2), QUNIT));	// 绑定到body这个ChBody模块
sys.Add(body);

但是上面这种方法,只能用于可视化,激光雷达使用时并无法“采集到lidar点云”,这时候参考官方的lidar代码例子 demo_SEN_lidar.cpp

autommesh = ChTriangleMeshConnected::CreateFromWavefrontFile(GetChronoDataFile("vehicle/hmmwv/hmmwv_chassis.obj"), false, true);
mmesh->Transform(ChVector<>(0, 0, 0), ChMatrix33<>(1));  // scale to a different size
auto trimesh_shape = chrono_types::make_shared<ChVisualShapeTriangleMesh>();
trimesh_shape->SetMesh(mmesh);
trimesh_shape->SetName("HMMWV Chassis Mesh");
trimesh_shape->SetMutable(false);
auto mesh_body = chrono_types::make_shared<ChBody>();
mesh_body->SetPos({0, 0, 0});
mesh_body->AddVisualShape(trimesh_shape,ChFrame<>());
mesh_body->SetBodyFixed(true);
sys.Add(mesh_body);

创建一个mesh,然后同样的,将这个obj网格绑定到mesh_body(是一个ChBody)上,最后加到sys当中即可。

效果展示:
在这里插入图片描述左侧:lidar数据,右侧:从点云重建的obj格式文件(后面再展开介绍,如何从点云生成所需的obj格式),红色的为lidar绑定的物体。

3、遇到的一些问题

  • 对于vis模块,在initialize之后,是没有光照的,此时所有(没有纹理的)物体都会显示成黑色,此时和默认的背景颜色融为一体,会以为可视化啥也没出来……所以一定要设置光照、和背景色。
  • 经测试,在vis->AttachSystem(&sys);之前应该在sys中对所有需要可视化模块的添加,即完成所有的sys.Add(xxx)。我一开始在一开始就将sys添加到了vis中,导致后面添加的物理模块都没有显示。
  • lidar可以采集到的obj的载入方式,和vis可视化的载入方式不相同,还是参考的官方lidar的demo。
  • lidar绑定的ChBody会遮挡lidar的数据,如果SetVisiable(true)的话,但false的话irrlicht里面看不到……

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

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

相关文章

字节测试岗3面都过了,最后因为这个被刷。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 说在前面 面试时最好不要虚报工资。本来字节跳动是很想去的&#xff0c;几轮面试也通过了&…

【Crypto | CTF】BUUCTF 大帝的密码武器1

天命&#xff1a;这题真的是来刷经验的&#xff0c;有点吐血 首先这题是贼简单&#xff0c;但我居然跪到了&#xff0c;所以特此写这一篇来惩戒自己心太大 拿到文件&#xff0c;文件写着zip&#xff0c;改成zip后缀名即可&#xff0c;也不算啥难的 打开里面的两份文件&#x…

PythonStudio 控件使用常用方式(七)TEdit

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 TEdit就是单行文本框 常用属性 A…

移动Web——移动适配

移动适配 当屏幕宽度变化了&#xff0c;网页元素的宽高都要等比例变化&#xff0c;而且像间距、像素、字体等都是等比例变化的 移动适配方案 remvw 1、谷歌模拟器 2、屏幕分辨率 屏幕分辨率&#xff1a;纵横向上的像素点数&#xff0c;单位是px pc分辨率&#xff1a; 1920*10…

代码随想录算法训练营DAY11 | 栈与队列 (2)

一、LeetCode 20 有效的括号 题目链接&#xff1a;20.有效的括号https://leetcode.cn/problems/valid-parentheses/ 思路&#xff1a;遇到左括号直接进栈&#xff1b;遇到右括号判断站顶是否有匹配的括号&#xff0c;没有就返回flase&#xff0c;有就将栈顶元素出栈&#xff1…

2023年年终总结

又是一年到年底。趁着今天休息的空档&#xff0c;程序式的总结一下即将过去的2023年。 博客 先总结一下博客相关的数据吧。分为三块&#xff1a;CSDN博客、腾讯云开发者社区、微信公众平台。CSDN的数据从16年开始基本上都有统计&#xff0c;所以数据比较完整一些。公众号和腾讯…

《机器人SLAM导航核心技术与实战》第1季:第7章_SLAM中的数学基础

视频讲解 【第1季】7.第7章_SLAM中的数学基础-视频讲解 【第1季】7.1.第7章_SLAM中的数学基础_SLAM发展简史-视频讲解 【第1季】7.2.第7章_SLAM中的数学基础_SLAM中的概率理论-视频讲解 【第1季】7.3.第7章_SLAM中的数学基础_估计理论-视频讲解 【第1季】7.4.第7章_SLAM中的…

在Linux中对Nginx进行安全加固

准备工作 在IP为x.x.x.x的服务器上安装nginx&#xff0c;确保Linux系统为nginx环境。 检查nginx是否配置nginx账号锁定策略 配置nginx账号锁定策略&#xff0c;降低被攻击概率。 第一步&#xff0c;查看nginx的锁定状态。 命令&#xff1a;passwd -S nginx 若结果出现“P…

Java学习六、数组的定义与使用

一、数组的创建及初始化 数组是相同类型元素的集合&#xff0c;在内存中是一段连续的空间。 1.数组的创建 T[] 数组名 new T[N]; T&#xff1a;表示数组中存放元素的类型 N:表示数组长度 int[] array1 new int[10];//创建一个可以容纳10个int类型元素的数组 double[] array…

解决vue3+ts打包,ts类型检查报错导致打包失败,goview打包报错options

最近拉的开源大屏项目goview&#xff0c;在打包的过程中一直报Ts类型报错导致打包失败&#xff0c;项目的打包命令为&#xff1a; “build”: “vue-tsc --noEmit && vite build” 是因为 vue-tsc --noEmit 是 TypeScript 编译器&#xff08;tsc&#xff09;的命令&…

明道云入选亿欧智库《AIGC入局与低代码产品市场的发展研究》

2023年12月27日&#xff0c;亿欧智库正式发布**《AIGC入局与低代码产品市场的发展研究》**。该报告剖析了低代码/零代码市场的现状和发展趋势&#xff0c;深入探讨了大模型技术对此领域的影响和发展洞察。其中&#xff0c;亿欧智库将明道云作为标杆产品进行了研究和分析。 明…

【MySQL性能优化】- MySQL事务级别与锁机制

MySQL事务级别与锁机制 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&…

[云顶数模]2024美赛CEF题成品参考论文+配套数据集+可执行代码+运行结果图

E题社区抗灾能力综合评估与决策模型研究 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我们采用梯度提升树模型对社区基础设施、…

Enemy Rat(老鼠模型)

信息: - 模型有 1.491 个顶点。 - 纹理&#xff1a;颜色、法线、粗糙度、发射、金属、等级&#xff08;2048x2048 尺寸&#xff09; 下载&#xff1a; ​​Unity资源商店链接 资源下载链接 效果图&#xff1a;

NAS系统折腾记 – Emby搭建家庭多媒体服务器

Emby简介 Emby是一款优秀的媒体服务器软件&#xff0c;致力于为用户提供丰富的多媒体体验。通过Emby&#xff0c;您可以方便地在家庭内的各种设备上观看您喜爱的电影、电视剧和其他视频内容。而且&#xff0c;Emby还具备强大的媒体管理功能&#xff0c;让您的影视资源井然有序…

PSQL常用操作

目录 前言 准备工作 添加postgres用户 初始化数据库 启动服务 创建数据库 psql连接数据库 常规操作 数据库 schema相关 插件 其他 前言 老折腾&#xff0c;还是记录点啥吧...... 基于本地PG数据库(打包为绿色版本了)&#xff0c;实操记录&#xff0c;版本pgsql12…

大模型ReAct提示框架

Yao 等人于 2022 年引入了一个名为 ReAct 的框架&#xff0c;其中 LLM 用于以交错的方式生成推理轨迹&#xff08;reasoning traces&#xff09;和特定于任务的操作。 生成推理轨迹允许模型诱导、跟踪和更新行动计划&#xff0c;甚至处理异常。 操作步骤允许与外部源&#xff…

云尘 -- 铁三域控

描述&#xff1a; flag1 直接fscan开扫 发现存活两台机子123和141&#xff0c;其中141这台机子扫出来有ms17-010漏洞 继续信息收集&#xff0c;用nmap扫一波全端口&#xff0c;看看有没有遗漏 141这台机子一开始没扫到&#xff0c;看着提示使用-Pn再扫一遍就行了。因为如果当…

docker-学习-2

docker学习第二天 docker学习第二天1.docker和虚拟机的区别2.docker的底层隔离机制2.1 Namespaces(命名空间)2.1.1 什么是命名空间 2.2 Cgroups2.3 Union file systems2.4 Container format2.5 docker在底层如何做隔离的&#xff0c;如何进行资源限制的&#xff1f; 3. docker命…

ep-bg-purple-dark element-plus 不生效

element-plus 官网里面的 Layout 布局中的示例&#xff0c;官方文档中添加类名 class"grid-content ep-bg-purple-dark" 有相应的样式 import element-plus/theme-chalk/index.css //默认css样式 英文 import element-plus/dist/index.css 两…