5.6 进阶功能

本节导航


5.6.1 RflySim3D内创建三维场景

通过鼠标键盘快速创建三维场景

  1. 双击桌面的RflySim3D的快捷方式,打开一个窗口
  2. 在窗口中按下键盘“M”键,进行地图切换,反复按下“M”键,直到切换到“VisionRing”地图.
    :这里也可以采用“M+数字”组合键,例如在我的上图例程中,VisionRing地图排名第9,也可以按下键盘“M9”来快速切换到第9个地图
  3. 滚动鼠标中轮,滚动到绿色圆环靶标根部,并用鼠标双击。如下图所示,可以读到双击位置的坐标信息“Click Point”,例如下图是44.062,1.601,-0.04
  4. \PX4PSP\RflySim3D\RflySim3D\Plugins\Rfly3DSimPlugin\Content\XML文件夹下(即PX4PSP安装目录),找一下圆形靶标对应的模型XML文件,这里我的名字为Ring_Target_Green.xml
  5. 双击XML文件打开,找到其中的模型类别码ClassID,例如下图是150
  6. 返回RflySim窗口,在键盘上输入“O150”(英文O键+数字150),即可在刚才双击的地方创建一个ClassID类型为150的物体。可以看到,现在的样式为红色,并不是我们想要的绿色。这是因为,红绿蓝三种红圆圈靶标的ClassID都是150,但是显示序号DisplayOrder有一定区别
  7. 按下键盘的“C”键,直到靶标颜色变为绿色样式。注意,因为下图中绿色靶标的样式排在第3位,也可以使用快捷键“C3”来快速切换到当前ClassID下的第三种样式
  8. 在此按下“O”键,可以快速删除刚才创建的物体,也就是绿色圆形靶标。
  9. 另一种快速生成绿色圆形靶标的方法是,按下键盘的“O+样式序号+ClassID”的形式,例如上面例子中,样式序号是2,ClassID是150,因此按下键盘“O2150”即可快速创建圆形靶标,并切换到绿色。效果如下图,与上面的结果一样
  10. 还可以发现,我们的靶标是中心在地面,而场景中已有的靶标是最低点在地面上,这是因为XML文件中,没有设定圆心到地面的偏移值CenterHeightAboveGroundCm。下面将介绍如何设定本值,是的物体创建后,直接最低端在地面上(通常创建障碍物需要如此)
  11. 在刚才的窗口中,通过鼠标拖曳,将视角定位到创建的绿色靶标的底部(将鼠标箭头放在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即可,不需要再除以缩放倍数)
  12. 复制一份“Ring_Target_Green.xml”文件,命名为Ring_Target_Green1.xml

    修改ClassID为160(或其他在场景中没使用的数字)、Name(根据需求修改,非必须)、CenterHeightAboveGroundCm(设定为刚才记录的高度值,单位厘米),示例修改如下
  13. 关闭RflySim3D窗口,再重新打开RflySim3D程序,切换到VisionRing场景,然后在草地上双击一下,再按下键盘“O160”,就能得到一个底部在地面上的原型靶标了(和场景中自带的靶标一模一样)
  14. 同理,可以通过导入其他的三维模型,调整好地面高度,然后用键盘输入的方法创建更多的三维物体,包括障碍物、靶标、人物、飞机等。当然也可以直接调用场景中自带的物体,例如“O3”对应多旋翼系列,“O100”对应固定翼,“O6”对应六旋翼,“O30”对应人物,等等。在\PX4PSP\RflySim3D\RflySim3D\Plugins\Rfly3DSimPlugin\Content\XML目录中,可以查看所有的RflySim3D中已有的模型信息

