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.rhkb.cn/news/340058.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6012 标注数量(xml文件个数):6012 标注数量(txt文件个数):6012 标注…

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

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

如果任务过多,队列积压怎么处理?

如果任务过多,队列积压怎么处理? 1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办 如图: 大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请…

vue3+typescript 使用Codemirror

安装 // npm npm install codemirror-editor-vue3 codemirror^5.65.12// ts版 还需安装: npm install types/codemirror全局注册 修改main.ts: import { createApp } from vueimport App from ./App.vueimport { InstallCodemirro } from "code…

M-G364PD惯性测量单元:相机及微小层面的革命性应用

在现代科技飞速发展的今天,精准控制和精确测量是众多高端设备实现卓越性能的关键。爱普生推出的M-G364PD惯性测量单元(IMU),因其卓越的性能和微小尺寸,成为相机以及其他微小层面应用的理想选择,为科技创新提…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习,我们知道,将源代码编译成字节码文件后,JVM会对其中的字节码指令解释执行,在解释执行的过程中,又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

JavaScript 基础 - 对象

对象 对象是一种无序的数据集合&#xff0c;可以详细的描述描述某个事物。 注意数组是有序的数据集合。它由属性和方法两部分构成。 语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 <script>let 对象名 {属性名&#xff1a;属性值…

DynamiCrafter ComfyUI 教程 | 对图片转视频的效果进行精细化控制

近日&#xff0c;由北大、腾讯AI Lab联合推出的 AI 视频生成工具 DynamiCrafter 一经上线便引起了巨大反响。只需要输入一张普普通通的静态图&#xff0c;加上几句简单的文字引导&#xff0c;瞬间就能生成超逼真的动态视频&#xff0c;简直不要太厉害&#xff01; 静态图 fire…

renren-fast-vue启动报错

问题描述 拉取人人开源vue项目启动失败 报错信息 版本信息 序号名称版本号1node14.21.3 启动方案 1.拉取项目 git clone https://gitee.com/renrenio/renren-fast-vue.git 2.执行安装依赖命令 npm install 3.此时报错 chromedriver2.27.2 install: node install.js 4.手动…

kafka集群内外网分流方案——筑梦之路

前言 在现代分布式系统架构中&#xff0c;Kafka作为一款高性能的消息队列系统&#xff0c;广泛应用于大数据处理、实时流处理以及微服务间的异步通信场景。特别是往往企业级应用中&#xff0c;业务网段和内网通信网段不是同一个网段&#xff0c;内网的机器想要访问业务数据只能…

Java内存模型(JMM)

Volatile关键字 如何保证变量的可见性 在Java中&#xff0c;Volatile关键字可以保证变量的可见性&#xff0c;如果我们将变量声明为volatile&#xff0c;这就指示JVM&#xff0c;这个变量是共享且不稳定的&#xff0c;**每次使用它都到主存中进行读取&#xff08;禁止读取本地…

二分查找算法介绍(边界值、循环条件、值的变化、二分查找的原理、异常处理)

一、二分查找法原理介绍 二分查找是经典的查找算法之一&#xff0c;其原理也非常简单。 对于已排序的数组&#xff08;假设是整型&#xff0c;如果非整型&#xff0c;如果有排序和大小比较的定义&#xff0c;也可以使用二分查找&#xff09;&#xff0c;我们每次判断中间值与目…

基于JSP的母婴用品网站系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有需求可以文末加我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员功能界面 用户功能界面 前台首页功能界面 …

JUC从实战到源码:悲观锁和乐观锁真正了解了吗

【JUC】- 多线程与锁的知识 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指…

游戏找不到d3dcompiler43.dll怎么办,分享5种有效的解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到某个文件。其中&#xff0c;找不到d3dcompiler43.dll是一个常见的问题。这个问题通常出现在运行某些游戏或应用程序时&#xff0c;由于缺少了d3dcompiler43.dll文件&#xff0c;导致程…

mysql的锁(全局锁)

文章目录 mysql按照锁的粒度分类全局锁概念&#xff1a;全局锁使用场景&#xff1a;全局锁备份案例&#xff1a; mysql按照锁的粒度分类 全局锁 概念&#xff1a; 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法&#xff0c;命令是: Flush tables with…

#招聘数据分析#2024年5月前程无忧招聘北上广深成渝对比情况

#招聘数据分析#2024年5月前程无忧招聘北上广深成渝对比情况 0、根据前程无忧不完全样本统计&#xff0c;北上广深成都重庆平均月工资从高到低依次为 北京15037元、上海14230元、深圳13230元、广州11125元、成都10614元、重庆10388。 1、成都招聘样本数全量36301个&#xff0c…

搭建gateway网关

1.创建springBoot项目 可以将Server URL换成start.aliyun.com 2.配置路由与跨域处理 路由&#xff1a; server:port: 10010 # 网关端口 spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- i…

JavaScript解构赋值

一、数组解构 以上要么不好记忆&#xff0c;要么书写麻烦&#xff0c;此时可以使用解构赋值的方法让代码更简洁。 数组解构是将数组的单元值快速批量赋值给一系列变量的简洁语法。 基本语法&#xff1a; 1、赋值运算符左侧的[]用于批量声明变量&#xff0c;右侧数组的单元值将…

MyBatis的各种查询功能

1、查询&#xff1a; 查询的标签select必须设置属性resultType或resultMap&#xff0c;用于设置实体类和数据库表的映射关系 resultType&#xff1a;自动映射&#xff0c;用于属性名和表中字段名一致的情况 resultMap&#xff1a;自定义映射&#xff0c;用于一对多或多对一或…