简单观察UE里Foliage吸附模型与地形的实现方式

这篇具有很好参考价值的文章主要介绍了简单观察UE里Foliage吸附模型与地形的实现方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标

UE里,Foliage可以吸附所在的模型与地形:
简单观察UE里Foliage吸附模型与地形的实现方式
简单观察UE里Foliage吸附模型与地形的实现方式

本篇的目标是观察这个功能大概的实现方式。

0. Foliage的基础数据结构

首先,编辑器下的Foliage由每个关卡中的一个AInstancedFoliageActor来管理。

AInstancedFoliageActor有一个成员FoliageInfos

TMap<UFoliageType*, TUniqueObj<FFoliageInfo>> FoliageInfos;

FoliageInfos管理了每个FoliageType所对应的信息,以FFoliageInfo表示,而FFoliageInfo又包含了具体每个个体的信息:

// Editor-only placed instances
TArray<FFoliageInstance> Instances;

每个Foliage的个体都由一个FFoliageInstance表示

1. FoliageInstance的BaseComponent

FFoliageInstance有一个BaseComponent成员。
简单观察UE里Foliage吸附模型与地形的实现方式
这个BaseComponent在放置的时候就被设置
简单观察UE里Foliage吸附模型与地形的实现方式
再往前观察,可以看到它是通过Trace的方式找到一个instance所属的BaseComponent是什么。
简单观察UE里Foliage吸附模型与地形的实现方式
如果是放在地形上,则Base就是一个LandscapeHeightfieldCollisionComponent
如果是放在模型上,则Base就是一个StaticMeshComponent

2. BaseComponent的保存方式方式

虽然FFoliageInstanceBaseComponent存储了每个植被个体的基底,但是经过观察,每次关卡重新打开后他的值都会变成Null。也就是说,它并未被序列化,即并未被保存。

经过观察,这一信息保存的方式如下:


一方面,对于AInstancedFoliageActor,它有一个InstanceBaseCache
简单观察UE里Foliage吸附模型与地形的实现方式
通过它。可以知道对于一个FFoliageInstanceBaseId(也就是一个数字)对应的Component指针是什么。
简单观察UE里Foliage吸附模型与地形的实现方式


另一方面,对于FFoliageInfo,有一个ComponentHash成员。
简单观察UE里Foliage吸附模型与地形的实现方式
通过它可以知道,一个FFoliageInstanceBaseId对应了哪些个体。


以上两个数据都是被序列化的,即保存的。
而结合以上二者,就可以得到每个Foliage个体的BaseComponent是什么。

3. 当模型/地形改变时

可以在 InstancedFoliage.cpp 中的FFoliageStaticMesh::SetInstanceWorldTransform函数中加断点,即可断到模型/地形改变时,Foliage调整自身位置时的代码堆栈。


比如,当基底是模型。模型改变时为:
简单观察UE里Foliage吸附模型与地形的实现方式
几个关键的部分为:

主要的逻辑在AInstancedFoliageActor::MoveInstancesForMovedComponent
简单观察UE里Foliage吸附模型与地形的实现方式
可以看到它通过 AInstancedFoliageActorInstanceBaseCacheFFoliageInfoComponentHash找到一个Component对应哪些个体。并且通过计算Transform偏差来改变Foliage的位置。


当地形改变时:
简单观察UE里Foliage吸附模型与地形的实现方式
主要逻辑在ULandscapeHeightfieldCollisionComponent::SnapFoliageInstances中:

简单观察UE里Foliage吸附模型与地形的实现方式
可以看到它也是通过 AInstancedFoliageActorInstanceBaseCacheFFoliageInfoComponentHash找到一个Component对应哪些个体。而Foliage的位置改变则是通过在个体的位置上使用Trace的方式。

总结

Foliage吸附模型与地形的实现方式是:

在放置Foliage个体的时候,通过Trace的方式找到其基底是什么,写到BaseComponent中。随后, AInstancedFoliageActorInstanceBaseCacheFFoliageInfoComponentHash会保存这一信息,后续也是通过他们找到个体对应基底的信息的。

当模型改变时,AInstancedFoliageActor::MoveInstancesForMovedComponent会被调用,它计算模型Transform的改变偏差,并使用这个偏差设置Foliage的新位置。

