UMG绝对坐标与局部空间

在 Unreal Engine 的 UMG(Unreal Motion Graphics)中,“绝对坐标”和“局部空间”是两个常见的概念,主要用于描述 UI 元素的位置和大小。

概念与区别

  • 绝对坐标(Absolute Coordinates):这是指相对于屏幕的坐标系。无论 UI 元素属于哪个父级,它的绝对坐标都是相对于整个屏幕的。
  • 局部空间(Local Space):这是指相对于 UI 元素的父级的坐标系。一个 UI 元素的局部坐标是基于它的父级的坐标系来定义的。

函数

在 UMG 中,Unreal Engine 提供了一些函数来进行坐标转换:

  • 绝对坐标转局部空间

    FVector2D UWidgetLayoutLibrary::AbsoluteToLocal(UObject* WorldContextObject, const FGeometry& Geometry, const FVector2D& AbsoluteCoordinate);
    
  • 局部空间转绝对坐标

    FVector2D UWidgetLayoutLibrary::LocalToAbsolute(UObject* WorldContextObject, const FGeometry& Geometry, const FVector2D& LocalCoordinate);
    

示例

例子 1:绝对坐标转局部空间

假设你有一个 UWidget,你想将一个绝对坐标转换为这个 UWidget 的局部坐标。

UWidget* MyWidget = ...;  // 获取你的Widget
FGeometry WidgetGeometry = MyWidget->GetCachedGeometry();
FVector2D AbsolutePosition = FVector2D(500, 300);  // 绝对坐标

FVector2D LocalPosition = UWidgetLayoutLibrary::AbsoluteToLocal(nullptr, WidgetGeometry, AbsolutePosition);

// 输出局部坐标
UE_LOG(LogTemp, Log, TEXT("Local Position: %s"), *LocalPosition.ToString());

例子 2:局部空间转绝对坐标

假设你有一个 UWidget,你想将一个局部坐标转换为绝对坐标。

UWidget* MyWidget = ...;  // 获取你的Widget
FGeometry WidgetGeometry = MyWidget->GetCachedGeometry();
FVector2D LocalPosition = FVector2D(50, 30);  // 局部坐标

FVector2D AbsolutePosition = UWidgetLayoutLibrary::LocalToAbsolute(nullptr, WidgetGeometry, LocalPosition);

// 输出绝对坐标
UE_LOG(LogTemp, Log, TEXT("Absolute Position: %s"), *AbsolutePosition.ToString());

与屏幕位置的转换

屏幕位置 是指鼠标或触摸点在屏幕上的位置,通常用于处理输入事件。

屏幕位置转绝对坐标

屏幕位置在 Unreal Engine 中通常是绝对坐标,因为它们是相对于整个屏幕的。你可以直接使用屏幕位置作为绝对坐标。

绝对坐标转屏幕位置

绝对坐标和屏幕位置之间没有转换,因为它们实际上是相同的概念,都是相对于整个屏幕的坐标。

局部空间转屏幕位置

首先,将局部空间转换为绝对坐标,然后绝对坐标即为屏幕位置。

UWidget* MyWidget = ...;  // 获取你的Widget
FGeometry WidgetGeometry = MyWidget->GetCachedGeometry();
FVector2D LocalPosition = FVector2D(50, 30);  // 局部坐标

// 先转换为绝对坐标
FVector2D AbsolutePosition = UWidgetLayoutLibrary::LocalToAbsolute(nullptr, WidgetGeometry, LocalPosition);

// AbsolutePosition 即为屏幕位置
UE_LOG(LogTemp, Log, TEXT("Screen Position: %s"), *AbsolutePosition.ToString());

屏幕位置转局部空间

将屏幕位置(绝对坐标)转换为局部空间坐标。

UWidget* MyWidget = ...;  // 获取你的Widget
FGeometry WidgetGeometry = MyWidget->GetCachedGeometry();
FVector2D ScreenPosition = FVector2D(500, 300);  // 屏幕位置(绝对坐标)

// 转换为局部坐标
FVector2D LocalPosition = UWidgetLayoutLibrary::AbsoluteToLocal(nullptr, WidgetGeometry, ScreenPosition);

UE_LOG(LogTemp, Log, TEXT("Local Position: %s"), *LocalPosition.ToString());

总结

  • 绝对坐标 是相对于屏幕的全局坐标。
  • 局部空间 是相对于父 UI 元素的坐

接口归纳

SlateBlueprintLibrary.h C++ 文件中有一些绝对坐标与局部空间相互转换的函数

