关于前端:UE-实现鼠标点选模型

7次阅读

共计 1821 个字符,预计需要花费 5 分钟才能阅读完成。

楔子

在孪生的场景中,点击三维对象是罕用的操作。比方点击模型显示相干属性和图片,点击摄像头模型播放视频,点击楼宇开展楼层等等。

因而点选模型是属于数字孪生最必要的根底能力。

筹备常识

UE 蓝图介绍

本文会波及到一些蓝图的常识,如果你对蓝图不理解,须要先理解下 UE 的蓝图常识。 蓝图  是空幻引擎 4 的可视化脚本办法。也就是说,通常要通过编写脚本来实现的工作,当初能够通过一个由节点和连贯组成的图形来创立,而不用输入任何理论的代码。

蓝图相干的基础知识,能够参考官网文档。
https://docs.unrealengine.com…
https://docs.unrealengine.com…
后续也会写相干的文章介绍蓝图常识。

数学实践

UE 鼠标点选模型的技术实践是大抵这样的:

  1. 获取鼠标点击的地位和方向(波及到鼠标地位转换到三维空间坐标,能够设置内置办法获取)
  2. 通过地位和方向发射一条射线。
  3. 判断射线和那些对象进行相交(能够应用内置的办法获取),取最近相交的模型,就是鼠标点击获取的三维对象。

如果相熟 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 彪叔”能够增加作者微信进行交换,及时收到更多有价值的文章。

正文完
 0