Skip to content

NPhysics

射线检测

射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线的轨迹上,一旦与添加了碰撞器的物体发生碰撞,将停止发射。我们可以利用射线实现子弹击中目标的检测,鼠标点击拾取物体等功能。

Nibiru Studio中我们定义了Ray类表示射线,每个射线包含了原点与方向。同时通过我们提供的NPhysics类来进行射线检测。

接口名称返回值接口含义
RayCastQuery(const Ray& ray, NSceneQueryResult& result, bool sort = true, ERayColliderType type = ERayColliderType::RCT_Mesh,uint32 layerMask = UINT_MAX);bool获取光线方向上的模型
RayCast(const Ray& ray, int maxDistance, uint32 layerMask);bool检测光线是否碰撞
RayCast(const Ray& ray, int maxDistance, NSceneQueryResultEntry& hitResult, uint32 layerMask);bool检测光线是否碰撞并返回结果
RayCast(const Vector3& origin, const Vector3& direction, int maxDistance, uint32 layerMask);bool检测光线是否碰撞
RayCast(const Vector3& origin, const Vector3& direction, int maxDistance, NSceneQueryResultEntry& hitResult, uint32 layerMask);bool检测光线是否碰撞并返回结果
RayCastAll(const Ray& ray, int maxDistance, uint32 layerMask);NSceneQueryResult获取光线的所有碰撞结果
RayCastAll(const Vector3& origin, const Vector3& direction, int maxDistance, uint32 layerMask);NSceneQueryResult获取光线的所有碰撞结果

示例代码:

cpp
//自定义射线  
Ray myRay;  
myRay.origin = 坐标原点;  
myRay.direction = 方向;  
//获取场景生成射线  
NCameraPtr cam = NCamera::GetCurrent();  
//获取视景的中心点  
Vector2 centerPos(cam->GetViewport().width / 2cam->GetViewport().height / 2);  
//从中心点射出的射线  
Ray ray = cam->GetScreenToWorldRay(centerPos);  
//射线方向上遇到的模型结果集  
NSceneQueryResult queryResult;  
if (NPhysics::RayCastQuery(ray, queryResult))  
{  
    /取出射线方向上碰撞的第一个结果集  
    auto hit = queryResult.entries[0];  
    /*获取到模型,就可以做相应操作,例如选中效果*/  
};