Raycast,為 射線檢測。
定義:射線檢測也被稱為命中檢測、打擊測試等,主要是指用戶在點擊屏幕的時候,發(fā)生出一條虛擬的射線并判斷是否命中在當(dāng)前場景中的虛擬平面上。射線檢測完成后會返回這條射線貫穿的任何平面或特征點以及交叉位置在現(xiàn)實世界空間中的位置和姿態(tài)。在AR應(yīng)用中,我們通常通過射線檢測來獲得錨點在平面上的具體位置,也就是虛擬物體所放置的位置。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
延伸閱讀:
射線檢測的相關(guān)文檔
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 參數(shù)
origin The starting point of the ray in world coordinates.
在世界坐標(biāo),射線的起始點。
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.
指定是否查詢碰到觸發(fā)器。
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.
碰到的三角形的重心坐標(biāo)。
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光照貼圖的坐標(biāo)。
normal The normal of the surface the ray hit.
射線觸碰表面的法線。
point The impact point in world space where the ray hit the collider.
在世界坐標(biāo)空間,射線碰到碰撞器的接觸點。
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紋理坐標(biāo)。
textureCoord2 The secondary uv texture coordinate at the impact point.
在接觸點處的第二套UV紋理坐標(biāo)。
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.
當(dāng)光線投射與任何碰撞器交叉時為真,否則為假。
缺省參數(shù):
QueryTriggerInteraction
UseGlobal Queries use the global Physic.queriesHitTrigger setting查詢使用Physics.queriesHitTriggers全局變量
Ignore Queries never report Trigger hits查詢從不包含觸發(fā)器碰撞
Collide Queries always report Trigeger hits 查詢總是報告觸發(fā)器碰撞
簡單來說就是,枚舉為Ignore時,所有含碰撞器的物體,都將被射線檢測忽略。為UseGlobal時反之。
那么這條射線的源點在哪,又是沿什么方向呢?
文檔中說:產(chǎn)生的射線是在世界空間中,從相機(jī)的近裁剪面開始并穿過屏幕position(x,y)像素坐標(biāo)(position.z被忽略)。
那么為什么要把鼠標(biāo)位置轉(zhuǎn)化為屏幕位置呢?
因為單位不一樣;
屏幕空間點用像素定義,屏幕的左下為(0,0);右上是(PixelWidth,pixelHeight).Z的位置是以世界單位衡量的到相機(jī)的距離。是像素坐標(biāo)。
而攝像機(jī)的Vector3則是世界坐標(biāo),所以需要把屏幕上的點轉(zhuǎn)化為世界坐標(biāo)。
ScreenPointToRay() 函數(shù)可以把屏幕像素坐標(biāo)變成一條射線。
延伸閱讀來源:https://blog.csdn.net/bwabdbkjdbkjwabd/article/details/121519004