基于射线检测的物体坐标调整之思路总结

来源:互联网 发布:字中找字软件下载 编辑:程序博客网 时间:2024/05/16 08:21

基于射线检测的物体坐标调整之思路总结


起因:

         在使用鼠标拖动物体移动时,如果在物体的移动方向(X、Y、Z)上不加任何限制,那么拖动物体的效果是较为不可控的,比方说,设想一个场景,我们需要通过拖动工具来处理物体的表面(擦拭、打磨等),若不加任何移动方向的限制,就有可能会出现工具穿透物体的现象,无法与它操作的表面(平面或者曲面)相贴合。而如果只是单纯地限制某一个方向,比如锁定深度(Z方向),将它设为定值,那么物体将只能在某个平面上被拖动,虽然可以避免穿透的现象,但是效果依然不够理想。在这种情况下,自己想出了这个基于射线检测的物体坐标调整功能(可以调整任意维度的坐标),来解决这一问题。

 

制作思路:

         假设我们有拖动对象和被碰对象两个物体,拖动对象在X、Y轴向上被拖动,在Z轴向上自动进行坐标调整。

首先,从拖动对象的中心点(或是与被碰对象相接触的点)发出射线。通过该射线,我们可以获取一系列的碰撞信息,比如碰撞点的位置,从射线源点到碰撞点的距离等。通过这些信息的实时获取,我们可以实时检测拖动对象与被碰对象间的联系。

         然后我们根据这个距离,来与事先设定的一个间距值做比较。这个间距值,就表示了你想让拖动对象与被碰对象的表面间保持多近的距离。通过这个实时的比较,我们就能够动态调整拖动对象在该维度上的坐标位置,使拖动对象在被拖动过程中不断修改自身的深度值(Z轴向的坐标值),从而实现自动贴合(或保持一定间距)到被碰对象表面的效果。

 

具体的制作方法,主要由以下的四部分组成:


         第一,我们需要一个鼠标拖动物体移动的功能脚本。


         第二,假设我们拖动物体在X、Y平面上移动,物体自动地调整Z方向的位置。这个Z方向的移动控制,我使用了NGUI插件中的TweenPosition脚本,主要是通过设置它的from和to属性来实现物体的自动移动。当然,这个功能通过MoveTowards等函数也能做到。自己比较懒,就用了现成的。


         第三和第四部分,合并在一起说,它们分别是两个功能脚本,一个负责投射射线,并记录相关的碰撞信息;另一个负责设置TweenPostion脚本的状态(启用或者禁用),以及它的from和to属性。


         所以,整体的工作流程就是:


         鼠标拖动物体移动->

         物体发出射线,进行碰撞检测并记录碰撞信息->

         根据碰撞信息进行判断,计算需要的偏移量->

         设置TweenPositon脚本的属性,实现坐标位置的调整。


         经过以上四部分的协调配合,就能够实现拖动物体时,贴合某一曲面进行移动的效果了(曲面的MeshCollider是必须的)。

         实现比较简单,自己就没有把代码再贴上来,只把思路进行了整理。最后,上一张拖动效果的示意图。如果大家有更好的方法,或者是我有描述不对的地方,欢迎交流与批评指正。




        本文出自杜晓萌的博客,未经特殊表明皆为本人原创,请勿用于任何商业用途,转载请保持完整性并标明出处:http://blog.csdn.net/haohan_meng


0 0
原创粉丝点击