3dtiles转换obj(moi3d转换obj)

3dtiles转换obj(moi3d转换obj)原文在虚幻的论坛上 我翻译并加以整理 方便大家阅读和理解 本文的主要讲的是在 Cesium 中 你剔除了一块区域 会有一个洞 如何使用 UE 自带的插件 Geometry Script 自动化生成网格把这个洞填补起来 并方便和 Datasmith 的导入建筑建筑结合起来 很方便的定位 最终的视频效果 该教程具备以下的功能点 动图效果展示 先决条件 这不是一个第一次使用 Cesium 的教程

大家好,我是讯享网,很高兴认识大家。



原文在虚幻的论坛上,我翻译并加以整理,方便大家阅读和理解

本文的主要讲的是在Cesium中,你剔除了一块区域,会有一个洞,如何使用UE自带的插件Geometry Script自动化生成网格把这个洞填补起来,并方便和Datasmith的导入建筑建筑结合起来,很方便的定位

最终的视频效果

该教程具备以下的功能点:

    动图效果展示

    先决条件

    这不是一个第一次使用Cesium的教程,假设你已经有了一个项目,里面有Cesium Tileset, Cesium Cartographic Polygon Actor已经在Tiles上裁剪出一部分,这意味着你在Tileset上已经有一个Cesium PolygonRasterOverlay component。

    你同时需要开启“Geometry Script”插件

    获取我们的Cesium Actors

    在内容浏览器中的任意空白处单击鼠标右键,选择“Blueprint Class”,然后选择“Actor”,然后命名为“BP_CesiumPlotTool”

    Actor要做的第一件事是创建一个“Cartographic Polygon”,并且将它分配给Cesium Tileset。创建2个变量,“CesiumTileset”是Cesium 3D Tileset类型的object reference,“CartographicPolygon”是Cesium Cartographic Polygon类型的object reference。确保点开眼球的标志,让变量是Public的,方便我们在面板访问和调试。

    打开“Construction Script”,将“CesiumTileset”变量拖到图中,获得一个Get点,并右键该节点,转换为“Validated Get”

    在“无效”引脚中,创建一个“Get Actor of Class”节点,将Actor Class设置为“Cesium 3D Tileset”,并将获得的变量赋值给“CesiumTileset”。

    在“Event Graph”中右键单击并创建一个新的“Custom Event”,命名为“SpawnCartographicPolygon”,确保在右侧的Details的面板中启用了“Call In Editor”,这将为我们提供一个可点击的按钮,以便稍后使用。

    再次取出“CesiumTileset”变量,将其转为“Validated Get”,在验证失败的节点后面打印字符串“ERROR:No 3DTileset define”来警告用户。

    继续验证下“CartographicPolygon”,确保没有被赋值。

    Cesium的Cartographic Polygon只能是Actor而不能是组件,虽然可以在蓝图里使用Child Actor组件,但是考虑到会出现隐藏的兼容性问题,所以创建一个“Spawn Actor From Class”节点,并设定类为“CesiumCartographicPolygon”,并split“Transform”引脚

    编译蓝图,然后将它从Content Browser拖拽到关卡中,在Actor的Details面板中,有我们公开的变量和一个测试按钮


    讯享网

    为了更加清晰,将Actor挂载到蓝图下,规则使用“Keep World”而不是“Keep Relative”

    开始裁剪

    cartographic polygon只有分配到Titlset的Raster Overlay上才会起作用,将“CesiumPolygonRasterOverlay”组件添加到Tileset,它会和“material layers”一起工作

    回到“Spawn Cartographic Polygon”事件,我们需要找到overlay组件,并将polygon插入其中,使用“Get Components By Class”搜索每一个Cesium Polygon Raster Overlay,获得列表中的第一个,然后将我们spawned的Cartographic Polygon加入到overlay的“Polygons”数组中

    增加一个刷新按钮,创建一个自定义事件“Refresh Tileset Culling”,这样可以在Tileset中看出视觉差异

    编译之后,再将蓝图拖拽到关卡中,点击第一个按钮来创建polygon actor。

    点击新的“Refresh Tileset Culling”按钮,重新加载所有的Tileset并裁剪出多边形区域

    可以按任意方式修改样条曲线,然后在Plot actor上单击“Refresh”按钮。

    用GeometryScript填充

    看到地球中心有一个空洞令人不安。解决这个问题的一个有趣的方法是使用强大的Geometry Script插件,该插件允许您在编辑器和运行时定义和修改网格。

    在我们的蓝图中,我们必须添加一个类型为“Dynamic Mesh”的新组件。我将其重命名为PlotMesh。确保这个组件的比例与我们之前生成的cartographic polygon actor的scale,在我的例子中是0.65。

    我们将为这个Mesh指定一个自定义材质,通过一个Public的变量“PlotMeshMaterial”,它的类型为“Material Interface”,创建另外一个自定义事件“UpdatePlotMesh”,使用“Configure Material Set”节点改变Mesh的Material,Material属性接受的是一个数组,当成一个字典去理解,我们只有一个材质,就用这个材质组成一个数组

    接下来,我们需要从Dynamic Mesh组件中获取动态网格。我们需要确保每次调用此事件时都在动态网格上使用“Reset”功能,这样我们就不会意外累积垃圾信息。

    现在,我们可以为Plot Mesh定义新的geometry了。Cesium Cartographic Polygon actor的酷之处在于,它利用标准Spline Component来定义其边。“Geometry Script”附带了可以使用此样条线组件的功能,例如“Convert Spline to Poly Path”。您必须定义一个名为“GeometryScriptSplineSamplingOptions”的结构,这里我将error tolerance设置0.1,并将“Sample Spacing”更改为“Error Tolerance”,以便获得与样条曲线匹配的精确边界。

    生成的“Poly Path”将自动转换为“Append Simple Extrude Polygon”节点的“Polygon Vertices”数组。我已经将“Transform Location”设置为-600,将“Height”设置为598,这样我们就可以得到一个深入地面的网格,但不会与放置在顶部的任何东西进行Z-fight

    一旦我们定义了这个3D形状,我们就需要计算分割法线,以确保我们的硬边看起来像硬边。缩放网格UV对我选择的材质有帮助,但也可以在材质中使用“ World Aligned Textures”。

    再次编译蓝图,并检查关卡,我们现在已经把孔堵上了。任何时候修改样条线,我们都可以点击“Update Plot Mesh”按钮来刷新geometry,您可以将自定义事件添加到构建脚本中,使其始终保持最新。

    最后的润色

    除了基本功能之外,还有一些我添加到actor中的其他实用工具。

    如果你想删除其中一个actor并重新开始,你会遇到几个问题。删除Plot actor不会删除cartographic polygon actor。删除polygon actor将警告您不要破坏对tileset的引用。因此,我制作了另一个名为“Remove Plot”的自定义事件,该事件首先从tileset的 raster overlay中删除cartographic polygon,然后删除polygon,然后刷新tileset以填充洞,最后自我销毁,不留痕迹。

    我还添加了一个公共字符串变量“Plot Name”。这意味着我可以创建数百个这样的区域,并且每个区域都有唯一的标识符。

    我还在蓝图中添加了一个名为“PlotOriginPoint”的Billboard Component。这个广告牌可以独立定位,这样我就可以使用它的世界位置作为进入该地块的Datasmith文件的原点。

    我又创建了一个公共变量“AssociatedImports”,Level Instances的数组。我还创建一个名为“Update Plot Origin”的自定义事件,该事件将所有指定的Level Instances移动到广告牌的位置。我这样做是为了当我需要重新定位导入的建筑时,我可以推动广告牌并重新定位1个“actor”,而不是移动从Datasmith导出的可能10000个actors。

     匹配几何体和山地

    上面用于生成plot mesh的代码使top-down的角度与cartographic polygon完美对齐。这是一个非常安全可靠的方法,这就是为什么我将其作为本教程的默认方法。但现实世界中的很多地方都不是平坦的!将该技术应用于这种倾斜特性会在前后留下间隙

    解决这个问题的方法是一些稍微复杂一点的逻辑。一旦我们对cartographic spline进行采样以获得其形状并以该精确形状创建polygon,然后我们迭代创建的每个顶点,并追踪到Z轴上最近的网格表面。这有效地“shrink wraps”了地形。

    我还添加了额外的镶嵌和一个选项来平滑生成的网格,以获得更自然的结果。

     

    这种技术即使在极端地形下也能很好地工作,但并不完美。增加样条曲线上的点的数量将有助于更好地符合地形的形状,但根据真正粗略的摄影测量来追踪这些点总是有点草率。

    下次加载关卡时,此Dynamic Mesh将不存在,或者它可能会尝试shrink wrap为尚未完全加载的Cesium tileset。一旦你得到了一个你满意的plot mesh ,你可以使用UE5中的建模模式手动处理它。如果您想将其另存为永久资产(强烈建议!),只需使用“Convert”工具,然后单击底部的“Accept”即可。

    自定义模型的默认位置为

    希望这个小工具能帮助你完成项目,或者让你知道如何进一步推进这个概念。如果你学到了什么或有问题,请在评论中告诉我,但请记住,我不能保证持续支持这个工具或教程。

    原文的链接

    https://dev.epicgames.com/community/learning/tutorials/1GYl/unreal-engine-using-geometry-script-and-blueprints-to-quickly-replace-cesium-tiles

    小讯
    上一篇 2025-05-22 08:39
    下一篇 2025-06-14 09:12

    相关推荐

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
    如需转载请保留出处:https://51itzy.com/kjqy/175281.html