use-getter.ts 1.0 KB

123456789101112131415161718192021222324252627282930313233
  1. import { Raycaster, Vector2, Vector3 } from "three";
  2. import { installThreeGlobalVar, useCamera, useContainer, useScene } from "./use-stage";
  3. export const useRaycaster = installThreeGlobalVar(() => new Raycaster());
  4. export const useGetIntersectObject = () => {
  5. const scene = useScene();
  6. const raycaster = useRaycaster();
  7. return (origin: Vector3, direction: Vector3, far = 10000, near = 0) => {
  8. raycaster.set(origin, direction);
  9. raycaster.far = far
  10. raycaster.near = near
  11. return raycaster.intersectObject(scene);
  12. };
  13. };
  14. export const useGetIntersectObjectByPixel = () => {
  15. const scene = useScene();
  16. const raycaster = useRaycaster();
  17. const camera = useCamera();
  18. const container = useContainer()
  19. return (pixel: Vector2) => {
  20. if (container.value) {
  21. pixel = pixel.clone()
  22. pixel.setX((pixel.x / container.value.offsetWidth) * 2 - 1)
  23. pixel.setY(-(pixel.y / container.value.offsetHeight) * 2 + 1)
  24. }
  25. raycaster.setFromCamera(pixel, camera);
  26. return raycaster.intersectObject(scene);
  27. };
  28. };