【Chrono Engine学习总结】6-创建自定义场景-6.1-3D场景获取

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

Chrono可以导入自定义的三维模型,所以想自己搭建一个3D仿真环境。过程中遇到了一些问题,记录与整理。

1、3D环境的创建方法

Chrono的Irrlicht模块支持导入mesh贴图,因此可以用任何可以创建obj格式的工具创建一个3D环境。如何制作一个3D场景?我尝试了使用图像拍照环境然后重建、激光雷达扫描仪扫描真实环境重建、公开激光雷达数据集点云重建、以及直接绘制三维模型这几种方法。

1.1 COLMAP

首先是大量拍照然后采用COLMAP工具重建,总的来说效果一般,在没有纹理区域重建效果很差,而且重建的时间非常长。建的车棚,效果图如下,有大量的空缺区域:

1.2 手持激光雷达三维扫描仪

  • 其次,用尝试了用手持激光雷达扫描仪进行重建,使用的是留形科技的留形机360,建造了室内场景。客观评价,虽然点云看着很不错,但重建的效果有些差,而且探测距离只有40m左右,在大范围场景下效果肯定更差。下图分别是室外的(带颜色)点云,以及室内的重建。可以看出,重建效果有些差,不太能直接用于仿真。

1.3 高精度点云数据重建

还尝试了用高精度的公开点云数据集进行重建,采用的是MCD数据集,下图右下角是高精度的点云,真的精度非常高,但由于该数据集是用于SLAM任务,所以角度覆盖不是很好。用meshlab进行重建,可以看出,对于规则的平面/曲面重建还行,但树木效果就极差,同时还有大量的错误连通区域,造成后处理复杂。所以也没有采用。

1.4 三维设计软件进行制作

最后,可以尝试用三维设计软件进行制作,只要能够到处obj格式文件即可,solidwork、autocad等都行。我采用的是sketchup草图大师。

2、SketchUp草图大师绘制场景

这里略过SketchUp的基本操作,只放一下绘制的结果,以及一些注意事项。
注意事项

  • SketchUp2024比2023优化的好一些,不容易卡顿;
  • 卡顿的解决方法,参考知乎:
  • 模型尽量选择面元较少的,一般一个几十K上百K还能接受,如果有好几M,最终到处obj时会非常大,在chrono里面仿真会非常的卡。
  • 导出obj文件时,注意单位,以及把贴图也一并导出,配置如下:

3、Chrono中代码

Chrono中关键部分的代码如下,即添加obj格式的mesh,然后添加到system当中即可。注意chrono默认的添加单位是米,如果sketchup中设置不是m,或者solidwork等导出的可能是英寸/mm,需要在Transform函数中进行缩放。

cpp 复制代码
std::string scene_3d = "C:/Users/larrydong/Desktop/sketchup-obj/outdoor_simple.obj";
auto mmesh = chrono::geometry::ChTriangleMeshConnected::CreateFromWavefrontFile(scene_3d, true, true);
double inch_2_mm_scale = 0.0254;
mmesh->Transform(ChVector<>(-0, -0, -0.5), ChMatrix33<>(1));
auto trimesh_shape = chrono_types::make_shared<ChVisualShapeTriangleMesh>();
trimesh_shape->SetMesh(mmesh);
trimesh_shape->SetName("scene 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);
std::cout << "<-- Adding mesh. " << std::endl;
sys.Add(mesh_body);

运行截图:
左侧是lidar的扫描,右侧是场景。可以明显看出,场景中的东西颜色不正确,这是因为光照设置不合理。参考下一篇文档解决方法。

tif格式贴图加载的Bug:

导出obj格式时,sketchup有些贴图是tif格式,有些是png/jpg。tif格式在chrono加载时会出现路径的斜杠方向不正确:

显然,所有jpg格式的路径中都是/,而tif格式的前半部分路径变成了\,这个路径是通过obj所在路径自动加载的,所以没法修改。我也不知道为什么会出这个问题。如果出了这个问题,仿真时是会崩溃的。解决办法,就是把tif另存为png/jpg格式,然后修改xxx.mtl文件中的tif为png/jpg即可。

我也不知道为啥。

相关推荐
孟大本事要学习18 分钟前
算法第13天|继续学习二叉树:平衡二叉树(递归)、二叉树所有路径(递归)、左叶子之和(递归)
学习·算法
程序员Xu27 分钟前
Vulkan学习笔记6—渲染呈现
笔记·学习
梦境虽美,却不长37 分钟前
数据结构 学习 链表 2025年6月14日08点01分
数据结构·学习·链表
blackA_1 小时前
Javaweb学习——day3(Servlet 中处理表单数据)
学习·servlet
梦境虽美,却不长1 小时前
数据结构 学习 图 2025年6月14日 12点57分
数据结构·学习·
哆啦A梦的口袋呀2 小时前
基于Python学习《Head First设计模式》第十一章 代理模式
学习·设计模式·代理模式
Samesky0012 小时前
Oracle数据库学习笔记 - 创建、备份和恢复
数据库·学习·oracle
待什么青丝3 小时前
【linux】驱动学习问题及解决方法
linux·数据库·学习
派阿喵搞电子3 小时前
学习昇腾开发的第二天--PC机远程登录开发板
学习·昇腾
虾条_花吹雪6 小时前
5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇
数据库·人工智能·学习·spring·ai