5.6 进阶功能
5.6.1 RflySim3D内创建三维场景
通过鼠标键盘快速创建三维场景
- 双击桌面的RflySim3D的快捷方式,打开一个窗口
- 在窗口中按下键盘“M”键,进行地图切换,反复按下“M”键,直到切换到“VisionRing”地图.
注:这里也可以采用“M+数字”组合键,例如在我的上图例程中,VisionRing地图排名第9,也可以按下键盘“M9”来快速切换到第9个地图
- 滚动鼠标中轮,滚动到绿色圆环靶标根部,并用鼠标双击。如下图所示,可以读到双击位置的坐标信息“Click Point”,例如下图是44.062,1.601,-0.04
- 在
\PX4PSP\RflySim3D\RflySim3D\Plugins\Rfly3DSimPlugin\Content\XML
文件夹下(即PX4PSP安装目录),找一下圆形靶标对应的模型XML文件,这里我的名字为Ring_Target_Green.xml
- 双击XML文件打开,找到其中的模型类别码ClassID,例如下图是150
- 返回RflySim窗口,在键盘上输入“O150”(英文O键+数字150),即可在刚才双击的地方创建一个ClassID类型为150的物体。可以看到,现在的样式为红色,并不是我们想要的绿色。这是因为,红绿蓝三种红圆圈靶标的ClassID都是150,但是显示序号DisplayOrder有一定区别
- 按下键盘的“C”键,直到靶标颜色变为绿色样式。注意,因为下图中绿色靶标的样式排在第3位,也可以使用快捷键“C3”来快速切换到当前ClassID下的第三种样式
- 在此按下“O”键,可以快速删除刚才创建的物体,也就是绿色圆形靶标。
- 另一种快速生成绿色圆形靶标的方法是,按下键盘的“O+样式序号+ClassID”的形式,例如上面例子中,样式序号是2,ClassID是150,因此按下键盘“O2150”即可快速创建圆形靶标,并切换到绿色。效果如下图,与上面的结果一样
- 还可以发现,我们的靶标是中心在地面,而场景中已有的靶标是最低点在地面上,这是因为XML文件中,没有设定圆心到地面的偏移值CenterHeightAboveGroundCm。下面将介绍如何设定本值,是的物体创建后,直接最低端在地面上(通常创建障碍物需要如此)
- 在刚才的窗口中,通过鼠标拖曳,将视角定位到创建的绿色靶标的底部(将鼠标箭头放在RflySim3D场景的地面上,然后向后滚动鼠标中轮),然后用鼠标左键双击。此时可以读到击中点Click Point坐标Z轴为11.425(单位m)。然后,将视角重新拖回到地面上,双击想要放置物体的地面区域
可以看到如下图所示,击中的物体为地面Floor,击中点Click Point的Z坐标为-0.04(单位m)。两者相减,可以得到物体中心到地表面的距离为11.425-(-0.04)=11.465m=1146.5cm。注意到场景中Scale在三个方向都缩小了0.5倍,因此物体中心到地面的实际值应该是1146.5cm*2=2293cm(注意,如果Scale都是1,没有缩放,则直接使用1146.5即可,不需要再除以缩放倍数)
- 复制一份“Ring_Target_Green.xml”文件,命名为Ring_Target_Green1.xml
修改ClassID为160(或其他在场景中没使用的数字)、Name(根据需求修改,非必须)、CenterHeightAboveGroundCm(设定为刚才记录的高度值,单位厘米),示例修改如下
- 关闭RflySim3D窗口,再重新打开RflySim3D程序,切换到VisionRing场景,然后在草地上双击一下,再按下键盘“O160”,就能得到一个底部在地面上的原型靶标了(和场景中自带的靶标一模一样)
- 同理,可以通过导入其他的三维模型,调整好地面高度,然后用键盘输入的方法创建更多的三维物体,包括障碍物、靶标、人物、飞机等。当然也可以直接调用场景中自带的物体,例如“O3”对应多旋翼系列,“O100”对应固定翼,“O6”对应六旋翼,“O30”对应人物,等等。在
\PX4PSP\RflySim3D\RflySim3D\Plugins\Rfly3DSimPlugin\Content\XML
目录中,可以查看所有的RflySim3D中已有的模型信息
通过Python脚本创建场景
- 通过Python脚本的话,不强制需求修改XML文件使得物体中心要配置到地表,但是需要调整物体发送的Z轴坐标,使之底部位于地表
- 首先,打开RflySim3D程序,并按下“M”键切换到VisionRing地图
- 依次将视角拖动到三个靶标的根部,双击根部的地面位置,得到期望放置靶标的坐标位置
- 从上面三个图可知,绿、蓝、红三个靶标的地面位置分别为[43.943,1.620,-0.04],[72.946,-4.388,-0.04],[115.915,5.510,-0.04]
- 以
\PX4PSP\RflySimAPIs\PythonVisionAPI\1-PX4MavCtrlAPITest\UE4CtrlAPITest.py
为模版,创建一个三维物体创建的程序。分别放置绿、蓝、红三个靶标到场景中 - 根据上一节第9步的例子,绿色圆形靶标的ID为2150,同样的道理蓝色为1150,红色方框靶标的ID为151(需要看XML文件Quad_Target_Red.xml)。因此,发送靶标的代码可以表示为
mav.sendUE4Pos(1,2150,0,[43.943,1.620,-0.04],[0,0,0])
mav.sendUE4Pos(2,1150,0,[72.946,-4.388,-0.04],[0,0,0])
mav.sendUE4Pos(3,151,0,[115.915,5.510,-0.04],[0,0,0])
但是,由于没有考虑圆心到地面的高度,我们生成的圆靶标都不是底部贴在地面上
根据,每个物体中心到底部的高度差,可以得到绿色和蓝色圈需要上移11.465m(见上一节的第11步,这里不需要考虑XML里面的缩放),红色方框靶标需要10.448m。因此,重新调整后的物体创建语句为mav.sendUE4Pos(1,2150,0,[43.943,1.620, -11.465],[0,0,0])
mav.sendUE4Pos(2,1150,0,[72.946,-4.388,-11.465],[0,0,0])
mav.sendUE4Pos(3,151,0,[115.915,5.510,- 10.448],[0,0,0])
- 演示例程。可以运行
RflySimAPIs\UE4MapSceneAPI\ObstacleCreate\ TargetCreateDemo\TargetCreateDemo.bat和TargetCreateDemo.py
来观察在空白场景中复现VisionRing三个环的例子 - 演示例程2。可以运行
RflySimAPIs\UE4MapSceneAPI\ObstacleCreate\ TargetCreateDemo\TargetCreateDemo
2.bat
和TargetCreateDemo2.py
来观察在OldFactory中创建三个环的例子
场景布置与地形匹配
- 上述sendUE4Pos接口需要详细地设定物体的xyz坐标,因此如果想要物体完全贴在(站在)地面上,就需要去测量地表的高度,这个可以通过在RflySim3D中双击地面想要放置靶标的位置,就能在Click Point中读出z的坐标
例如,打开RflySim3D程序,在山地上任意双击一个点,得到如上图所示界面。可以读到坐标为-16.479,1.45,-177.181
- 因此我可以通过如下指令,创建一个人(XML中心已调到脚底),令其脚底站在山地上。
mav.sendUE4Cmd(b'RflyChangeMapbyName MountainTerrain')
#切换到山地地图time.sleep(10)
# 等待地图切换完成mav.sendUE4Pos(100,30,0,[ -16.479,1.45,-177.181],[0,0,math.pi])
#发送人、坐标和姿态,可以看到效果如下图
- 除了sendUE4Pos函数,我们还提供了一个自动确定地面高度,将物体挪至地表的接口函数sendUE4Pos2Ground,使用方法如下
mav.sendUE4Pos2Ground (101,30,0,[ -17.479,1.45,0],[0,0,math.pi])
# 发送人、坐标和姿态。我们在刚才创建的人前方创建一个新的人,上述脚本中可以看出,z轴没有特意设置地面高度,而是设置为了0。效果如下图所示
可见sendUE4Pos2Ground接口可以轻松创建地表的障碍物、靶标等物体,而不需要再去确定地形高度。但是,如果要创建一些天空中的物体,或者空中运动靶标,还是需要使用sendUE4Pos接口并设置好轨迹 本节的例程可见
RflySimAPIs\UE4MapSceneAPI\ObstacleCreate\TargetPlaceDemo\ TargetPlaceDemo.py
中。RflySim三维物体使用与生成方法
每个飞机(或三维模型)对应一个XML文件,目录见:
\PX4PSP\RflySim3D\RflySim3D\Plugins\Rfly3DSimPlugin\Content\XML
- XML文件中“ClassID”对应了模型的类型(多旋翼、固定翼、人),“DisplayOrder”对应了本模型的排列顺序,“AR_Drone_Army”对应了模型的名字。
- 目前ClassID有下列选择:3(四旋翼)、30(人物)、40(标定板)、100(固定翼飞机)、5和6(六旋翼)、60(发光体)、151(方形环)、150(圆形环)、152(球形)、50(小车)
- 可以用Python发送一条创建物体命令
mav.sendUE4Pos(copterID,vehicleType,MotorRPMSMean,PosE,AngEuler,windowID=-1)
来向RflySim3D创建一个物体,其中vehicleType对应了上文中的“ClassID”可以选择飞机的大类样式,copterID对应的是飞机的标号,其他的按例程填写即可。 例如:mav.sendUE4Pos(100,30,0,[2.5,0,-8.086],[0,0,0])
表示飞机序号100,样式是3,旋翼转速为0,位置在[2.5,0,-8.086],姿态欧拉角是[0,0,0] - 例如发送一个vehicleType=3的消息给RflySim3D,然后按下键盘C键,就可以看到目录下面的所有飞机模型序号
- 在上图的窗口按下C+数字,可以快速切换到需要的小样式。
- 也可以在mav.sendUE4Pos的命令中直接发送vehicleType来直达需要的样式,格式是:大样式+小样式*1000。例如,vehicleType=5003,表示大样式3,小样式5
- 更具体的搭建三维模型+场景,以及控制模型运动的方法见课程“RflySim高级版_第05讲_UE4三维场景开发.pdf”
- 要获取物体的三维网格信息,需要按上面的pdf步骤,安装3Ds Max和UE 4.22引擎,然后按下列步骤来。
- 定位到插件文件夹
- 选中一个物体,此时可以看到物体的三维尺寸信息,这里单位是cm,厘米,粗略用途的话,可以用这个值
- 注意,物体在RflySim3D中的实际尺寸,还和XML文件中的放缩标签密切相关。一般的xml文件都是1,也就是说RflySim3D中显示尺寸就是实际尺寸。也有小部分不是1的。例如,标定板是通过1*1的实际平板乘以0.6和0.84的系数,得到了0.6m*0.84m的一个标定板
- 更为精细的模型尺寸和网格获取方法见下面的步骤,首先选中一个模型,右键菜单中有导出按钮,得到fbx文件。
- 得到fbx文件,可以用3Ds Max导入,可以查看更细节的尺寸,也可以导出obj等其他网格格式。
5.6.2 飞机三维模型蓝图特效导入流程
- 虚幻商城搜索“Vigilante”,以C130-J Transport(West)为例子。
- 使用4.27版本的虚幻引擎,创建一个空白工程,将C130-J添加到创建好的工程中。(打开光线追踪)
- 下图中可以看到BP_West_Transport_C130J的蓝图飞机,因为只需要一个蓝图,删除 BP_West_Transport_C130J_Showcase,同时删除多余的场景文件level,另外重命名最外层的VigilanteContent文件夹为WestTransportC130J(便于后续的访问和分享)
- 双击打开“ BP_West_Transport_C130J”蓝图,将其自带的触发事件删除,下图中的红色模块。
- 鼠标在空白处右击->添加事件->添加自定义事件(通过自定义事件来替换上述红色模块)
- 将自定义事件命名为“ActuatorInputs”,并在右侧“输入”端创建8维的(pwm1~pwm8)的输入信号,作为基础8维的执行器输入信号。
- 在创建一个名为“ActuatorInputsExt”的自定义事件,添加Pwm9~Pwm24的16维输入信号,作为9~24维扩展执行器输入信号接收端。
- 注意:前面创建的两个自定义事件的名称必须为“ActuatorInputs”和“ActuatorInputsExt”,维度必须为8维和16维,如果没有这两个自定义事件,飞机无法触发执行器的动作或动画。
- 将ActuatorInputs的pwm输出端一次连接到各个舵面控制输入上,8维信号连接顺序为(白色的先确定了代码执行顺序),(推荐顺序:SetPropellerSpeed
、SetStablizersL、SetStablizesR、SetAileronL、SetAileronR、SetRudder、SetFlapsL 、SetFlapsR)
- ActuatorInputsExt的输出口可以连接其他的执行器。(推荐顺序: RetractFrontWheel、RetractRearLWheel、RetractRearRWheel、OpenRamp、OpenRearLDoor、OpenRearRDoor、OpenFrontDoor、Set damaged model)
- 注意:毁伤模型里面,要通过浮点数来触发毁伤,需要增加浮点数判断(右键,搜索“大于”,找到“浮点数>=浮点数”)模块,设定大于等于1才触发毁伤。其他数据默认即可
- 点击“保存”和“编译”,使蓝图生效,然后关闭蓝图窗口,烘焙文件。
- 在【项目文件夹】-> Saved -> Cooked -> WindowsNoEditor -> 【项目名】 -> Content目录中,可以拷贝出刚才渲染的“WestTransportC130J”文件夹。
- 编写XML文件(核心部分)
一个典型例子见RflySimAPIs\UE4MapSceneAPI\BluePrintModel\WestTransportC130J\WestTransportC130J.xml<?xml version="1.0"?> <vehicle> <ClassID>110</ClassID> <DisplayOrder>1000</DisplayOrder> <Name>WestTransportC130J</Name> 这里是飞机的名字 <Scale> 这里设置飞机的缩放尺寸 <x>0.1</x> <y>0.1</y> <z>0.1</z> </Scale> <AngEulerDeg> <roll>0</roll> <pitch>0</pitch> <yaw>0</yaw> </AngEulerDeg> <body> <isAnimationMesh>2</isAnimationMesh> 这里是关键!!!取值为2时是蓝图模型导入方式,取值为0是默认的mesh网格,取值1为动画网格 <MeshPath>/Game/WestTransportC130J/Vehicles/West_Transport_C130J/BP_West_Transport_C130J</MeshPath> 这里是飞机蓝图路径 <MaterialPath></MaterialPath> <AnimationPath></AnimationPath> <CenterHeightAboveGroundCm>237</CenterHeightAboveGroundCm> <isMoveBodyCenterAxisCm>0,0,-237</isMoveBodyCenterAxisCm> 上面这两句也很关键,因为导入蓝图默认坐标中心在地面,导致飞机进行欧拉角旋转时,以地面中心为轴而不是以机体为中心。isMoveBodyCenterAxisCm可以将飞机进行实体进行平移0,0,-237(z轴向上为正)相当于飞机网格整体向下移动237cm,使机体中心挪到地面中心,两者轴心合一。CenterHeightAboveGroundCm是告诉RflySim3D飞机中心距底端的距离,确保发送飞机位置0 0 0时,能底端触地。 <NumberHeigthAboveCenterCm>200</NumberHeigthAboveCenterCm> <NumberSizeScale>10</NumberSizeScale> </body> <OnboardCameras> <camera> <name>Chase_Camera</name> <RelativePosToBodyCm> <x>-4000</x> <y>0</y> <z>1000</z> 这里设定了跟随视角的位置,z轴向上为正,单位cm。 </RelativePosToBodyCm> <RelativeAngEulerToBodyDeg> <roll>0</roll> <pitch>0</pitch> <yaw>0</yaw> </RelativeAngEulerToBodyDeg> </camera>
- 开发Simulink测试程序,查看WestTransportC130JDemo.slx例程文件。(一个典型例子见RflySimAPIs\UE4MapSceneAPI\BluePrintModel\WestTransportC130J\WestTransportC130JDemo.slx)
- 将1~26维执行器数据发送到样式ID(VehicleType)为110的飞机即可,拖动滑块或者改变每一维的数,可以改变飞机样式。
- 将烘焙好的WestTransportC130J文件夹,XML文件,slx文件,按WestTransportC130J.zip所示的目录结构进行打包,即可得到场景发布压缩包。
- 将打包文件中的所有内容拷贝到PX4PSP目录下面,替换原有文件。运行WestTransportC130JDemo.slx,可以测试导入效果。相比于之前的mesh或者动画导入方式,本方法提供更加复杂的三维控制功能,例如,最后一项飞机crash的动画,以及后面的打开舱门等动作。本接口直接加载一个蓝图Actor作为飞机主体模型,在蓝图中可以自行编程决定每一位执行器对应的动画,甚至可以通过本蓝图去控制场景里面的风向、天气、光线等等。当然,也可以用于发射导弹,变换飞机形态,等等。
- 测试
· 重新打开RflySim3D软件
· 在场景中双击一下
· 按下键盘O110四个字母,可以创建一个飞机(样式ID为110,对应XML中的ClassID)
· 按下键盘“V”键,调整到合适视野
· 按下键盘左上角“`”的一撇按键,进入命令行
· 然后复制下列指令
· RflySetActuatorPWMsExt 1000 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
· 在RflySim3D的命令行用CTRL+V,粘贴命令,并回车
· 可以看到飞机爆炸场景。
· 上述指令向1000号ID的飞机(双击+O按键创建物体的ID默认1000开头),发送第9到24位执行器数据,这里我们将第16位赋值为1(对应蓝图爆炸场景),可以触发爆炸动画。
· 也可以通过RflySetActuatorPWMs 1000 pwm1...pwm8来控制前8维执行器。
· 这里也提供一个Python控制的例子,打开python文件和Rflysim平台,运行python文件几秒钟后飞机爆炸。UE4MapSceneAPI\\BluePrintModel\\WestTransportC130J\\WestTransportC130JDemo.py。
免费版只能接收前8维执行器数据,无法接收9到24维数据,因此无法直接观察到效果。免费版用户,可以将爆炸的端口移到ActuatorInputs的第8维,然后修改Simulink,Python和UE4命令,即可观察效果。
5.6.3 基于Twinmotion的近地面场景构建
Twinmotion场景构建及导入示例
- 打开Epic Games,在Epic Games左侧点击虚幻引擎,然后在跳转的页面上方点击Twinmotion,然后点击安装即可(这里使用的是Twinmotion试用版2022.1.2),Twinmotion教育版可前往Twinmotion官网申请。
- 安装完Twinmotion之后,前往虚幻商城搜索Twinmotion,安装“Datasmith Twinmotion导入器”和“面向虚幻引擎的虚幻内容”。
- Twinmotion界面介绍
- 打开Twinmotion,点击停靠栏左上角的导览列 -> 演示场景 -> Materials room, 然后使用快捷键 Ctrl + Shift + S 保存打开的演示场景(打开演示场景的时候会弹出是否保存当前场景的对话框,点击否即可),保存的文件以(.tm)为后缀,文件命名时请使用英文。
- 启动UE 4.27,创建一个新项目,选择游戏 -> 空白 -> 创建项目,创建项目时启用光线追踪,不带初学者内容包,使用英文名给项目命名。
- 在UE4中启用Twinmotion相关插件(菜单栏 -> 编辑 -> 插件),搜索Twinmotion,勾选两个插件,然后重启UE编辑器。
- 在世界大纲视图删除所有条目,使其变成全黑窗口,方便进行后续的场景导入,避免产生冲突。
- 使用工具栏的DataSmith工具,选择并导入之前保存的Twinmotion场景文件,导入时会弹出选项窗口,这里选择最高分辨率保证显示效果。
- 导入后显示效果
- 点击工具栏构建 -> 构建光照。
- 构建光照后表面材质变形了,选中材质变形的静态网格体,将其移动性改为固定或可移动,然后重新构建光照。
- 建筑外侧可能会出现漏光现象
- 这些为Twinmotion场景内的矩形光源,可以选中这些光源然后修改其位置或大小(也可以删除后自行在UE4上重新放置光源),来使光源完全位于建筑内部。(更改后重构光照)
- 配置飞机起飞原点:在场景中拖入一个“Player Start”,将“Player Start”的坐标设置为0 0 0,将导入的场景在世界大纲中选中,然后 鼠标右击 -> 附加到 -> Player Start,将所有物体绑定在“Player Start”坐标系下。
- 往场景中拖进一个小球,坐标设为 0 0 0 ,修改“Player Start”的坐标,使得小球的位置(也就是UE4的[0,0,0]坐标)的位置,位于我们期望的位置,例如房间的地板上(0 0 0 为无人机生成位置)。
- 场景中心的调整已经完成,进行保存操作。
- 碰撞设置,选中静态网格体(需要启用碰撞的物体),双击下图所示位置。
- 更改碰撞复杂度为,将复杂碰撞用作简单碰撞。
- 新建一个文件夹,将场景保存再改文件夹中(Ctrl + S),直接放置内容文件夹下不利于后续场景打包和发布。
- 在 编辑 -> 项目设置 -> 打包 中将 “使用pak文件” 和 ”共享材质着色器代码“ 取消勾选。
- 保存关卡,进行烘焙(菜单栏 -> 文件 -> 烘焙Windows的内容)。
- 烘焙完成后,需要将烘焙文件需要拷贝至PX4PSP\RflySim3D下的三个文件
。 [项目名] -> Saved -> Cooked -> WindowsNoEditor -> [项目名]-> Content 拷贝至 PX4PSP -> RflySim3D -> RflySim3D -> Content下.
。 [项目名] -> Saved -> Cooked -> WindowsNoEditor -> Engine -> Plugins -> Marketplace -> TMtoUnrealContent 拷贝至 PX4PSP -> RflySim3D -> Engine -> Plugins -> Marketplace -> TMtoUnrealContent下.
。[项目名] -> Saved -> Cooked -> WindowsNoEditor -> Engine -> Plugins -> Enterprise -> DatasmithContent 拷贝至 PX4PSP -> RflySim3D -> Engine -> Plugins -> Enterprise -> DatasmithContent下.
。上述路径下的文件直接拷贝至对应路径下即可. - 此时, 打开RflySim3D, 按M键就可以切换到刚才导入的场景, 看到纹理即可.
- 在RflySim3D中,按下键盘左上角 ` 键后键入 RflyScanTerrainH 左下角X 左下角Y 右上角X 右上角Y 高度H 间隔I,当前场景使用 RflyScanTerrainH -20 -20 20 20 1 0.1(40米边长的矩形区域,1米高度向下扫描,0.1米扫描间隔)。
- 在RflySim3D启动文件处会生成两个文件。
- 将生成的两个文件拷贝至 CopterSim -> external -> map 下,然后启动 RflySim3D 和 CopterSim,选中联机即可通过CopterSim来切换场景。
- 文件备份,建一个空白文件夹,建立RflySim3D和CopterSim两个文件夹,在一次建立目录。
- CopterSim -> external -> map (将RflyScanTerrainH生成的文件放置此处)
- RflySim3D -> content(烘焙文件)
- RflySim3D -> Engine -> Plugins -> Marketplace -> TMtoUnrealContent(烘焙文件)
- RflySim3D -> Engine -> Plugins -> Enterprise -> DatasmithContent(烘焙文件)
- 将对应内容拷贝进去,然后选中CopterSim和RflySim3D两个文件夹,右键压缩成zip(更新平台时,自己导入的场景会被删除,这种方法可以备份场景,方便下次导入)
也可以将场景文件的zip包,拷贝到安装包的RflySimAdv3Full-**\4.HILApps\scenes427目录,这样更新平台或全新安装时,场景会自动导入,便于分发给他人使用。
创建自定义场景
- SketchUp软件安装和教程
。https://pan.baidu.com/s/16aa14VD0N7z3xRB0TucsAA 密码:3333
。 解压文件后,打开Setup文件下的Setup.exe来安装程序。
。安装完后,将Crack文件下的(LayOut,Style Builder,SketchUp)拷贝至安装好的目标程序目录下(通过右击快捷方式来打开文件位置),拷贝过去直接替换目标中的文件即可。
。SketchUp软件入门教程: 【合集】很详细的新手教程! SketchUp全套新手基础入门精品教程_哔哩哔哩_bilibili - SketchUp建模
。画出房子占地,并划分区域(15600mm, 12000mm)
。设定墙体厚度为(120mm),使用偏移工具(快捷键F)
。上图可以看见该平面为反面,选中改平面 鼠标右击 -> 反转平面。
。选中墙体部分,使用推拉工具拉升至3000mm。
。选中墙体一块平面,使用移动工具,按住Ctrl复制该平面至一旁,在复制的平面上绘制门和窗。
。将绘制好的门和窗放置规划位置。
。绘制阳台,画好栏杆后使用按住Ctrl使用移动工具复制,然后输入*n可以等距复制n个对象。
。绘制台阶
。在各个平面贴上合适的材质。
。对房屋进行封顶操作,还可以在房子周围绘制多个平面,给予不同的材质来创建一个环境。
- Datasmith插件安装
。Twinmotion Datasmith Exporter plugin for SketchUp Pro - Twinmotion
。安装插件时关闭SketchUp和Twinmotion,下载后直接打开无脑安装即可。
。安装完成后即可看见插件,如果看不见可以在 视图 -> 工具栏 打开插件。
- 将SketchUp场景导入Twinmotion优化
。打开SketchUp建模好的场景,打开Twinmotion 导入 -> 直链 (选择材质合并) -> 导入。
。在SketchUp中点击Datasmith插件的第一个按钮。
。返回Twinmotion中即可看见导入的场景。
。删除Twinmotion场景中的地面和背景,地面选中后Delete,设置 -> 位置 -> 背景图片, 将背景图片设置为无。
。进行材质替换,使用Twinmotion资源库中的材质替换掉导入场景的材质。
。添加一定的植被和路面贴图路灯等。
。使用Ctrl + Shift + S保存当前场景。 - 将场景导入UE4中,因为这是室外场景,在将场景导入后添加(定向光源,天光,大气雾照亮当前场景),使用lightmass框选导入的场景区域避免光照构建失败。
。将树木的移动性改为固定或可移动的。
。构建光照。
。将烘焙后的文件拷贝至RflySim3D平台。
5.6.4 基于Cesium的全球大场景构建
场景测试
- 直接双击运行“SITLRun_ChangSha.bat”可以打开一个长沙的场景(注:主要在SITLRun.bat上改了地图名字为Changsha和RflySim3D目录为RflySim3D426)
- 在RflySim3D的窗口中按下键盘“P”,开启物理碰撞引擎,看到飞机落到地表
- 在QGC中起飞、解锁、点击左上角的足球场,观察RflySim3D是否能一致
- 上面地形基本趋于平地,运行“SITLRun_MoutainRoad.bat”可以打开山地地形。和上面步骤相同,查看RflySim3D与QGC在山地地形中的匹配情况
任意指定GPS坐标的三维仿真
- 双击“SITLRun_EarthMap.bat”可以打开一个三维场景,本场景的坐标为北航体育场入口处。打开“\PX4PSP\CopterSim\external\map\EarthMap.txt”,其最后三个数字为:纬度(度)、经度(度)和高度(m),本GPS坐标会发送给QGC和RflySim3D实现地图统一
- 创建新的自定义坐标地图的方法有两种,第一种是直接修改“EarthMap.txt”的最后三行;第二中方法是复制一份“EarthMap.txt”和“EarthMap.png”,将两者改名为EarthMap打头的任意名字,例如EarthMap1.txt和EarthMap1.png,同时也要修改.bat中地图名字为EarthMap1即可
- 指定另一个GPS坐标作为仿真起点的方法。首先,Bing地图搜索目标位置,粗选出GPS坐标,填入上一步新建的地图场景中。然后,运行.bat文件,起飞后,在QGC的地图中选定期望的目标点,让飞机飞到目标位置,从Mavlink消息中读取当前的GPS坐标值。最后,将上述坐标值填入到第二步的地图场景中,就能得到期望起点的地图了
- 在C:\PX4PSP\CopterSim\external\map目录下面查看ChangSha.txt、Denver.txt、MoutainRoad.txt等地形校准文件,查看最后三位的纬度、经度,并去Bing地图上确认坐标,熟悉CopterSim的GPS坐标定位体系
导入高精度的大场景
- 运行“SITLRun_Denver.bat”,这个是Cesium提供的一个在线大城市地图场景,可以在其中做一些交通管理的工作。注:将来我们可以将自己的场景都放在云端,建立一个仓库,这样所有用户可以直接访问我们扫描的地图
- 使用本地地图文件的方法。这里需要上使用Cesium的专用3D Tiles地图格式“.b3dm”,首目录下有一个“tileset.json”文件,这里可以参考“D:\RflyMaps\Map1”
- Cesium官方提供了一个文档来进行转换https://github.com/CesiumGS/3d-tiles 上面有几种方法可以实现现有场景的转换。https://blog.csdn.net/weixin_43316655/article/details/108004906 上面这个链接有介绍如何用自己的飞机来航拍摄影
- 双击运行“SITLRun_MapData.bat”可以打开一个场景,它会自动检索D:\RflyMaps\Map*文件夹(目前支持5个文件夹,Map1已经放我自己的一个小地图),能看到下图三维的桥,说明本地地图文件导入成功
- 注意:MapData也可以任意改变GPS坐标值(例如MapData1.txt,MapDataHongKong.txt之类),方法和EarthMap相同。因此,我们可以在5个MAP文件夹中分别存放五个起落机场的细节场景,然后通过设置起飞原点为任意一个机场
倾斜摄影地图转换(以香港地图为例)
- 需要的工具:
- 香港的航拍摄影数据:https://www.pland.gov.hk/pland_en/info_serv/3D_models/download.htm
- OSGB航拍摄影格式转换为3D Tiles的工具CesiumLab, http://www.cesiumlab.com/ 安装文件请自行下载,安装后使用前需要注册一下
- 正确组织文件结构,航拍摄影数据通常包含
- 一个“metadata.xml”里面存储着本次航拍摄影使用的坐标系和GPS坐标参考原点
- 一个“Data”文件夹,里面存储着若干瓦片文件夹,例如“Tile+031+010”
- 我的HongKong文件夹已经准备了部分正确的格式
- 下载香港地区的瓦片和元xml文件,网址见https://www.pland.gov.hk/pland_en/info_serv/3D_models/download.htm
- metadata.xml文件夹可以上面网页下载,点击下图链接
- 下载瓦片数据:可以在地图上勾选感兴趣的瓦片,一次最多下载6个
- 例如,下载得到“Tile+031+010OSGB.zip”,将解压得到的“Tile+031+010”文件直接拷贝到文件夹“Data”即可。同理,可以下载“Tile+030_+010_OSGB.zip”拷贝到文件夹中。注:例程中已经下好了这两个文件夹(见UE426Demos\UE4MapSceneAPI\HongKongMap\HongKong),可以直接使用
- 重复上述步骤,下载尽量多的瓦片,可以构成香港的一个较大场景
- metadata.xml文件夹可以上面网页下载,点击下图链接
- 转换为Cesium能识别的3D Tiles格式
- 安装cesiumlab2_2.3.8.exe,并注册。(免费的)
- 点击下图的“数据处理按钮”
- 进入“倾斜模型转换V3”,并定位到HongKong/Data文件夹,他可以自动识别出零点坐标和瓦片数量
- 设定好输出路径后,点击确认,等待转换完成
- 将下面得到的文件,拷贝到“D:\RflyMaps\Map2”文件夹
- 将下面得到的文件,拷贝到“D:\RflyMaps\Map2”文件夹
- 新建一个MapDataHKTest.txt和MapDataHKTest.png文件(例程见UE426Demos\UE4MapSceneAPI\HongKongMap文件夹),在txt的最后加入逗号分隔的三位数字,表示坐标原点的经纬高信息,在本例中设置坐标点为22.3162698,114.2267985,40(这个坐标可以通过Bing地图或百度地图中粗略选择,后续再细调,高度也需要细调到贴近地面以上),将上述两个文件拷贝到\PX4PSP\CopterSim\external\map目录。注:只需要保证前缀MapData不变,后面的字符可以任意修改,得到不同区域的地图,例如MapDataBeijing
- 新建一个SITLRun_MapDataHKTest.bat文件(例程见UE426Demos\UE4MapSceneAPI\HongKongMap文件夹),用文本编辑打开,并修改地图代码为
“SET UE4_MAP= MapDataHKTest”
“tasklist|find /i "RflySim3D.exe" || start %PSP_PATH%\RflySim3D426\RflySim3D.exe” - 运行一个飞机后,如下图所示,可以看到香港的高楼场景了
由于城市级别地形的精度不够高,飞远一点看效果更好
- 地形高度匹配方法
上述方法导入的城市地形高度与Bing地图的地形高度不一定统一。如下图所示,用鼠标右键将视角向下拖动,可以看到街道在地表下方的现象(街道水平面不统一,个别地形导入进来也可能在地表上方)
因此需要调节导入城市地形的高度值。理想的地形高度设置是导入的城市地形,略高于Bing全球地表地形高度(将其盖住)- 在导入的高精度城市街道地图上双击,得到一个点的高度,例如这里是Z=21.6
- 向上拖动视角到地表平面,得到Bing地图上的地形高度为1.707
- 两者做差可知,需要将导入的城市地图向上移动35m左右(加足够的裕度)
- 修改metadata.xml文件,将
835786,820849,0 内的第三项,海拔高度改成35(注意这里单位是m,水平微调的话,也可以调整前两个值)
- 重复步骤三。在此运行bat脚本,可以看到街道已经在地表上方了
- 再通过QGC选择合适的经纬度坐标,并根据地形高度,选择合适的高度,写入到MapDataHongkong.txt最末尾三位,可以得到较好的显示效果
固定翼集群飞行场景(以香港地图为例)
- 在导入的高精度城市街道地图上双击,得到一个点的高度,例如这里是Z=21.6
- 联系 service@rflysim.com 获取我们下载并配置好的香港地区的三维场景文件“HongKongMap.zip”,然后手动将其解压并拷贝到D:\RflyMaps\Map(找一个空的文件夹即可)。或者将HongKongMap.zip拷贝到安装包中的4.HILApps\maps目录,在平台安装时会自动安装到D:\RflyMaps\Map路径
- 运行“UE426Demos\OtherVehicleTypes\AircraftMathworks”文件夹内的“AircraftMathworksSITLRun.bat”文件,输入飞机数量,即可看到香港地区地图
- 在QGroundControl中绘制飞机的飞行航路,即可实现固定翼在香港高楼间飞行的例子
注意:导入城市级大地图的时候,容易因电脑内存/显存不够而报如下错误:“TEXTURE STREAMING POOL OVER**MIB BUDGET”
有两种解决方案:- 直接按下键盘“H”,可以隐藏所有文字提示,包括报错和RflySim自带的提示
- 先按下键盘左上角的“~”键(TAB上面那个键),然后输入如下命令:
r.streaming.Poolsize 2000
其中,2000的单位是MB,对应了分配的内存,可根据场景和地图实际尺寸来增加或减少