Foliage篇-笔刷工具源码分析拓展-允许亲疏关系

目录:第九艺术-目录

Version:UnrealEngine 4.22.3

做开放大世界的话,初始可以用ProceduralFoliageSpawner 生成,由于都是随机生成的,之后一般都还会需要很多的细节调整,那就得用到默认的笔刷工具来生成植被了。因此就有了也在笔刷中实现上一篇文章功能的需求,也要在笔刷中允许配置各种Foliage的远近亲疏关系,借同样的需求,熟悉一下默认笔刷的流程。

在这里选择Foliage之后,点击要刷的表面。

  1. 调用到 FEdModeFoliage::StartFoliageBrushTrace,开始spawn 满足 UISettings和FoliageType里配置的Instances,这是和 Spawner 一个比较大的区别,用笔刷是可以获取到ActiveTool等Editor信息的,但spawner由于是在之外生成的,就得不到这些信息,之后做一些拓展的时候,会需要考虑到这些区别
  2. 之后调用到 FEdModeFoliage::ApplyBrush,这里会计算你操作工具的压力大小,作为最终生成Instance数量的系数,当然鼠标就是 1 了,然后判断如果是 Paint 工具,就开始生成
  3. 调用到 FEdModeFoliage::AddInstancesForBrush,根据Brush大小,构建这次生成的Buckets,主要用于LandscapeLayer的权重检查,会先查看一下已有的bucket里有多少
  4. 拿到之后,就走到 笔刷和Spawner工具类似的主流程了,调用FEdModeFoliage::AddInstancesImp,逐个生成Instance
  5. 相比Spawner会调用线程安全的 CalculatePotentialInstances_ThreadSafe,笔刷不会多线程,所以直接调用CalculatePotentialInstances
  6. FEdModeFoliage::CalculatePotentialInstances,和spawner类似
    1. FoliageTrace 找到地块
    2. VertexMaskCheck
    3. LandscapeLayerCheck
    4. 满足条件的Instance加到要Spawn的数组
  7. 逐个生成 Instance

如上流程可以看到,之前也说过,在笔刷工具做这个功能的时候,最大的优势就是刷的每种FoliageType都已经可以知道当前地块上有哪些已经放好的 Instance,所以可以直接做距离检查,那就很简单了,只要再最后做各种检查的地方加一个远近亲疏关系的检查就可以了

实现代码如下:

FoliageType里

添加配置结构体,模型和距离,这里可以新加一个,也可以用spawner的

USTRUCT()
struct FRelatedFoliageTypeEntry
{
	GENERATED_USTRUCT_BODY()
​
	UPROPERTY(EditAnywhere,Category = RelatedFoliage)
		UStaticMesh* FoliageMesh;
​
	UPROPERTY(EditAnywhere,Category = RelatedFoliage)
		float Radius;
};

添加属性配置

	UPROPERTY(EditAnywhere, Category = Custom)
	TArray<FRelatedFoliageTypeEntry> CloseToFoliages;
​
	UPROPERTY(EditAnywhere, Category = Custom)
	TArray<FRelatedFoliageTypeEntry> FarFromFoliages;

添加 距离检查的方法 RelatedFoliageTypesCheck,逻辑很简单

static bool CheckForOverlappingSphere(AInstancedFoliageActor* IFA, const UStaticMesh* Mesh, const FSphere& Sphere)
{
	if (IFA)
	{
		TArray<const UFoliageType*> MeshFoliageTypes;
		IFA->GetAllFoliageTypesForSource(Mesh, MeshFoliageTypes);
		for (int i = 0; i < MeshFoliageTypes.Num(); ++i)
		{
			if (CheckForOverlappingSphere(IFA, MeshFoliageTypes[i], Sphere))
				return true;
		}
	}
​
	return false;
}
​
bool RelatedFoliageTypesCheck(const FHitResult& Hit, const UFoliageType* Settings)
{
	if (!Settings)
		return false;
​
	if (Settings->CloseToFoliages.Num() == 0 && Settings->FarFromFoliages.Num() == 0)
		return true;
​
	AInstancedFoliageActor* IFA = AInstancedFoliageActor::GetInstancedFoliageActorForLevel(Hit.Component->GetComponentLevel(),false);
	if (!IFA)
	{
		if (Settings->CloseToFoliages.Num())
			return false;
​
		return true;
	}
​
	for (int i = 0; i < Settings->CloseToFoliages.Num(); ++i)
	{
		if (Settings->CloseToFoliages[i].FoliageMesh && Settings->GetSource() != Settings->CloseToFoliages[i].FoliageMesh && Settings->CloseToFoliages[i].Radius > 0)
		{	
			if (!CheckForOverlappingSphere(IFA, Settings->CloseToFoliages[i].FoliageMesh, FSphere(Hit.Location, Settings->CloseToFoliages[i].Radius)))
				return false;
		}
	}
	for (int i = 0; i < Settings->FarFromFoliages.Num(); ++i)
	{
		if (Settings->FarFromFoliages[i].FoliageMesh && Settings->GetSource() != Settings->FarFromFoliages[i].FoliageMesh && Settings->FarFromFoliages[i].Radius > 0)
		{
			if (CheckForOverlappingSphere(IFA, Settings->FarFromFoliages[i].FoliageMesh, FSphere(Hit.Location, Settings->FarFromFoliages[i].Radius)))
				return false;
		}
	}
	return true;
}

最后就是调用了,在最后 CalculatePotentialInstances 和 CalculatePotentialInstances_ThreadSafe 里面都加上这个判断

类似

const bool bValidInstance = CheckLocationForPotentialInstance_ThreadSafe(Settings, Hit.ImpactPoint, Hit.ImpactNormal)
	&& VertexMaskCheck(Hit, Settings)
	&& LandscapeLayerCheck(Hit, Settings, LocalCache, HitWeight)
	&& RelatedFoliageTypesCheck(Hit, Settings)//多加了这一句
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
foliage-penetrating radar (fopen)是一项通过植被穿透的雷达技术。它的作用是通过林地或植被层的探测,获取地面下的信息。 fopen使用特定频率的雷达信号发射到植被中,然后接收反射回来的信号。这些信号经过精确的处理分析后,可以提供关于地下目标(如地下水位、土壤类型、物质组成等)的信息。 相比传统的地质勘探技术,如钻探和地球物理勘探,fopen具有以下优势: 1.非侵入性:fopen无需破坏地表或进行大规模设备安装,不会对环境造成破坏。 2.实时采集:fopen可以即时获取数据,避免了传统勘探技术中需要等待的时间。 3.高分辨率:fopen能够提供高分辨率的地下图像,对于地下目标的检测和解析能力更强。 4.适用范围广:fopen在土壤研究、水文学、农业、环境保护等领域有着广泛的应用,能够提供有价值的信息用于决策制定。 5.成本效益高:相比传统勘探技术,fopen的成本更低,更具经济性。 不过需要注意的是,fopen也存在一些限制,比如对于高密度的植被或多层植被的地区,信号穿透的效果可能降低,需要通过算法等手段进行处理。此外,由于信号穿透深度的限制,fopen通常只能提供浅层地下信息。 总之,foliage-penetrating radar是一项非常有潜力和应用前景的技术,通过对植被的穿透,能够提供地下目标的详细信息,为环境研究和资源勘探等领域带来了新的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值