当前位置:   article > 正文

unity中htc vive射线与UI碰撞检测-graphcs.Raycast()_htcvive 相机射线检测

htcvive 相机射线检测
  1. // htc vive CanvasRaycastMethod
  2. /*
  3. 继承关系:IRaycastMethod 接口<-- BaseRaycastMetod抽象类 <-- CanvasRaycastMethod
  4. 重写Raycast(Ray ray, float distance, List<RaycastResult> raycastResults)
  5. */
  6. public override void Raycast(Ray ray, float distance, List<RaycastResult> raycastResults)
  7. {
  8. var tempCanvases = ListPool<ICanvasRaycastTarget>.Get();
  9. tempCanvases.AddRange(canvases);
  10. for (int i = tempCanvases.Count - 1; i >= 0; --i)
  11. {
  12. var target = tempCanvases[i];
  13. if (target == null || !target.enabled) { continue; }
  14. Raycast(target.canvas, target.ignoreReversedGraphics, ray, distance, raycaster, raycastResults);// raycaster from BaseRaycastMetod
  15. }
  16. ListPool<ICanvasRaycastTarget>.Release(tempCanvases);
  17. }
  18. public static void Raycast(Canvas canvas, bool ignoreReversedGraphics, Ray ray, float distance, Pointer3DRaycaster raycaster, List<RaycastResult> raycastResults)
  19. {
  20. if (canvas == null) { return; }
  21. var eventCamera = raycaster.eventCamera; // 获取相机事件
  22. var screenCenterPoint = Pointer3DInputModule.ScreenCenterPoint; // 获得屏幕的中心点
  23. var graphics = GraphicRegistry.GetGraphicsForCanvas(canvas); // 获取canvas中的Graphic列表, UI中图形继承的Graphic
  24. // Pointer3DRaycaster should set tje eventCamera to correct position
  25. for (int i = 0; i < graphics.Count; ++i)
  26. {
  27. var graphic = graphics[i];
  28. // -1 means it hasn't been processed by the canvas, which means it isn't actually drawn
  29. if (graphic.depth == -1 || !graphic.raycastTarget) { continue; }
  30. if (!RectTransformUtility.RectangleContainsScreenPoint(graphic.rectTransform, screenCenterPoint, eventCamera)) { continue; }
  31. // 如果射线方向和graphic法线方向夹角大于90或者大于-90,说明只能看到线或者graphic的背面
  32. if (ignoreReversedGraphics && Vector3.Dot(ray.direction, graphic.transform.forward) <= 0f) { continue; }
  33. // 如果是有效位置返回真,否则返回假
  34. if (!graphic.Raycast(screenCenterPoint, eventCamera)) { continue; }
  35. //var dist = Vector3.Dot(transForward, trans.position - ray.origin) / Vector3.Dot(transForward, ray.direction);
  36. float dist;
  37. // 法线加点绘制平面 返回沿射线与平面相交的距离
  38. new Plane(graphic.transform.forward, graphic.transform.position).Raycast(ray, out dist);
  39. if (dist > distance) { continue; }
  40. raycastResults.Add(new RaycastResult
  41. {
  42. gameObject = graphic.gameObject,
  43. module = raycaster,
  44. distance = dist,
  45. worldPosition = ray.GetPoint(dist),
  46. worldNormal = -graphic.transform.forward,
  47. screenPosition = screenCenterPoint,
  48. index = raycastResults.Count,
  49. depth = graphic.depth,
  50. sortingLayer = canvas.sortingLayerID,
  51. sortingOrder = canvas.sortingOrder
  52. });
  53. }
  54. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/146033
推荐阅读
相关标签
  

闽ICP备14008679号