求助,部分射线碰撞检测不到碰撞

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
关注:1257
当前位置: &
__________________________________________________________________________________
开发者干货区版块规则:
  1、文章必须是图文形式。(至少2幅图)
& && &2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
& && &3、本版块只支持在游戏蛮牛原创首发,不支持转载。
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
& && &5、......
__________________________________________________________________________________
查看: 3775|回复: 3
unity射线碰撞检测+LayerMask的使用
本帖为抢楼帖,欢迎抢楼!&
9排名<font color="#FF昨日变化2主题帖子积分
蛮牛币2234
在线时间267 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 ζ?随风去旅行 于
12:09 编辑
射线在中是个很方便的东西,对对象查找、多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等提供了很大的帮助,在此做个总结与大家分享下 ,若有不足欢迎吐槽好了,话补多说啦,直接进入主题:射线:在unity中射线是由一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。相关API:
1、Ray Camera.main.ScreenPointToRay(Vector3 pos)& &返回一条射线Ray从摄像机到屏幕指定一个点
2、Ray Camera.main.ViewportPointToRay(Vector3 pos)&&返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点
3、Ray 射线类
4、RaycastHit 光线投射碰撞信息
5、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
& & 当光线投射与任何碰撞器交叉时为真,否则为假。
& & bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
& & 在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。
& & bool Physics.Raycast(Ray ray, float distance, int layerMask)
& & 当光线投射与任何碰撞器交叉时为真,否则为假。
& & bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
& & 当光线投射与任何碰撞器交叉时为真,否则为假。
& & 注意:如果从一个球型体的内部到外部用光线投射,返回为假。
& & 参数理解:
  origin : 在世界坐标中射线的起始点
  direction: 射线的方向
  distance: 射线的长度
  hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
  layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞
6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
& &投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
列子如下:
[C#] 纯文本查看 复制代码using UnityE
using System.C
public class RayTest : MonoBehaviour {
// Use this for initialization
void Start ()
mainCrma = Camera.
private Camera mainC
private RaycastH
private Ray _
void Update ()
if (Input.GetMouseButtonDown(0))
_ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//显示一条射线,只有在scene视图中才能看到
if (Physics.Raycast (_ray, out objhit, 100))
GameObject gameObj = objhit.collider.gameO
Debug.Log(&Hit objname:&+gameObj.name+&Hit objlayer:&+gameObj.layer);
}FL])[[EMQ~ZEJBMO05X)~I.jpg (36.84 KB, 下载次数: 0)
10:30 上传
layerMask参数:&&
Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers)
其实很简单:1 && 10&&打开第10的层。
~(1 && 10) 打开除了第10之外的层。
~(1 && 0) 打开所有的层。
(1 && 10) | (1 && 8) 打开第10和第8的层。
列子如下:[C#] 纯文本查看 复制代码using UnityE
using System.C
public class LayerMaskTest : MonoBehaviour {
// Use this for initialization
void Start ()
mainCrma = Camera.
mask = 1&&( LayerMask.NameToLayer(&cube&));//实例化mask到cube这个自定义的层级之上。
//private LayerMask mask 1&&10;
private LayerM
private Camera mainC
private RaycastH
private Ray _
void Update ()
if (Input.GetMouseButtonDown(0))
_ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//划出射线,只有在scene视图中才能看到
if (Physics.Raycast (_ray,out objhit, 100, mask.value))
GameObject gameObj = objhit.collider.gameO
Debug.Log(&Hit objname:&+gameObj.name+&--Hit objlayerName:&+LayerMask.LayerToName (10));
创建2个cube,一个layer设置为:cube&&一个layer设置为:Default
运行如下:
[NBY9]CM4OVA}7VN73C$(VB.jpg (47.71 KB, 下载次数: 0)
10:30 上传
=============================
Ray只有起点和方向.函数附加x距离内的条件。
用到的Raycast主要有两个:
Physics.Raycast:
作用于任何物体,可以加限定 只检测某layer层
if(Physics.Raycast(transform.position, Vector3.down,out hit, 1000f))
& & print(&dawdddd&);
if(Physics.Raycast(transform.position, Vector3.down,out hit, 1000f,8))
& & print(&dawdddd&);
Collider.Raycast:
只检测ray是否穿过该Collider
[C#] 纯文本查看 复制代码RaycastH
Ray ray= new Ray(transform.position,Vector3.down);
if(collider.Raycast(ray,out hit,100))
print(&dawdddd&);
(1)无论是哪种raycast检测,从物体内部穿到外面的,都不视为穿过。只有从物体外穿到里面的才视为穿过。
(2)可以绘制 可见线 来辅助开发
1.Debug.DrawLine(V3 start,V3 end);
2. Gizmos.DrawLine& &(可以在编辑模式下显示,可视化更强)
如果在scene的Gizmos选项下 勾选 3D Gizmos, 那么线段位于真实3D空间里,有前后遮挡。
如果不勾选,则gizmo永远在最前显示。
& &[C#] 纯文本查看 复制代码 void OnDrawGizmos () {
Vector3 checkPos_a =transform.position + new Vector3(0,0,0.2f);
Gizmos.color = Color.
Gizmos.DrawLine(checkPos_a,checkPos_a + Vector3.down*15);
unity 检测碰撞;unity射线使用;unity加碰撞;unity射线检测碰撞;射线检测unity射线坐标;unity 查找所有子物体;unity 射线从自身发射;unity碰撞检测;unity 碰撞检测 没反应;unity 点 射线;unity中的射线;unity射线移动;unity碰撞;碰撞点unity产生碰撞;unity碰撞之后;unity碰撞后不移动;unity 射线碰撞检测;unity 射线检测 范围;unity 坐标射线;unity查找子物体;unity发射射线
本帖被以下淘专辑推荐:
& |主题: 23, 订阅: 6
& |主题: 3, 订阅: 0
每日推荐:
111/50主题帖子积分
注册看看, 积分 11, 距离下一级还需 39 积分
注册看看, 积分 11, 距离下一级还需 39 积分
在线时间7 小时
每日推荐:
4411/500排名<font color="#FF昨日变化5主题帖子积分
四处流浪, 积分 411, 距离下一级还需 89 积分
四处流浪, 积分 411, 距离下一级还需 89 积分
在线时间183 小时
不错、不错、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
每日推荐:
71549/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 1549, 距离下一级还需 3451 积分
日久生情, 积分 1549, 距离下一级还需 3451 积分
蛮牛币3412
在线时间407 小时
学习下先,不错的经验啊,谢谢LZ
每日推荐:
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号
认证开发者
经过游戏蛮牛认证的独立开发者射线检测二级题库全_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
射线检测二级题库全
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩106页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢射线检测_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢服务器维护中.......
我们会尽快恢复,请稍后再试,谢谢!射线成像检测中常见问题,非常实用 & & & &随着国民经济的发展,现在射线成像检测的应用越来越广但在应用中,存在着诸多的问题本文拟对射线照相检测与成像检测的本质异同最大检测厚度存在较大差异的原因双壁检测时缺陷位置的确认缺陷的放大和如何对应评定等问题做一定探讨,并提出相应的解决方案,以供生产中应用常见问题的探讨(1)关于射线照相和射线成像检测的区别与联系 &目前射线照相检测是一种相对成熟的方法,那么,既然都是射线检测,其概念的内涵必然存在着一定的相关性如图1所示,这是两种检测方法的基本原理按图中所示,我们可以将两种检测方式均分为三部分:射线源工件和检测结果那么,按照无损检测的本质,我们可以设想,各种射线检测也都是对实际工件状态的一种间接探查,也就是说,如果我们针对同一个工件,射线源再一致的话,其结果在最理想的情况必然是一致的在现实的操作中,射线源工件一致也是很容易达到的,那么,二者的区别,主要在于接收结果的介质了图中可以看出,射线照相检测的接收介质为胶片,而射线成像检测的接收介质主要为电子元件(现实中,目前主要采用CCDCMOS闪烁晶体等),基于上述理念,无论哪一种都需要尽可能趋近于真实值,在较为成熟的情况下,必然都和真实工件差异不大那显然,两种方法的结果差异其实并不大,目前的试验数据也证实了这一点明确这一点,在应用较广的射线照相检测中得到的检测经验,也完全可以应用到射线成像检测中结合其原理,可以在很多工件的检测分析过程中借鉴这点是十分有意义的图1 射线照相检测和射线成像检测的原理(2)关于照相和成像检测的最大检测厚度的区别 & 如对于常见的450kV射线设备而言,射线照相检测最大能够检测约100mm,但同时射线成像检测仅能检测约70mm,二者存在很大的差异这个差异的原因是什么?在经典的物理试验双缝干涉试验中,我们可以得到这么一个结论:当少量光子到达目标时,其位置完全是随机的,可以出现在任何位置;而当大量光子到达时,其总体位置则基本是确定的也就是说,如果我们的接收器不动,即使穿透性不算好,但只要保证每次都有少量光子到达接收器上,在达到一定的时间长度后,即可得到一个确定的显示图样对于射线照相检测而言,因为其接收器胶片是不动的,显然符合这种情形但射线成像检测不同因为工件和接收器是相对运动的,在能够观测的情况下,其必须在短时间内满足一定的对比度和亮度,也就是说,必须在短时间内通过工件大量的光子才可以,结合光子的性质,可以看出,要达到这一点,在检测参数中,只能通过降低工件厚度,让更多的光子轻松透过来达到这就是二者存在最大检测厚度的较大差异的原因同时,了解这些,对于检测过程中为什么不同移动胶片为什么曝光量等于电流乘以时间等也会有更深的理解(3)关于双壁检测时缺陷位于哪层壁的确认方法 &对于工件的加工而言,缺陷定位始终是一个较为频繁的要求之一在射线照相检测中,单壁检测因为灵敏度较高定位容易等原因,始终是最优选择而且因为两层壁清晰度相差较大的原因,即使是双壁检测,也较容易区分清楚但这对于射线成像检测而言,则没有那么容易了首先,工件置于转台上射线成像检测现在有两种主要方式,一种是工件置于转台上,工件实时检测实时观察,可以得到即时的影像并可随时调整另外一种是工件置于传送带上,直接生成图像两种情况下,确定缺陷位置的方法并不相同对于前者而言,如图1所示射线源位于图片上方,这时候,对于观察到的实时成像结果而言,相当于于肉眼直接在下方观察这时候,可以以一定的速度来旋转工件,如图1所示当进行顺时针旋转时,在肉眼观察的结果图像上,将会出现前壁会相对向左移动后壁会相对向右移动的情形这时候,只要确认缺陷向左还是向右移动,即可判断缺陷所处的位置了当然,逆时针旋转时,反之图2 工件旋转时影像的相对运动示意其次,工件置于传送带上这和前面不同,大批量检测时,这种方法能够得到更高的效率,但不能够实时反映实时调整检测数据,因为人眼对运动物体的敏感性,其检出率也相对较低这时候,如果需要确认缺陷的位置,可以通过多次成像法,如图3所示在检测完毕后,将工件旋转一定的角度,按照进行一次成像这时候,因为上下两层壁其旋转的角度不同,显然其成像位置也不同这时候,对两次成像的结果进行比较和计算,以得到其位置有条件时,将工件旋转90°,可以得到更明确的结果图3 多次成像缺陷缺陷位置的方法(4)关于缺陷的放大和评定 &在几次接触后,笔者发现,这个极为重要的问题,是现场中最容易忽略的问题之一至于原因,其一,采用电子学的知识来确定缺陷的位置较为繁琐,很多检测人员并没有掌握该知识;其二,几何不清晰度在射线照相检测和射线成像检测存在的极大的不同很容易被忽略,加上检测效率的要求,经常引起该问题如图4所示在不考虑射线源尺寸引起的几何不清晰度的情况下,可以得到这么一个图样对于射线照相检测,因为胶片一般都是紧贴工件,图中L2基本上就是工件厚度,而且因为射线穿透性一般不高,所以在满足标准要求的情况下,L2远远小于L1,经过计算,其放大率往往介于1和1.1之间,且一般远小于1.1,在实际检测工件中,完全可以忽略进而按照1:1来评定但在射线成像检测中,为了防止工件在运动中和接收器之前的碰撞,L2是大于工件厚度的,有时候还会大很多更麻烦的是,如前面中提到,射线照相检测大都采用单壁透照,而射线成像检测多采用双壁透照,这样L2将是一个更大的值,这时,为尽量降低几何不清晰度,办法之一是增加L1的值,当L1远远大于L2时,这个问题可以很大缓解甚至可以看成与射线照相相同,如笔者单位采用的高能射线设备,L1值大于2m当增加L1不可做到时,现实中一般都是如此以笔者所见,射线成像中,射线源与工件的位置,很少有大于1m的这时候,还会带来另一个影响很大的问题,就是缺陷的放大性,不同的位置缺陷的放大率不同:不同部位的缺陷,即使尺寸相同,在投影到接收器上后,其大小存在着较大的差异,这点类似于超声波检测中增加DAC曲线的原因再加上检测结果为电子图像,存在可任意放大的情况,更加深了这一问题在射线检测中,针对这一问题,与DAC曲线的原理类似,可以通过不同位置分别讨论的方式来解决我们可以在不同位置分别放置一些对比尺寸板,如像质计(以下以丝型像质计为例),因为像质计在检测过程中是必须放置的,工件的厚度往往不同又导致需要放置多个,这样,在不同的位置分别放置,可以达到一举两得的目的同时,因为像质计的细丝长度是一定的,在按照前面来确定缺陷位于哪一层壁后,可以将电脑影像中该层壁上的像质计长度调整到与真实大小1:1,再对该缺陷进行评定,可以得到和射线照相检测类似的较为合理的结果这种方法也避免了采用电子学方法来对比缺陷大小的困难当然,对于因为几何不清晰度造成的缺陷投影虚化乃至于消失的问题,这种方法无法避免,且目前的射线成像检测也难以解决这也是射线成像检测的结果仍然比不上射线照相检测的原因之一图4 几何不清晰度示意(5)关于结果的评定 &在常规的铸锻焊三种检测方式中,因为加工工艺的原因,锻件并不适合做射线检测;焊缝因要求较高,对于薄板,如采用ISO 5817焊缝 钢镍钛及各自合金熔化焊接头(除束焊接外) 不完整分级进行评定,其缺陷大小往往精确到0.1mm,这对于成像检测而言,往往难以操作所以,目前射线成像检测主要针对铸件的射线检测而铸件的射线检测中,目前ASTM(美国材料与试验协会)标准为代表的对比标准底片评定级别的方法占有绝对的优势这些标准体系中,以ASTM E446为代表该标准名称为厚度不大于2英寸(50.8mm)的铸钢件射线标准参考底片,其配套的姊妹标准,有ASTM E186 厚壁(2~4 1/2英寸(50.8~114mm))铸钢件标准参考底片以及ASTM E280厚壁(4 1/2英寸到12英寸(114~305mm))铸钢件标准参考底片三套标准适用的厚度范围不同,基本覆盖了现实中用到的铸钢件范围另外,如ASTM E802厚度不大于4 1/2英寸(114mm)的灰铸铁标准参考底片和E689球墨铸铁标准参考底片,这些标准有正文,但没有配套的标准底片,其标准底片引用前面三个标准类似的,有ASTM E155铝和镁铸件检测用标准参考底片,ASTM E505铝和镁压铸件检测标准参考底片等,可以根据不同的情况下分别选择近些年ASTM开始改变利用底片来评定成像结果的方式,陆续增加了一些成像专用标准如和E446对应的E2868厚度不大于2英寸(50.8mm)的铸钢件标准数字参考图像,和E155E505对应的E2422铝铸件检测标准数字参考图像等但需要注意的是,目前并没有和E186E280配套的数字参考底片,且标准数字图像和标准底片没有本质差异,其应用自然也就基本相同对于初学者而言,这些标准的上手比其他类型的标准要难很多这时候,可以以某一标准为基准,当这个标准掌握后,其他标准的原理和上手方法基本是一样的,可以达到一通百通的效果至于标准的上手,先定性,再定量是个很好的方式结语射线成像检测是现在无损检测中较为热门的应用,其和射线照相检测既有诸多不同,又有较大的联系,明确区分二者的异同,对于检测的熟练度的提升,是个很好的方法同时,其不同之处也会带来不同的疑难,本文对检测中出现的一部分问题做了一定的探讨,囿于篇幅,这里不多赘述,以供无损检测人员在工作中参考来源:金属加工该作者最新发布网友推荐的文章最新发布的文章@

我要回帖

更多关于 unity 射线碰撞点坐标 的文章

 

随机推荐