//SlateBlueprintLibrary.h C++ 文件中有一些绝对坐标与局部空间相互转换的函数
class USlateBlueprintLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_UCLASS_BODY()

public:
    //如果以绝对坐标提供的位置在此几何图形的边界内,则返回true。
    static UMG_API bool IsUnderLocation(const FGeometry& Geometry, const FVector2D& AbsoluteCoordinate);
    //将绝对坐标转换为该几何的局部空间。
    //绝对坐标可以是桌面空间,也可以是窗口空间,这取决于小部件层次结构的根所在的空间。
    static UMG_API FVector2D AbsoluteToLocal(const FGeometry& Geometry, FVector2D AbsoluteCoordinate);
    //将局部坐标转换为绝对坐标
    //绝对坐标可以是桌面空间,也可以是窗口空间,这取决于小部件层次结构的根所在的空间。
	static UMG_API FVector2D LocalToAbsolute(const FGeometry& Geometry, FVector2D LocalCoordinate);

    //返回局部空间中几何体的局部顶部/左侧。
	static UMG_API FVector2D GetLocalTopLeft(const FGeometry& Geometry);
    //返回几何体在局部空间中的大小。
	static UMG_API FVector2D GetLocalSize(const FGeometry& Geometry);

    //返回几何图形在绝对空间中的大小
	static UMG_API FVector2D GetAbsoluteSize(const FGeometry& Geometry);

	static UMG_API float TransformScalarAbsoluteToLocal(const FGeometry& Geometry, float AbsoluteScalar);
	static UMG_API float TransformScalarLocalToAbsolute(const FGeometry& Geometry, float LocalScalar);
    static UMG_API FVector2D TransformVectorAbsoluteToLocal(const FGeometry& Geometry, FVector2D AbsoluteVector);
    static UMG_API FVector2D TransformVectorLocalToAbsolute(const FGeometry& Geometry, FVector2D LocalVector);
    //返回画笔A和B是否相同。
    static UMG_API bool EqualEqual_SlateBrush(const FSlateBrush& A, const FSlateBrush& B);

    //将提供的几何体的局部坐标转换为局部视口坐标。
	static UMG_API void LocalToViewport(UObject* WorldContextObject, const FGeometry& Geometry, FVector2D LocalCoordinate, FVector2D& PixelPosition, FVector2D& ViewportPosition);

    //将提供的几何图形在桌面空间中的绝对坐标转换为本地视口坐标。
    static UMG_API void AbsoluteToViewport(UObject* WorldContextObject, FVector2D AbsoluteDesktopCoordinate, FVector2D& PixelPosition, FVector2D& ViewportPosition);

    //将屏幕位置(以像素为单位)转换为具有给定几何形状的小部件的局部空间。
    //如果bIncludeWindowPosition为true,那么这个方法也会移除游戏窗口的位置(在窗口模式下很有用)。
    static UMG_API void ScreenToWidgetLocal(UObject* WorldContextObject, const FGeometry& Geometry, FVector2D ScreenPosition, FVector2D& LocalCoordinate, bool bIncludeWindowPosition = false);

    //将屏幕位置(以像素为单位)转换为绝对应用程序坐标。
    //如果bIncludeWindowPosition为true,那么这个方法也会移除游戏窗口的位置(在窗口模式下很有用)。
    static UMG_API void ScreenToWidgetAbsolute(UObject* WorldContextObject, FVector2D ScreenPosition, FVector2D& AbsoluteCoordinate, bool bIncludeWindowPosition = false);

    //将屏幕位置(以像素为单位)转换为视窗小部件的本地空间。
    static UMG_API void ScreenToViewport(UObject* WorldContextObject, FVector2D ScreenPosition, FVector2D& ViewportPosition);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/676037.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode1137第N个泰波那契数

题目描述 泰波那契序列 Tn 定义如下: T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。 解析 递归应该会超时,可以用循环,或者官方解法的矩阵的幂。 public int tr…

索尼CEO宣布全力推进AI电影制作,《蜘蛛侠》制片人坚称不用AI

原标题:索尼互娱制片人与CEO唱反调 易采游戏网6月3日消息:在最近的一次行业会议上,索尼影业高层首席执行官托尼文西奎拉向媒体透露,索尼正在全力推进人工智能(AI)技术的研发与应用,特别是在电影制作流程中。这一策略旨…

彩光大放异彩!《智慧园区以太全光网络建设技术规程》应用案例征集活动结果公布

近日,中国建筑业协会绿色建造与智能建筑分会正式公布了《智慧园区以太全光网络建设技术规程》应用案例征集活动的结果。本次活动旨在推广和应用该规程,进一步推动智慧园区的数字化、智慧化、绿色化建设。众多优秀项目在征集活动中脱颖而出,展示了规程在实际应用中的显著成效。评…

