UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)
《Electric Dreams》项目中提供了一些自定义节点和子图(文件位置:“/Content/PCG/Assets/PCGCustomNodes”),这些节点和子图在《Electric Dreams》被广泛使用,对于理解《Electric Dreams》非常重要,而且它们可以直接移植到新的项目中使用。所以写个博客分析一下
文章目录
- 前导文章
- Passthrough节点
- 作用
- Execute with Context
- PointNormalToColor节点
- 作用
- Point Loop Body
- Execute with Context
- PointFromPCGVolume节点
- 作用
- Execute with Context
前导文章
《虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(一)》
《虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流》
Passthrough节点
作用
数据流的开关
Execute with Context
用Enabled
控制是否将从Input
输入进来的从Output
输出,当Enabled
为false
的时候,输出的PCGDataCollection
中的Tagged Data
数组将会是一个空数组。
PointNormalToColor节点
作用
将Point法线存入Color属性
Point Loop Body
先看一下它的Point Loop Body
Point Loop Body的逻辑就是将每一个Point的Up Vector存储在Color属性中,然后把修改过的Point输出。
Execute with Context
注释见上图,在PointLoopBody后面有一个Initialize from Data
节点,代码如下:
void UPCGSpatialData::InitializeFromData(const UPCGSpatialData* InSource, const UPCGMetadata* InMetadataParentOverride, bool bInheritMetadata, bool bInheritAttributes)
{if (InSource && TargetActor.IsExplicitlyNull()){TargetActor = InSource->TargetActor;}if (!Metadata){Metadata = NewObject<UPCGMetadata>(this);}if (!bInheritMetadata || InMetadataParentOverride || InSource){const UPCGMetadata* ParentMetadata = bInheritMetadata ? (InMetadataParentOverride ? InMetadataParentOverride : (InSource ? InSource->Metadata : nullptr)) : nullptr;Metadata->Initialize(ParentMetadata, bInheritAttributes);}else{UE_LOG(LogPCG, Warning, TEXT("InitializeFromData has both no source and no metadata override"));}
}
Initialize from Data
做了两件事:
- 将源Data中的
TargetActor
赋值给新PCGSpatialData
的TargetActor
- 用源Data的metadata初始化新
PCGSpatialData
的metadata
PointFromPCGVolume节点
作用
使用Context
中Source
的Component
或者Component
的几何信息(Transform
和Bound
)构造1个PCGPoint
。
Execute with Context
我们先看一下GetComponent
和GetOriginalComponent
UPCGComponent* UPCGBlueprintHelpers::GetComponent(FPCGContext& Context)
{return Context.SourceComponent.Get();
}UPCGComponent* UPCGBlueprintHelpers::GetOriginalComponent(FPCGContext& Context)
{if (Context.SourceComponent.IsValid() &&Cast<APCGPartitionActor>(Context.SourceComponent->GetOwner()) &&Cast<APCGPartitionActor>(Context.SourceComponent->GetOwner())->GetOriginalComponent(Context.SourceComponent.Get())){return Cast<APCGPartitionActor>(Context.SourceComponent->GetOwner())->GetOriginalComponent(Context.SourceComponent.Get());}else{return Context.SourceComponent.Get();}
}
再看看它是如何获取GetActorLocalBoundsPCG
的
UPCGBlueprintHelpers::GetActorLocalBoundsPCG
FBox UPCGBlueprintHelpers::GetActorLocalBoundsPCG(AActor* InActor, bool bIgnorePCGCreatedComponents)
{return PCGHelpers::GetActorLocalBounds(InActor, bIgnorePCGCreatedComponents);
}
PCGHelpers::GetActorLocalBounds
FBox GetActorLocalBounds(const AActor* InActor, bool bIgnorePCGCreatedComponents){// Specialized version of CalculateComponentsBoundingBoxInLocalScape that skips over PCG generated components// This is to ensure stable bounds and no timing issues (cleared ISMs, etc.)FBox Box(EForceInit::ForceInit);const bool bNonColliding = true;const bool bIncludeFromChildActors = true;if (InActor){const FTransform& ActorToWorld = InActor->GetTransform();const FTransform WorldToActor = ActorToWorld.Inverse();InActor->ForEachComponent<UPrimitiveComponent>(bIncludeFromChildActors, [bNonColliding, bIgnorePCGCreatedComponents, &WorldToActor, &Box](const UPrimitiveComponent* InPrimComp){if ((bNonColliding || InPrimComp->IsCollisionEnabled()) &&(!bIgnorePCGCreatedComponents || !InPrimComp->ComponentTags.Contains(DefaultPCGTag))){const FTransform ComponentToActor = InPrimComp->GetComponentTransform() * WorldToActor;Box += InPrimComp->CalcBounds(ComponentToActor).GetBox();}});}else{UE_LOG(LogPCG, Error, TEXT("Actor is invalid in GetActorLocalBounds"));}return Box;}
所谓LocalBounds
就是把所属Actor的所有PrimitiveComponent叠加起来获得最大的FBox
相关文章:

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)
《Electric Dreams》项目中提供了一些自定义节点和子图(文件位置:“/Content/PCG/Assets/PCGCustomNodes”),这些节点和子图在《Electric Dreams》被广泛使用,对于理解《Electric Dreams》非常重要,而且它们可以直接移…...