通过Python脚本创建场景

  1. 通过Python脚本的话,不强制需求修改XML文件使得物体中心要配置到地表,但是需要调整物体发送的Z轴坐标,使之底部位于地表
  2. 首先,打开RflySim3D程序,并按下“M”键切换到VisionRing地图
  3. 依次将视角拖动到三个靶标的根部,双击根部的地面位置,得到期望放置靶标的坐标位置


  4. 从上面三个图可知,绿、蓝、红三个靶标的地面位置分别为[43.943,1.620,-0.04],[72.946,-4.388,-0.04],[115.915,5.510,-0.04]
  5. \PX4PSP\RflySimAPIs\PythonVisionAPI\1-PX4MavCtrlAPITest\UE4CtrlAPITest.py为模版,创建一个三维物体创建的程序。分别放置绿、蓝、红三个靶标到场景中
  6. 根据上一节第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])
  7. 演示例程。可以运行RflySimAPIs\UE4MapSceneAPI\ObstacleCreate\ TargetCreateDemo\TargetCreateDemo.bat和TargetCreateDemo.py来观察在空白场景中复现VisionRing三个环的例子
  8. 演示例程2。可以运行RflySimAPIs\UE4MapSceneAPI\ObstacleCreate\ TargetCreateDemo\TargetCreateDemo 2.batTargetCreateDemo2.py来观察在OldFactory中创建三个环的例子

场景布置与地形匹配

  1. 上述sendUE4Pos接口需要详细地设定物体的xyz坐标,因此如果想要物体完全贴在(站在)地面上,就需要去测量地表的高度,这个可以通过在RflySim3D中双击地面想要放置靶标的位置,就能在Click Point中读出z的坐标

    例如,打开RflySim3D程序,在山地上任意双击一个点,得到如上图所示界面。可以读到坐标为-16.479,1.45,-177.181
  2. 因此我可以通过如下指令,创建一个人(XML中心已调到脚底),令其脚底站在山地上。
    mav.sendUE4Cmd(b'RflyChangeMapbyName MountainTerrain') #切换到山地地图
    time.sleep(10) # 等待地图切换完成
    mav.sendUE4Pos(100,30,0,[ -16.479,1.45,-177.181],[0,0,math.pi]) #发送人、坐标和姿态,可以看到效果如下图
  3. 除了sendUE4Pos函数,我们还提供了一个自动确定地面高度,将物体挪至地表的接口函数sendUE4Pos2Ground,使用方法如下
    mav.sendUE4Pos2Ground (101,30,0,[ -17.479,1.45,0],[0,0,math.pi]) # 发送人、坐标和姿态。我们在刚才创建的人前方创建一个新的人,上述脚本中可以看出,z轴没有特意设置地面高度,而是设置为了0。效果如下图所示

    可见sendUE4Pos2Ground接口可以轻松创建地表的障碍物、靶标等物体,而不需要再去确定地形高度。但是,如果要创建一些天空中的物体,或者空中运动靶标,还是需要使用sendUE4Pos接口并设置好轨迹
  4. 本节的例程可见RflySimAPIs\UE4MapSceneAPI\ObstacleCreate\TargetPlaceDemo\ TargetPlaceDemo.py中。

    RflySim三维物体使用与生成方法

  5. 每个飞机(或三维模型)对应一个XML文件,目录见:\PX4PSP\RflySim3D\RflySim3D\Plugins\Rfly3DSimPlugin\Content\XML

  6. XML文件中“ClassID”对应了模型的类型(多旋翼、固定翼、人),“DisplayOrder”对应了本模型的排列顺序,“AR_Drone_Army”对应了模型的名字。
  7. 目前ClassID有下列选择:3(四旋翼)、30(人物)、40(标定板)、100(固定翼飞机)、5和6(六旋翼)、60(发光体)、151(方形环)、150(圆形环)、152(球形)、50(小车)
  8. 可以用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]
  9. 例如发送一个vehicleType=3的消息给RflySim3D,然后按下键盘C键,就可以看到目录下面的所有飞机模型序号
  10. 在上图的窗口按下C+数字,可以快速切换到需要的小样式。
  11. 也可以在mav.sendUE4Pos的命令中直接发送vehicleType来直达需要的样式,格式是:大样式+小样式*1000。例如,vehicleType=5003,表示大样式3,小样式5
  12. 更具体的搭建三维模型+场景,以及控制模型运动的方法见课程“RflySim高级版_第05讲_UE4三维场景开发.pdf”
  13. 要获取物体的三维网格信息,需要按上面的pdf步骤,安装3Ds Max和UE 4.22引擎,然后按下列步骤来。
  14. 定位到插件文件夹
  15. 选中一个物体,此时可以看到物体的三维尺寸信息,这里单位是cm,厘米,粗略用途的话,可以用这个值
  16. 注意,物体在RflySim3D中的实际尺寸,还和XML文件中的放缩标签密切相关。一般的xml文件都是1,也就是说RflySim3D中显示尺寸就是实际尺寸。也有小部分不是1的。例如,标定板是通过1*1的实际平板乘以0.6和0.84的系数,得到了0.6m*0.84m的一个标定板
  17. 更为精细的模型尺寸和网格获取方法见下面的步骤,首先选中一个模型,右键菜单中有导出按钮,得到fbx文件。
  18. 得到fbx文件,可以用3Ds Max导入,可以查看更细节的尺寸,也可以导出obj等其他网格格式。

