纳金网

标题: 射线碰撞 [打印本页]

作者: ku    时间: 2013-4-22 21:29
标题: 射线碰撞
本帖最后由 艾西格亚 于 2013-4-23 17:09 编辑

射线碰撞         
                                                                                 
                                                                                                                                                               


方法一:Physics.Raycast 光线投射

1.static function Raycast (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

一个静态的发射射线的方法,在场景中投下可与所有碰撞器碰撞的一条光线。
参数解释:
origin:射线起始点
direction:射线方向
distance:射线长度
layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。
返回布尔类型,当光线投射与任何碰撞器交叉时为真,否则为假。
(注意:如果从一个球型体的内部到外部用光线投射,返回为假。 )这一点测试不成功!

2.static function Raycast (origin : Vector3, direction : Vector3, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息。
Parameters参数
origin
The starting point of the ray in world coordinates.
在世界坐标,射线的起始点。
direction
The direction of the ray.
射线的方向。
distance
The length of the ray
射线的长度。
hitInfo
If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
如果返回true,hitInfo将包含碰到器碰撞的更多信息。

layerMask
A Layer mask that is used to selectively ignore colliders when casting a ray.
只选定Layermask层内的碰撞器,其它层内碰撞器忽略。

Returns
当光线投射与任何碰撞器交叉时为真,否则为假。
使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。

详细解释一下: LayerMask 层蒙版
如图所示,每一个物体都有一个Tag和Layer标签,tag就是一个简单的标签,可以用来区分不同的物体,LayerMask的作用是可以选择性地过滤物体,例如当投射射线时,比如camera.cullingmask和光线投射时候。

如图,可以在TagManager中编辑tag和Layer
然后设置物体的Layer层级,在摄像机中设置camera.cullingmask,可以控制摄像机的渲染层级,用在射线上,可以控制射线碰撞什么,不碰撞什么。

//Raycast hit
RaycastHit hit;
LayerMask mask = 1 << 8;
void testRay(){
if(Physics.Raycast(transform.position,Vector3.right,out
hit,100, mask.value)){
Debug.DrawLine(transform.position,hit.point,Color.red,1);
}
}
上面的例子是从当前脚本所绑定的物体做标点向右发射长度100的射线,射线碰撞层级为8,其他层级忽略。
为了测试,我们在碰撞到物体后画一条红色线条,表示射线,停留一秒钟。
上面这些是射线的一些基本操作。

方法二:Physics.RaycastAll 光线投射
static function RaycastAll (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]
static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]

投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。


作者: 狂风大尉    时间: 2013-4-23 04:02
谢谢楼主的分享了,一直对raycast有些不解,现在清楚多了
作者: may    时间: 2013-4-23 16:44
先支持再说,楼主的分享很不错




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5