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 / 2, cam->GetViewport().height / 2);
//从中心点射出的射线
Ray ray = cam->GetScreenToWorldRay(centerPos);
//射线方向上遇到的模型结果集
NSceneQueryResult queryResult;
if (NPhysics::RayCastQuery(ray, queryResult))
{
/取出射线方向上碰撞的第一个结果集
auto hit = queryResult.entries[0];
/*获取到模型,就可以做相应操作,例如选中效果*/
};