5.6.2 飞机三维模型蓝图特效导入流程

  1. 虚幻商城搜索“Vigilante”,以C130-J Transport(West)为例子。
  2. 使用4.27版本的虚幻引擎,创建一个空白工程,将C130-J添加到创建好的工程中。(打开光线追踪)
  3. 下图中可以看到BP_West_Transport_C130J的蓝图飞机,因为只需要一个蓝图,删除 BP_West_Transport_C130J_Showcase,同时删除多余的场景文件level,另外重命名最外层的VigilanteContent文件夹为WestTransportC130J(便于后续的访问和分享)
  4. 双击打开“ BP_West_Transport_C130J”蓝图,将其自带的触发事件删除,下图中的红色模块。
  5. 鼠标在空白处右击->添加事件->添加自定义事件(通过自定义事件来替换上述红色模块)
  6. 将自定义事件命名为“ActuatorInputs”,并在右侧“输入”端创建8维的(pwm1~pwm8)的输入信号,作为基础8维的执行器输入信号。
  7. 在创建一个名为“ActuatorInputsExt”的自定义事件,添加Pwm9~Pwm24的16维输入信号,作为9~24维扩展执行器输入信号接收端。
  8. 注意:前面创建的两个自定义事件的名称必须为“ActuatorInputs”和“ActuatorInputsExt”,维度必须为8维和16维,如果没有这两个自定义事件,飞机无法触发执行器的动作或动画。
  9. 将ActuatorInputs的pwm输出端一次连接到各个舵面控制输入上,8维信号连接顺序为(白色的先确定了代码执行顺序),(推荐顺序:SetPropellerSpeed
    、SetStablizersL、SetStablizesR、SetAileronL、SetAileronR、SetRudder、SetFlapsL 、SetFlapsR)
  10. ActuatorInputsExt的输出口可以连接其他的执行器。(推荐顺序: RetractFrontWheel、RetractRearLWheel、RetractRearRWheel、OpenRamp、OpenRearLDoor、OpenRearRDoor、OpenFrontDoor、Set damaged model)
  11. 注意:毁伤模型里面,要通过浮点数来触发毁伤,需要增加浮点数判断(右键,搜索“大于”,找到“浮点数>=浮点数”)模块,设定大于等于1才触发毁伤。其他数据默认即可
  12. 点击“保存”和“编译”,使蓝图生效,然后关闭蓝图窗口,烘焙文件。
  13. 在【项目文件夹】-> Saved -> Cooked -> WindowsNoEditor -> 【项目名】 -> Content目录中,可以拷贝出刚才渲染的“WestTransportC130J”文件夹。
  14. 编写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>
    
  15. 开发Simulink测试程序,查看WestTransportC130JDemo.slx例程文件。(一个典型例子见RflySimAPIs\UE4MapSceneAPI\BluePrintModel\WestTransportC130J\WestTransportC130JDemo.slx)
  16. 将1~26维执行器数据发送到样式ID(VehicleType)为110的飞机即可,拖动滑块或者改变每一维的数,可以改变飞机样式。
  17. 将烘焙好的WestTransportC130J文件夹,XML文件,slx文件,按WestTransportC130J.zip所示的目录结构进行打包,即可得到场景发布压缩包。
  18. 将打包文件中的所有内容拷贝到PX4PSP目录下面,替换原有文件。运行WestTransportC130JDemo.slx,可以测试导入效果。相比于之前的mesh或者动画导入方式,本方法提供更加复杂的三维控制功能,例如,最后一项飞机crash的动画,以及后面的打开舱门等动作。本接口直接加载一个蓝图Actor作为飞机主体模型,在蓝图中可以自行编程决定每一位执行器对应的动画,甚至可以通过本蓝图去控制场景里面的风向、天气、光线等等。当然,也可以用于发射导弹,变换飞机形态,等等。
  19. 测试
    · 重新打开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场景构建及导入示例

  1. 打开Epic Games,在Epic Games左侧点击虚幻引擎,然后在跳转的页面上方点击Twinmotion,然后点击安装即可(这里使用的是Twinmotion试用版2022.1.2),Twinmotion教育版可前往Twinmotion官网申请。
  2. 安装完Twinmotion之后,前往虚幻商城搜索Twinmotion,安装“Datasmith Twinmotion导入器”和“面向虚幻引擎的虚幻内容”。
  3. Twinmotion界面介绍
  4. 打开Twinmotion,点击停靠栏左上角的导览列 -> 演示场景 -> Materials room, 然后使用快捷键 Ctrl + Shift + S 保存打开的演示场景(打开演示场景的时候会弹出是否保存当前场景的对话框,点击否即可),保存的文件以(.tm)为后缀,文件命名时请使用英文。
  5. 启动UE 4.27,创建一个新项目,选择游戏 -> 空白 -> 创建项目,创建项目时启用光线追踪,不带初学者内容包,使用英文名给项目命名。

  6. 在UE4中启用Twinmotion相关插件(菜单栏 -> 编辑 -> 插件),搜索Twinmotion,勾选两个插件,然后重启UE编辑器。
  7. 在世界大纲视图删除所有条目,使其变成全黑窗口,方便进行后续的场景导入,避免产生冲突。
  8. 使用工具栏的DataSmith工具,选择并导入之前保存的Twinmotion场景文件,导入时会弹出选项窗口,这里选择最高分辨率保证显示效果。

  9. 导入后显示效果
  10. 点击工具栏构建 -> 构建光照。

  11. 构建光照后表面材质变形了,选中材质变形的静态网格体,将其移动性改为固定或可移动,然后重新构建光照。

  12. 建筑外侧可能会出现漏光现象
  13. 这些为Twinmotion场景内的矩形光源,可以选中这些光源然后修改其位置或大小(也可以删除后自行在UE4上重新放置光源),来使光源完全位于建筑内部。(更改后重构光照)
  14. 配置飞机起飞原点:在场景中拖入一个“Player Start”,将“Player Start”的坐标设置为0 0 0,将导入的场景在世界大纲中选中,然后 鼠标右击 -> 附加到 -> Player Start,将所有物体绑定在“Player Start”坐标系下。
  15. 往场景中拖进一个小球,坐标设为 0 0 0 ,修改“Player Start”的坐标,使得小球的位置(也就是UE4的[0,0,0]坐标)的位置,位于我们期望的位置,例如房间的地板上(0 0 0 为无人机生成位置)。
  16. 场景中心的调整已经完成,进行保存操作。
  17. 碰撞设置,选中静态网格体(需要启用碰撞的物体),双击下图所示位置。
  18. 更改碰撞复杂度为,将复杂碰撞用作简单碰撞。
  19. 新建一个文件夹,将场景保存再改文件夹中(Ctrl + S),直接放置内容文件夹下不利于后续场景打包和发布。
  20. 在 编辑 -> 项目设置 -> 打包 中将 “使用pak文件” 和 ”共享材质着色器代码“ 取消勾选。
  21. 保存关卡,进行烘焙(菜单栏 -> 文件 -> 烘焙Windows的内容)。
  22. 烘焙完成后,需要将烘焙文件需要拷贝至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下.
    。上述路径下的文件直接拷贝至对应路径下即可.
  23. 此时, 打开RflySim3D, 按M键就可以切换到刚才导入的场景, 看到纹理即可.
  24. 在RflySim3D中,按下键盘左上角 ` 键后键入 RflyScanTerrainH 左下角X 左下角Y 右上角X 右上角Y 高度H 间隔I,当前场景使用 RflyScanTerrainH -20 -20 20 20 1 0.1(40米边长的矩形区域,1米高度向下扫描,0.1米扫描间隔)。
  25. 在RflySim3D启动文件处会生成两个文件。
  26. 将生成的两个文件拷贝至 CopterSim -> external -> map 下,然后启动 RflySim3D 和 CopterSim,选中联机即可通过CopterSim来切换场景。
  27. 文件备份,建一个空白文件夹,建立RflySim3D和CopterSim两个文件夹,在一次建立目录。
    1. CopterSim -> external -> map (将RflyScanTerrainH生成的文件放置此处)
    2. RflySim3D -> content(烘焙文件)
    3. RflySim3D -> Engine -> Plugins -> Marketplace -> TMtoUnrealContent(烘焙文件)
    4. RflySim3D -> Engine -> Plugins -> Enterprise -> DatasmithContent(烘焙文件)
  28. 将对应内容拷贝进去,然后选中CopterSim和RflySim3D两个文件夹,右键压缩成zip(更新平台时,自己导入的场景会被删除,这种方法可以备份场景,方便下次导入)

    也可以将场景文件的zip包,拷贝到安装包的RflySimAdv3Full-**\4.HILApps\scenes427目录,这样更新平台或全新安装时,场景会自动导入,便于分发给他人使用。

创建自定义场景

  1. SketchUp软件安装和教程
    https://pan.baidu.com/s/16aa14VD0N7z3xRB0TucsAA 密码:3333
    。 解压文件后,打开Setup文件下的Setup.exe来安装程序。
    。安装完后,将Crack文件下的(LayOut,Style Builder,SketchUp)拷贝至安装好的目标程序目录下(通过右击快捷方式来打开文件位置),拷贝过去直接替换目标中的文件即可。
    。SketchUp软件入门教程: 合集】很详细的新手教程 SketchUp全套新手基础入门精品教程_哔哩哔哩_bilibili
  2. SketchUp建模
    。画出房子占地,并划分区域(15600mm, 12000mm)

    。设定墙体厚度为(120mm),使用偏移工具(快捷键F)

    。上图可以看见该平面为反面,选中改平面 鼠标右击 -> 反转平面。

    。选中墙体部分,使用推拉工具拉升至3000mm。

    。选中墙体一块平面,使用移动工具,按住Ctrl复制该平面至一旁,在复制的平面上绘制门和窗。

    。将绘制好的门和窗放置规划位置。

    。绘制阳台,画好栏杆后使用按住Ctrl使用移动工具复制,然后输入*n可以等距复制n个对象。

    。绘制台阶

    。在各个平面贴上合适的材质。

    。对房屋进行封顶操作,还可以在房子周围绘制多个平面,给予不同的材质来创建一个环境。
  3. Datasmith插件安装
    Twinmotion Datasmith Exporter plugin for SketchUp Pro - Twinmotion
    。安装插件时关闭SketchUp和Twinmotion,下载后直接打开无脑安装即可。
    。安装完成后即可看见插件,如果看不见可以在 视图 -> 工具栏 打开插件。
  4. 将SketchUp场景导入Twinmotion优化
    。打开SketchUp建模好的场景,打开Twinmotion 导入 -> 直链 (选择材质合并) -> 导入。


    。在SketchUp中点击Datasmith插件的第一个按钮。

    。返回Twinmotion中即可看见导入的场景。

    。删除Twinmotion场景中的地面和背景,地面选中后Delete,设置 -> 位置 -> 背景图片, 将背景图片设置为无。

    。进行材质替换,使用Twinmotion资源库中的材质替换掉导入场景的材质。

    。添加一定的植被和路面贴图路灯等。

    。使用Ctrl + Shift + S保存当前场景。
  5. 将场景导入UE4中,因为这是室外场景,在将场景导入后添加(定向光源,天光,大气雾照亮当前场景),使用lightmass框选导入的场景区域避免光照构建失败。

    。将树木的移动性改为固定或可移动的。

    。构建光照。

    。将烘焙后的文件拷贝至RflySim3D平台。

5.6.4 基于Cesium的全球大场景构建

场景测试

  1. 直接双击运行“SITLRun_ChangSha.bat”可以打开一个长沙的场景(注:主要在SITLRun.bat上改了地图名字为Changsha和RflySim3D目录为RflySim3D426)
  2. 在RflySim3D的窗口中按下键盘“P”,开启物理碰撞引擎,看到飞机落到地表
  3. 在QGC中起飞、解锁、点击左上角的足球场,观察RflySim3D是否能一致
  4. 上面地形基本趋于平地,运行“SITLRun_MoutainRoad.bat”可以打开山地地形。和上面步骤相同,查看RflySim3D与QGC在山地地形中的匹配情况

任意指定GPS坐标的三维仿真

  1. 双击“SITLRun_EarthMap.bat”可以打开一个三维场景,本场景的坐标为北航体育场入口处。打开“\PX4PSP\CopterSim\external\map\EarthMap.txt”,其最后三个数字为:纬度(度)、经度(度)和高度(m),本GPS坐标会发送给QGC和RflySim3D实现地图统一
  2. 创建新的自定义坐标地图的方法有两种,第一种是直接修改“EarthMap.txt”的最后三行;第二中方法是复制一份“EarthMap.txt”和“EarthMap.png”,将两者改名为EarthMap打头的任意名字,例如EarthMap1.txt和EarthMap1.png,同时也要修改.bat中地图名字为EarthMap1即可
  3. 指定另一个GPS坐标作为仿真起点的方法。首先,Bing地图搜索目标位置,粗选出GPS坐标,填入上一步新建的地图场景中。然后,运行.bat文件,起飞后,在QGC的地图中选定期望的目标点,让飞机飞到目标位置,从Mavlink消息中读取当前的GPS坐标值。最后,将上述坐标值填入到第二步的地图场景中,就能得到期望起点的地图了
  4. 在C:\PX4PSP\CopterSim\external\map目录下面查看ChangSha.txt、Denver.txt、MoutainRoad.txt等地形校准文件,查看最后三位的纬度、经度,并去Bing地图上确认坐标,熟悉CopterSim的GPS坐标定位体系

导入高精度的大场景

  1. 运行“SITLRun_Denver.bat”,这个是Cesium提供的一个在线大城市地图场景,可以在其中做一些交通管理的工作。注:将来我们可以将自己的场景都放在云端,建立一个仓库,这样所有用户可以直接访问我们扫描的地图
  2. 使用本地地图文件的方法。这里需要上使用Cesium的专用3D Tiles地图格式“.b3dm”,首目录下有一个“tileset.json”文件,这里可以参考“D:\RflyMaps\Map1”
  3. Cesium官方提供了一个文档来进行转换https://github.com/CesiumGS/3d-tiles 上面有几种方法可以实现现有场景的转换。https://blog.csdn.net/weixin_43316655/article/details/108004906 上面这个链接有介绍如何用自己的飞机来航拍摄影
  4. 双击运行“SITLRun_MapData.bat”可以打开一个场景,它会自动检索D:\RflyMaps\Map*文件夹(目前支持5个文件夹,Map1已经放我自己的一个小地图),能看到下图三维的桥,说明本地地图文件导入成功
  5. 注意:MapData也可以任意改变GPS坐标值(例如MapData1.txt,MapDataHongKong.txt之类),方法和EarthMap相同。因此,我们可以在5个MAP文件夹中分别存放五个起落机场的细节场景,然后通过设置起飞原点为任意一个机场

倾斜摄影地图转换(以香港地图为例)

  1. 需要的工具:
  2. 正确组织文件结构,航拍摄影数据通常包含
    • 一个“metadata.xml”里面存储着本次航拍摄影使用的坐标系和GPS坐标参考原点
    • 一个“Data”文件夹,里面存储着若干瓦片文件夹,例如“Tile+031+010”
    • 我的HongKong文件夹已经准备了部分正确的格式
  3. 下载香港地区的瓦片和元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),可以直接使用
    • 重复上述步骤,下载尽量多的瓦片,可以构成香港的一个较大场景
  4. 转换为Cesium能识别的3D Tiles格式
    • 安装cesiumlab2_2.3.8.exe,并注册。(免费的)
    • 点击下图的“数据处理按钮”
    • 进入“倾斜模型转换V3”,并定位到HongKong/Data文件夹,他可以自动识别出零点坐标和瓦片数量
    • 设定好输出路径后,点击确认,等待转换完成
      • 将下面得到的文件,拷贝到“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”
    • 运行一个飞机后,如下图所示,可以看到香港的高楼场景了

      由于城市级别地形的精度不够高,飞远一点看效果更好
  5. 地形高度匹配方法
    上述方法导入的城市地形高度与Bing地图的地形高度不一定统一。如下图所示,用鼠标右键将视角向下拖动,可以看到街道在地表下方的现象(街道水平面不统一,个别地形导入进来也可能在地表上方)
    因此需要调节导入城市地形的高度值。理想的地形高度设置是导入的城市地形,略高于Bing全球地表地形高度(将其盖住)
    • 在导入的高精度城市街道地图上双击,得到一个点的高度,例如这里是Z=21.6
    • 向上拖动视角到地表平面,得到Bing地图上的地形高度为1.707
    • 两者做差可知,需要将导入的城市地图向上移动35m左右(加足够的裕度)
    • 修改metadata.xml文件,将 835786,820849,0内的第三项,海拔高度改成35(注意这里单位是m,水平微调的话,也可以调整前两个值)
    • 重复步骤三。在此运行bat脚本,可以看到街道已经在地表上方了
    • 再通过QGC选择合适的经纬度坐标,并根据地形高度,选择合适的高度,写入到MapDataHongkong.txt最末尾三位,可以得到较好的显示效果

      固定翼集群飞行场景(以香港地图为例)

  6. 联系 service@rflysim.com 获取我们下载并配置好的香港地区的三维场景文件“HongKongMap.zip”,然后手动将其解压并拷贝到D:\RflyMaps\Map(找一个空的文件夹即可)。或者将HongKongMap.zip拷贝到安装包中的4.HILApps\maps目录,在平台安装时会自动安装到D:\RflyMaps\Map路径
  7. 运行“UE426Demos\OtherVehicleTypes\AircraftMathworks”文件夹内的“AircraftMathworksSITLRun.bat”文件,输入飞机数量,即可看到香港地区地图
  8. 在QGroundControl中绘制飞机的飞行航路,即可实现固定翼在香港高楼间飞行的例子

    注意:导入城市级大地图的时候,容易因电脑内存/显存不够而报如下错误:“TEXTURE STREAMING POOL OVER**MIB BUDGET”

    有两种解决方案:
    • 直接按下键盘“H”,可以隐藏所有文字提示,包括报错和RflySim自带的提示
    • 先按下键盘左上角的“~”键(TAB上面那个键),然后输入如下命令:
      r.streaming.Poolsize 2000

      其中,2000的单位是MB,对应了分配的内存,可根据场景和地图实际尺寸来增加或减少

results matching ""

    No results matching ""