专题栏目:ARVRMR虚拟现实

Raycast | Raycast是什么意思?

Raycast,为 射线检测。

定义:射线检测也被称为命中检测、打击测试等,主要是指用户在点击屏幕的时候,发生出一条虚拟的射线并判断是否命中在当前场景中的虚拟平面上。射线检测完成后会返回这条射线贯穿的任何平面或特征点以及交叉位置在现实世界空间中的位置和姿态。在AR应用中,我们通常通过射线检测来获得锚点在平面上的具体位置,也就是虚拟物体所放置的位置。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

延伸阅读:

射线检测的相关文档

public static bool RayCast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

public static bool Raycast(Ray ray, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

Parameters 参数

origin The starting point of the ray in world coordinates.
在世界坐标,射线的起始点。
direction The direction of the ray.
射线的方向。
distance The length of the ray.
射线的长度。
layermask A Layer mask that is used to selectively ignore colliders when casting a ray.
投射射线,选择投射的层蒙版。
queryTriggerInteraction Specifies whether this query should hit Triggers.
指定是否查询碰到触发器。
ray The starting point and direction of the ray.
射线的起点和方向
hitInfo If true is returned, hitInfo will contain more information about where the collider was hit (See Also: RaycastHit).
hitInfo将包含碰到器碰撞的更多信息。

RaycastHit 射线投射碰撞信息

Variables 变量
barycentricCoordinate The barycentric coordinate of the triangle we hit.
碰到的三角形的重心坐标。
collider The Collider that was hit.
碰到的碰撞器。
distance The distance from the ray’s origin to the impact point.
从射线的原点到触碰点的距离。
lightmapCoord The uv lightmap coordinate at the impact point.
在触碰点的UV光照贴图的坐标。
normal The normal of the surface the ray hit.
射线触碰表面的法线。
point The impact point in world space where the ray hit the collider.
在世界坐标空间,射线碰到碰撞器的接触点。
rigidbody The Rigidbody of the collider that was hit. If the collider is not attached to a rigidbody then it is null.
碰到的该碰撞器上的刚体。如果碰撞器上没有附加刚体,那么返回null。
textureCoord The uv texture coordinate at the impact point.
在触碰点的UV纹理坐标。
textureCoord2 The secondary uv texture coordinate at the impact point.
在接触点处的第二套UV纹理坐标。
transform The Transform of the rigidbody or collider that was hit.
碰到的该刚体或碰撞器的变换。
triangleIndex The index of the triangle that was hit.
碰到的三角形的索引。

Returns 返回

bool True when the ray intersects any collider, otherwise false.
当光线投射与任何碰撞器交叉时为真,否则为假。

缺省参数:

  1. layerMask参数缺省为DefaultRaycastLayers
  2. distance被缺省为正无穷
  3. queryTriggerInteraction 被缺省为QueryTriggerInteraction.UseGlobal

QueryTriggerInteraction

UseGlobal Queries use the global Physic.queriesHitTrigger setting查询使用Physics.queriesHitTriggers全局变量
Ignore Queries never report Trigger hits查询从不包含触发器碰撞
Collide Queries always report Trigeger hits 查询总是报告触发器碰撞
简单来说就是,枚举为Ignore时,所有含碰撞器的物体,都将被射线检测忽略。为UseGlobal时反之。

那么这条射线的源点在哪,又是沿什么方向呢?
文档中说:产生的射线是在世界空间中,从相机的近裁剪面开始并穿过屏幕position(x,y)像素坐标(position.z被忽略)。

那么为什么要把鼠标位置转化为屏幕位置呢?
因为单位不一样;
屏幕空间点用像素定义,屏幕的左下为(0,0);右上是(PixelWidth,pixelHeight).Z的位置是以世界单位衡量的到相机的距离。是像素坐标。
而摄像机的Vector3则是世界坐标,所以需要把屏幕上的点转化为世界坐标。
ScreenPointToRay() 函数可以把屏幕像素坐标变成一条射线。

延伸阅读来源:https://blog.csdn.net/bwabdbkjdbkjwabd/article/details/121519004

发表评论

相关文章