UE 实现鼠标点选模型
楔子
在孪生的场景中,点击三维对象是常用的操作。比如点击模型显示相关属性和图片,点击摄像头模型播放视频,点击楼宇展开楼层等等。
因此点选模型是属于数字孪生最必要的基础能力。
准备知识
UE蓝图介绍
本文会涉及到一些蓝图的知识,如果你对蓝图不了解,需要先了解下UE的蓝图知识。蓝图 是虚幻引擎4的可视化脚本方法。也就是说,通常要通过编写脚本来完成的任务,现在可以通过一个由节点和连接组成的图形来创建,而不必输出任何实际的代码。
蓝图相关的基础知识,可以参考官方文档。
https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/Blueprints/
https://docs.unrealengine.com/4.27/zh-CN/Resources/Showcases/BlueprintExamples/
后续也会写相关的文章介绍蓝图知识。
数学理论
UE鼠标点选模型的技术理论是大致这样的:
- 获取鼠标点击的位置和方向(涉及到鼠标位置转换到三维空间坐标,可以设置内置方法获取)
- 通过位置和方向发射一条射线。
- 判断射线和那些对象进行相交(可以使用内置的方法获取),取最近相交的模型,就是鼠标点击获取的三维对象。
如果熟悉threejs,就知道这有点类似Threejs的raycaster。
重载Pawn
我们的蓝图在一个重载的Pawn类里面实现,Pawn 是可那些由玩家或 AI 控制的所有 Actor 的基类。Pawn 是玩家或 AI 实体在游戏场景中的具化体现。这说明, Pawn 不仅决定了玩家或 AI 实体的外观效果,还决定了它们如何与场景进行碰撞以及其他物理交互。某些游戏可能在游戏中没有可见的玩家模型或替身(Avatar),因此这点在某些情况下可能会令人困惑。不过,无论如何,Pawn 仍代表着玩家或实体在游戏中的物理方位、旋转角度等。Character 是一种特殊的、可以行走的 Pawn。
有关Pawn的更多知识,Pawn
再内容浏览器里面右键,新建蓝图->蓝图类:
选择Pawn:
然后在浏览器里面输入命名:
双击新建的蓝图类,进入蓝图编辑页面。
有关蓝图的基本操作,比如添加节点,移动节点,连线等此处不详细介绍。
监听鼠标
在蓝图中监听鼠标事件(本文是右键)如下:
Pressed 表示按下,Released表示松开。
获取鼠标位置和方向
获取鼠标位置的蓝图节点“将鼠标位置转换为场景空间”
其中的目标是玩家控制器,通过下面的节点获取玩家控制器:
构造射线
节点“将鼠标位置转换为场景空间” 可以获取鼠标所在的世界坐标和向前的方向,分别设定为:origin和direction。 其中origin未射线的原点,通过向量计算,可以获取射线的终点end:
end = origin + directon * length
其中length为常量,我们可以指定,因此计算end的蓝图如下:
其中涉及到一个常量乘以向量的蓝图节点,和两个向量相加的节点。 首先world direction 乘以一个常量10000,计算的结果在和world location想加,就可以得到终点。
起点和终点会最终作为下一步计算输入值。
通过射线获取检测结果
通过射线获取点击结果的节点是“由通道检测线条”
其中:
- start 表示射线起始点
- end表示射线重点
- Out Hit 表示检测到的对象
- Return Value 是一个bool,true表示有对象命中,false表示没有对象命中。
中断命中结果
所谓中断命中结果的意思 可以理解把命中的包装结果进行分项拆分。
首先通过检测的结果return value 判断,命中则中断命中结果,条件判断通过分支节点来进行:
- Condition 表示输入的条件,
- True表示条件为真的时候的执行
- False表示条件为否的时候的执行
本实例中,条件为真的时候,执行中断结果:
获取结果信息
上面命中结果中:
- Hit Actor表示被击中的actor
- Hit Component 被击中的actor中的component,如果有子组件mesh可以被射线检测到的话
获取到相关的信息后就可以执行相关操作,此处打印出相关的信息如下:
显示鼠标光标
默认运行程序后, 鼠标的光标是不显示的,为了能够看清点击点,需要显示鼠标光标,比如按下tap键显示光标,如下:
设置Pawn
重写了Pawn类之后,在程序的设置中,需要把模型的Pawn改成我们重写的Pawn类,才能生效,如下图所示:
结语
本文说明了通过射线的方法检测鼠标点击模型的功能。 最终的效果如下图所示:
点击的时候,打印对应component的名称。
如果你有好的经验,也欢迎和我交流。关注公号“ITMan彪叔” 可以添加作者微信进行交流,及时收到更多有价值的文章。
UE 实现鼠标点选模型的更多相关文章
- SkylineGlobe7.0.1版本 通过鼠标左右平移模型对象
帮同事写了一段测试代码,如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- ListView鼠标框选实现蓝色蒙板
此问题留心已久,今日方悉心求之,记录心得. ListView控件,不论Delphi中的TListView还是c#中的ListView,在开启其MultiSelect属性时,鼠标框选只是显示框张,如下图 ...
- threejs 鼠标移动控制模型旋转
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- UE添加鼠标右键打开
重装了下系统,有一些工具,不用重新安装还是能用的,比如UE.pl/sql,就当是绿色软件了.但是有些在鼠标右键里的功能没有了 ,比如UE的右键打开. 可以这样修改:打开UltraEdit->高级 ...
- 【Unity】鼠标点选物体
Camera cam; void Start () { cam =this.GetComponent<Camera>(); } void Update () { )) { T ...
- Cesium鼠标移动到模型上,给模型添加高亮轮廓(四)
2023-01-09 Cesium虽然也支持两种方式(Entity和Primitive)加载3D Tiles数据, 但因为多数情况下3D Tiles数据都是成片区的数据,数据量比较大,所以为了保证性能 ...
- Javascript实现鼠标框选元素后拖拽被框选的元素
之前需要做一个框选元素后拖拽被框选中的元素功能,在网上找资料做了一些修改,基本达到了需要的效果,希望对也需要实现框选后拖拽元素功能的人有用. 页面加载后效果 框选后的内容可以拖拽,如下图: 代码下载
- excel鼠标拖选慢shift选择快的问题
今天遇到个惊天大坑,关于excel的,最近,一直在调查这个东西,刚开始真的是毫无头绪,反正现在就是excel的值的copy会偶尔慢,慢的情况也是不明白,就是稀里糊涂的调查. 刚开始连100%再现这个b ...
- 原生js实现在表格用鼠标框选并有反选功能
今天应同学要求,需要写一个像Excel那样框选高亮,并且实现框选区域实现反选功能.要我用原生js写,由于没什么经验翻阅了很多资料,第一次写文章希望各位指出不足!! 上来先建表 <div clas ...
- dev GridControl 根据鼠标坐标 选中行
if (e.Button == System.Windows.Forms.MouseButtons.Right) { DevExpress.XtraGrid.Views.Grid.ViewInfo.G ...
随机推荐
- Dapr 与 .NET Aspire 结合使用获得无与伦比的本地开发体验
Dapr 提供了一组构建块,用于抽象分布式系统中常用的概念.这包括服务.缓存.工作流.复原能力.机密管理等之间的安全同步和异步通信.不必自己实现这些功能,可以消除样板,降低复杂性,并允许您专注于开发业 ...
- java学习之旅(day.17)
GUI编程 GUI:图形用户界面编程 GUI快淘汰了 GUI的核心技术:Swing . AWT 这是类 做一个场景页面涉及的组件 窗口.弹窗.面板.文本框.列表框.按钮.图片.监听事件.鼠标.键盘.破 ...
- flask-wtf和WTForms官网翻译详解
https://flask-wtf.readthedocs.io/en/stable/# https://wtforms.readthedocs.io/en/2.3.x/ 介绍: wtformflas ...
- MySQL的索引优化
一.索引的使用场景 1.全值匹配 通过主键索引查询 mysql> explain select * from t_goods where id = 1 \G; ***************** ...
- 基于webapi的websocket聊天室(四)
上一篇实现了多聊天室.这一片要继续改进的是实现收发文件,以及图片显示. 效果 问题 websocket本身就是二进制传输.文件刚好也是二进制存储的. 文件本身的传输问题不太,但是需要传输文件元数据,比 ...
- PHP做api开发时,签名验证你是怎么设计的
开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证. 我们在设计签名验证的时候,请注意要满足以下几点: 可变性: ...
- 【2023全网最全最火】Selenium WebDriver教程(建议收藏)
在本教程中,我将向您介绍 Selenium Webdriver,它是当今市场上使用最广泛的自动化测试框架.它是开源的,可与所有著名的编程语言(如Java.Python.C#.Ruby.Perl等)一起 ...
- exe应用程序安装为windows服务
1.使用instsrv.exe和srvany.exe 当你获取到srvany后并决定将某程序作为服务启动后,请先将srvany安装为系统服务,具体的安装方法有很多,这里使用instsrv,语法如下:安 ...
- golang errgroup 的超时检测
errgroup 的超时检测通常是一种事后得到结果的方式. errgroup本身并不直接支持超时控制,而是依赖于与之关联的context.Context来实现超时和取消功能. 当context超时时, ...
- 机器学习策略篇:详解超过人的表现(Surpassing human- level performance)
超过人的表现 讨论过机器学习进展,会在接近或者超越人类水平的时候变得越来越慢.举例谈谈为什么会这样. 假设有一个问题,一组人类专家充分讨论辩论之后,达到0.5%的错误率,单个人类专家错误率是1%,然后 ...