当地形改变时,ULandscapeHeightfieldCollisionComponent::SnapFoliageInstances会被调用。它使用Trace得到地形高度,并通过它设置Foliage的新位置。文章来源地址https://www.toymoban.com/news/detail-480925.html

到了这里,关于简单观察UE里Foliage吸附模型与地形的实现方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4 Cesium离线生成地形

    地理空间数据云 首先进这个网址,下载对应的tif以及高程(DEM) 下载CesiumLab2 在地形切片中点击添加,将黑白图像数据,添加,选择存储类型为散列文件,选择输出路径 再选择影像切片,选择有颜色的图片,添加进入,选择存储方式为散列,选择输出路径,确认 下载nginx  

    2024年02月11日
    浏览(43)
  • JavaScript 简单实现观察者模式和发布-订阅模式

    大家好,我是南木元元,热衷分享有趣实用的文章。今天来聊聊设计模式中常用的观察者模式和发布-订阅模式。 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 如何理解这句话呢?来举个生活中的例子

    2024年02月12日
    浏览(106)
  • UE4 地形编辑基础知识 学习笔记

    之前自己写过这样的功能,今天看到一个UE现成的 点击地形,选择样条 按住CTRL键+点击屏幕中某一个点会在场景内生成一个这样的图标 再点两次,会生成B样条的绿线条 点击+号再选择一个模型,会生成对应的链条状的mesh 拉高最远处的一个图标抬高 如果想地形贴合该mesh,则

    2024年02月11日
    浏览(56)
  • ts:简单实现 mobx 的观察者模式 observable

    mobx 状态管理器 订阅者: 管理 变化后 回调的函数列表 观察者:将传入的 数据监听 起来,并且在 有变化时 , 执行 订阅者管理的 函数列表

    2024年02月12日
    浏览(54)
  • UE4-地形材质图层创建及使用

    1.选择模式中的地形,进入创建地形界面,支持自己设置地形大小以及导入高度图。导入高度图生成的地形有默认的大小,可以通过左侧面板中的分段大小等属性重新设置地形大小,高度图整体走势是不会更改。设置完抽点击创建,系统自动创建地形。 2.创建材质,使用Land

    2024年02月16日
    浏览(55)
  • 【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测

    《Unity5实战-使用C#和Unity开发多平台游戏》第二章-构建一个让你置身3D空间的演示 鼠标观察/键盘控制移动飞行/行走/碰撞检测 Unity版本:2019.4.23f1c1 注意脚本名称和组件添加,不在文章中一一强调 场景模型都是在资源商店选择的免费下载(选择Sort by Price(Low to High)排序)搜索

    2024年02月04日
    浏览(55)
  • UE4灰度图生成地图记录&blender生成城市地形

    引擎:4.26 首先,在网上下载灰度地形图。这边先下载了如下的灰度地形图。 然后,使用ps来修改图片的格式,以适应UE4引擎的使用。 将图片修改成灰度,16位通道。 然后将图片导出成png格式(灰度,16位通道)。 然后在虚幻引擎中导入图片。 然后通过调整高度缩放来控制地形

    2024年02月05日
    浏览(47)
  • Cesium for UE4 加载离线地形和影像

    编译cesium-terrain-builder cesium native 解析 TMS 影像相关代码: 参见火星科技 发布三维数据服务将上述数据发布。 1、3DTiles Terrian Builder

    2024年02月11日
    浏览(39)
  • 【UE5 Cesium】15-Cesium for Unreal 加载本地影像和地形

    目录 一、加载全球无高度地形 二、加载区域DEM 三、加载离线地图影像 1. 先去如下网址下载全球无高度地形:Using a global terrain layer without height detail - #9 by RidhwanAziz - Cesium for Unreal - Cesium Community 下载后如下: 解压后可以看到是一个.tif格式的文件 2. 打开CesiumLab,需要将tif转为

    2024年02月07日
    浏览(43)
  • 【UE】简单实现屏幕UI定位

    实现效果 屏幕空间定位 场景空间定位 一般实现兴趣点(POI)有两种实现方法,场景空间UI定位和屏幕空间UI定位。 场景空间定位 :UI类似实例模型,位置和尺寸是相对于场景不变。大多适用于第一人称第三人称小场景。 屏幕空间定位 :UI大小固定,不会随场景的变化而改变

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包