500万PV的网站需要多少台服务器?
1. 衡量业务量的指标 衡量业务量的指标项有很多,比如,常见Web类应用中的PV、UV、IP。而比较贴近业务的指标项就是大家通常所说的业务用户数。但这个用户数比较笼统,其实和真实访问量有比较大的差距,所以为了更贴近实际业务量及压力…...
拖动排序功能的实现 - 使用HTML、CSS和JavaScript
引言 在现代Web应用程序中,拖动排序是一种常见的用户界面交互方式,它允许用户通过拖动元素来重新排列列表或项目的顺序。本文将介绍如何使用HTML、CSS和JavaScript来实现手动拖动排序功能。 一、HTML结构 首先,我们需要定义一个列表&#…...

【STM32MP135 - ST官方源码移植】第三章:OPTEE源码移植教程
STM32MP135 OPTEE源码移植教程 一、解压optee的源码压缩包二、拷贝新的设备树文件三、修改Makefile.sdk文件(1)增加stm32mp135d-atk设备树编译(2)修改编译器为arm-none-linux-gnueabihf(3)使用buildroot工具…...

云主机安全-私有密钥安全认证
场景描述 云主机凭借其性价比高、生配扩容便利、运维便捷、稳定性高等优势深受用户青睐,越来越多的企业开始租用云主机,将自己的服务器、业务系统等搭建或存储到云主机上。 用户痛点 用户租用或托管的云主机,运维端口(远程桌面&…...
《Web安全基础》02. 信息收集
web 1:CDN 绕过1.1:判断是否有 CDN 服务1.2:常见绕过方法1.3:相关资源 2:网站架构3:WAF4:APP 及其他资产5:资产监控 本系列侧重方法论,各工具只是实现目标的载体。 命令与…...
ffmpeg根据原始视频的帧率进行提取视频帧
直接上代码,自己编写的。。。有问题可以提 安装教程看这个:https://blog.csdn.net/m0_61497715/article/details/129817641 去官网下个最新的ffmpeg,解压到随便的目录,上级目录最好不要用中文; 然后去设置环境变量&am…...

从零搭建秒杀服务
1. 前言 目的:该项目只用于技术交流,不用于过多商业用途。 适用:可用于简历亮点、毕业答辩等。 2. 项目成果 2.1 秒杀主页 包含5个功能点: ①、Product Name:秒杀商品名称 ②、Product Image:秒杀商…...

数据库应用:CentOS 7离线安装PostgreSQL
目录 一、理论 1.PostgreSQL 2.PostgreSQL离线安装 3.PostgreSQL初始化 4.PostgreSQL登录操作 二、实验 1.CentOS 7离线安装PostgreSQL 2.登录PostgreSQL 3.Navicat连接PostgreSQL 三、总结 一、理论 1.PostgreSQL (1)简介 PostgreSQL 是一个…...
【PHP面试题42】Laravel依赖注入实现的原理是怎么样的
文章目录 一、前言二、什么是依赖注入三、Laravel依赖注入的实现原理3.1 Laravel依赖注入的实现原理:3.2 Laravel依赖注入的代码示例 四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题,对标…...

如何在本地组策略编辑器中启用或禁用剪贴板历史记录
复制粘贴是我们大家都会做的事情,可能一天要做多次。但是,如果你需要一次又一次地复制同样的几件事,你该怎么办?如何在设备上复制内容? 从Windows 10版本17666开始,微软正在解决这一问题,并将剪贴板提升到一个新的水平,只需按下Win+V,你将获得全新的剪贴板体验。 你…...

如何与ChatGPT愉快地聊天
原文链接:https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段,在这个阶段,人工智能可以像人一样与我们进行深度的文本交互。其中,OpenAI的ChatGPT是一个具有代表性的模型。然而࿰…...

使用Gradio库进行交互式数据可视化:Timeseries模块介绍
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...

CONTAINER = ALL是ALTER USER语句的默认值
连接到root时查看有关root,CDB和PDB的数据 当公用用户执行查询时,可以限制X $表和V $,GV $和CDB_ *视图的视图信息。X$表和这些视图包含有关应用程序root及其关联应用程序PDB的信息,或者如果连接到CDB root,则是整个C…...

华为发布大模型时代AI存储新品
7月14日,华为发布大模型时代AI存储新品,为基础模型训练、行业模型训练,细分场景模型训练推理提供存储最优解,释放AI新动能。 企业在开发及实施大模型应用过程中,面临四大挑战: 首先,数据准备时…...
5G网络功能介绍
5G系统架构由以下网络功能(NF)组成 -身份验证服务器功能(AUSF)。 -接入和移动性管理功能(AMF)。 -数据网络(DN),例如运营商服务、互联网接入或第三方服务。 -非结构化数据存储功能(UDSF)。 -网络曝光功能(NEF)。 -网络存储库功能(NRF)。 -网络切片特定身…...
笙默考试管理系统-MyTestMean(13)
笙默考试管理系统-MyTestMean(13) 目录 一、 笙默考试管理系统-MyTestMean 二、 笙默考试管理系统-MyTestMean 三、 笙默考试管理系统-MyTestMean 四、 笙默考试管理系统-MyTestMean 五、 笙默考试管理系统-MyTestMean 笙默考试管理系统-MyTes…...

Tomcat之高可用配置
Nginx搭配Tomcat实现负载均衡 传统模型下,一个项目部署在一台tomcat上,这个时候,假如tomcat因为服务器资源不够,突然挂机了,那么整个项目就无法使用。 Nginx就可以避免单台服务如果挂机,依然能保证服务正…...

IDEA中springboot的热加载thymeleaf静态html页面
1.首先加入开发工具依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency> 2.其次在build maven插件中开启热部署 <bu…...

Java中可以使用哪些系统架构?怎样选择?
架构,又名软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。 Java企业级的应用根据业务的复杂程度,通常使用的系统架构有应用架构、垂直应用架构、面向服务的架构(Service-Oriented Architectu…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...