数据结构--关键路径

事件v1-表示整个工程开始(源点:入度为0的顶点) 事件v9-表示整个工程结束(汇点:出度为0的顶点) 关键路径:路径长度最长的路径 求解关键路径问题(AOE网) 定义四个描述量 …

数青蛙 ---- 模拟

题目链接 题目: 分析: 题目的意思是: 一次蛙鸣是一个完整的字符串"croak", 给你一个字符串, 让你求出最少的青蛙数目 示例一: 两次完整的"croak", 可以由一只青蛙完成, 所以答案为1 示例二: 第一次蛙鸣还没有结束, 又出现了"c", 说明有第二只青…

迪丽热巴与大姐的璀璨友情

迪丽热巴与“大姐”的璀璨友情:星光熠熠,友谊长存在娱乐圈的繁华舞台上,有两位耀眼的女星,她们如同夜空中亮的两颗星,交相辉映,共同谱写着一段段动人的佳话。她们,一个是被亲切称为“迪迪”的迪…

03_初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念:路由(Route)2.2 核心概念:断言(Predicate)2.3 核心概念&#…

【算法训练记录——Day24】

Day24——回溯算法Ⅰ 77.组合 今日内容: ● 理论基础 ● 77. 组合 理论:代码随想录 77.组合 思路:k层for循环,不会 回溯,将组合问题抽象成n叉树,for循环控制宽度,递归的深度控制二叉树的深度 …

云原生架构案例分析_3.某快递公司核心业务系统云原生改造

名称解释: 阿里云ACK:阿里云容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)集成Kubernetes网络、阿里云VPC、阿里云SLB,提供稳定高性能的容器网络。本文介绍ACK集群网络及阿里云网络底层基础设施的重要…

抄袭瓜!斯坦福作者已删库跑路!面壁和刘知远老师的最新回应

好家伙,AI大模型圈爆料不断,没想到今天最猛的料还是抄袭的瓜啊。 5月29日,一个斯坦福团队高调宣称,只需要500美元,就可以通过他们的新产品:Llama3-v ,就可以通过Llama3,训练出一个全…

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites,通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中,再利用css“background-image”, “background-repeat”,“background-position”的组…

C++命名空间(详解)

C基础语法 C基于C语言的改进:c在C语言的基础上引入并扩充了面向对象的概念 C基础概念:C是基于C语言而产生的,它即可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计 在1998年 出现C98…

文件同步软件,PanguFlow局域网横着走

说到文件同步,它对企业来说及其重要,因为有了文件同步,这个文件数据它才能备份起来,才能用来抵抗自然灾害,比如服务器硬盘损坏了,你要是不备份,这损失可就大了,一款合适的文件同步软…

外星人Alienware X15R1 原厂Windows10系统 oem系统

装后恢复到您开箱的体验界面,包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统,经厂家手调试最佳状态,性能与功耗直接拉满,体验最原汁原味的系统。 原厂系统下载网址:http://w…

第三方模块的下载与安装

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在进行Python程序开发时,除了可以使用Python内置的标准模块外,还有很多第三方模块可以被我们所使用。对于这些第三方模块&…

欧佩克+同意集体性减产延长,油价能否稳住?

KlipC报道:欧佩克组织同意将延长目前部分减产协议至2025年,以支撑油价。主要成员国把2023年11月宣布的日均220万桶的自愿减产措施延长至今年9月底,将在10月份根据市场情况开始缩减自愿减产规模。 高盛分析师表示,“我们认为这次欧…

成功案例(IF=12.2)| 肠道代谢组、微生物组和脑功能的综合分析揭示了肠-脑轴在长寿中的作用

研究背景 人类长寿是一种受遗传、环境等多种因素影响的复杂表型。近年来,肠道微生物群被认为是长寿的一个重要因素,如Akkermansia、Alisipes和Parabacteroides已被报道与长寿有关。此外,最近的一项研究表明,百岁老人的肠道微生物群…

【前端】政务服务大数据可视化监控平台(源码+html+css+js)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

以主程序的形式执行

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 这里先来创建一个模块,名称为christmastree,该模块的内容为第6章中编写的实例05的代码。在该段代码中,首先定义一…

比试强训介绍以及注意事项

强训不止一次,没有系统学过算法,不要着急参加,容易打击信心。 如何检验算法储备是否足够? 老师码云 检查自己看到每个算法标签时是否掌握下面三个问题: 是什么?如何实现?对应的经典例题能不…