屏幕一点反投影成射线,场景求交返回命中节点与三角形;包围盒/球/三角形的原子测试与容量协商式区域查询一起组成完整的拾取工具箱。
xge3d_ray_t tRay;
xge3dCameraScreenRay(&tCam, fMouseX, fMouseY, fWidth, fHeight, &tRay);
// 像素坐标自左上、帧缓冲像素;射线原点在近平面上
xge3d_hit_t tHit;
int r = xge3dSceneRaycast(pScene, &tRay, 1000.0f, &tHit);
if (r == XGE_OK) {
// tHit.node / model_root / distance(米) / position / normal / triangle
}SceneRaycast 归一化非零方向、测试可见网格三角形的双面;无命中返回 NOT_FOUND 并清空输出。骨骼网格的包围随当前姿势收紧。
xge3d_aabb_t tBox; float fDist;
xge3dRayAabb(&tRay, &tBox, 100.0f, &fDist);
xge3dRaySphere(&tRay, &tSphere, 100.0f, &fDist);
xge3dRayTriangle(&tRay, tTriangle, 100.0f, &tHit);
// 容量协商:先数后取
size_t stCount;
xge3dSceneQueryAabb(pScene, &tBox, NULL, 0, &stCount);
xge3d_node_t *pNodes = malloc(stCount * sizeof(*pNodes));
xge3dSceneQueryAabb(pScene, &tBox, pNodes, stCount, &stCount);