UMG绝对坐标与局部空间

2024-06-04 07:28
文章标签 坐标 空间 绝对 局部 umg

本文主要是介绍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);
}

 

这篇关于UMG绝对坐标与局部空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029438

相关文章

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

win7系统中C盘空间缩水的有效处理方法

一、深度剖析和完美解决   1、 休眠文件 hiberfil.sys :   该文件在C盘根目录为隐藏的系统文件,隐藏的这个hiberfil.sys文件大小正好和自己的物理内存是一致的,当你让电脑进入休眠状态时,Windows 7在关闭系统前将所有的内存内容写入Hiberfil.sys文件。   而后,当你重新打开电脑,操作系统使用Hiberfil.sys把所有信息放回内存,电脑

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t

[Linux]:环境变量与进程地址空间

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 环境变量 1.1 概念 **环境变量(environment variables)**一般是指在操作系统中用来指定操作系统运行环境的一些参数,具有全局属性,可以被子继承继承下去。 如:我们在编写C/C++代码的时,在链接的时候,我们并不知

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,

算法复杂度 —— 数据结构前言、算法效率、时间复杂度、空间复杂度、常见复杂度对比、复杂度算法题(旋转数组)

目录 一、数据结构前言 1、数据结构 2、算法 3、学习方法 二、 算法效率 引入概念:算法复杂度  三、时间复杂度 1、大O的渐进表示法 2、时间复杂度计算示例  四、空间复杂度 计算示例:空间复杂度 五、常见复杂度对比 六、复杂度算法题(旋转数组) 1、思路1 2、思路2 3、思路3 一、数据结构前言 1、数据结构         数据结构(D

Oracle 查看表空间名称及大小和删除表空间及数据文件方法

--1、查看表空间的名称及大小  SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size  FROM dba_tablespaces t, dba_data_files d  WHERE t.tablespace_name = d.tablespace_name  GROUP BY t.tablespace_na

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘: