基于射线检测的物体坐标调整之思路总结
来源:互联网 发布:字中找字软件下载 编辑:程序博客网 时间: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
- 基于射线检测的物体坐标调整之思路总结
- 物体检测的总结
- 【NGUI】通过射线检测被遮挡的物体
- 【NGUI】通过射线检测被遮挡的物体
- Unity 射线 (之鼠标点击的坐标)
- Unity之射线检测
- Unity3D之射线检测
- 深度学习之目标检测——基于R-CNN的物体检测
- 射线检测地表高度和世界坐标和屏幕坐标间的转换
- 基于OpenCv的运动物体检测算法
- 基于语义的物体检测笔记
- 基于R-CNN的物体检测
- 基于R-CNN的物体检测
- RCNN2:基于RCNN的物体检测
- 基于R-CNN的物体检测
- 基于R-CNN的物体检测
- 基于R-CNN的物体检测
- 基于R-CNN的物体检测
- 第三周----作业冒泡排序与归并排序
- 第三周算法作业
- 联合查询(比如说left join)处理方法
- 老龄程序员
- 基于OpenLayers的地图封装Javascript类定义
- 基于射线检测的物体坐标调整之思路总结
- poj 1745-Divisibility
- vim常用快捷键
- Leetcode_binary-tree-preorder-traversal
- 编译Tiny-X for arm
- 不同APK间的数据读取
- hibernate里createSQLQuery的addEntity()和setResultTransformer()方法
- HTTPS如何做好呢 ?
- Linux系统下Snmp的配置及SNMP介绍