UE4控制移动的3D箭头实现方法与效果探讨

[复制链接]
查看10453 | 回复23 | 2016-6-15 17:33:06 | 显示全部楼层 |阅读模式
本帖最后由 DimonLeo 于 2016-6-17 10:14 编辑

控制物体移动是3D场景中经常使用到的功能,UE4本身编辑器的控制移动、旋转、缩放的指示器简单直观,使用方便
QQ截图20160615170815.png

QQ截图20160615170850.png

QQ截图20160615170859.png


那么如果我们要在自己项目中实现这样的箭头效果,该如何做呢?
因为项目需要,我也有一些想法,在这里说出来,欢迎大家指正讨论交流。
我的想法是,做三个方向的箭头分别对应物体的本地坐标系,其实每个箭头和图中的盘子一样是一个staticmesh。
那么接下来我们要解决的就是以下一些问题了:
1、选中物体的轮廓边,如图中盘子周围一圈淡黄色轮廓线。
2、当三个箭头被盘子遮挡时,如何让它正常显示或者达到我们想要的效果。
3、当鼠标点击上去的时候,如何响应事件,如何在鼠标移动时,使物体跟着移动。

第一个问题好解决,现在有很多大神做出了方案,我就不赘述了,贴个链接吧
http://www.unrealchina.com/forum.php?mod=viewthread&tid=131
http://www.unrealchina.com/forum.php?mod=viewthread&tid=130
这是论坛会员——天才小熊猫的帖子。
其实就是在场景中放置一个PostProcessVolume,然后在settings-》blendables下设定一个材质,再打开物体的一个属性就行了。(详情请看上文两个链接)
QQ图片20160615172001.png

把箭头所指的选项钩中,再根据材质的设定调整Value就可以了。
当然也可以用函数设置。
QQ截图20160615171915.png


第二个问题,其实和第一个问题的解决方法是一样的。
打开RenderCustomDepth之后,你会发现,就算物体被遮挡,也会同样看得到轮廓线。
QQ截图20160615172441.png

那么只需要调整具体的材质属性就能达到箭头在被遮挡的情况下可见了。
可是如果你同时想要轮廓线和遮挡可见,就要面临一个问题。
两个物体同时打开了RenderCustomDepth,那么被遮挡的物体就不可见了。
是的,被遮挡的物体可见的前提条件是,遮挡物没有打开RenderCustomDepth。
而Stencil Value并没有控制遮挡关系的功能。
是的,我要做的功能就在这里懵逼了。
如果有朋友有好的方法,希望能不吝赐教。


关于第三个问题,最重要的,如何处理点击事件。主要有两种方法
一种是每个staticmeshactor有的触发事件
QQ截图20160617095053.png
On Begin Cursor Over和On End Cursor Overp是分别检测鼠标是否覆盖当前actor的事件。
On Clicked和On Released是分别检测点击和释放的事件。
通过这几个事件,可以检测到鼠标对物体的当前操作,再做出相应操作。
值得注意的是,这些事件是基于物体的碰撞体响应的,也就是说,当前物体如果没有碰撞,是无法检测到这几个事件的。
或者,当前物体被其他物体遮挡,这几个事件也无法响应。


第二种是通过鼠标左键事件发射射线,然后检测碰撞到的物体中,是否有箭头。
如果有,如何如何,如果没有,如何如何。这些就跟第一种方法差不多了,只不过是检测的方式不同而已。
QQ截图20160617100334.png
通过上图的射线操作,可以得到射线HIT的所有物体,再遍历这些物体,做出相应操作。

两个方法各有优缺点
第一种由于基于引擎的事件响应,各方面操作都很受掣肘,而且因为阻挡关系,会导致操作不便。
第二种不限制于阻挡,但是对于系统的消耗想必会比第一种高,毕竟每次都要遍历射线碰到的所有物体,操作较为复杂。


而无论哪一种方法,其实都未能解决上文说到的轮廓线问题。
在此发文希望能抛砖引玉,对大家有所帮助,也希望有大神能解决一下我的问题,真是绞尽脑汁了啊~~先拜谢!
Eric_Song | 2016-6-15 17:55:58 | 显示全部楼层

忘了开一个东西,现在有图啦
个人博客 : ericsong.org
回复 支持 1 反对 0

使用道具 举报

DimonLeo | 2016-6-15 17:38:05 | 显示全部楼层
图呢?奇怪!!
回复

使用道具 举报

yuemingxishan | 2016-6-16 10:05:55 | 显示全部楼层
我居然连遮挡是什么都不知道还企图看懂楼主的帖子~~哎。。差距啊。。。
回复 支持 反对

使用道具 举报

DimonLeo | 2016-6-16 10:12:05 | 显示全部楼层
yuemingxishan 发表于 2016-6-16 10:05
我居然连遮挡是什么都不知道还企图看懂楼主的帖子~~哎。。差距啊。。。 ...

兄弟别闹,是我哪里没说清楚吗 QQ图片20160616101124.jpg
回复 支持 反对

使用道具 举报

ql930601 | 2016-6-17 08:50:28 | 显示全部楼层
持续关注中!!!
回复 支持 反对

使用道具 举报

zhangshirun | 2016-6-17 09:45:34 | 显示全部楼层
支持,说的不错
回复 支持 反对

使用道具 举报

i.m-x | 2016-6-17 14:52:52 | 显示全部楼层
这个B 有点叼啊 大兄弟~!!
回复 支持 反对

使用道具 举报

yuemingxishan | 2016-6-25 21:31:48 | 显示全部楼层
DimonLeo 发表于 2016-6-16 10:12
兄弟别闹,是我哪里没说清楚吗

不是不是,您讲的很好~~只是我基础太差,连遮挡是什么意思都不清楚~~sorry啦 让您产生误解
回复 支持 反对

使用道具 举报

iscp0003 | 2016-9-26 12:39:17 | 显示全部楼层
如果遇到blockall的物体怎么处理?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1

主题

15

回帖

1031

积分

游客

积分
1031