网站搜索

reactjs - 在新版 XR 中使用 useHitTest("@react-three/xr": "^5.0.1")


我见过使用低于 v5 版本的 @react-three/xr 与 useHitTest 的一些例子,但我不太确定如何使用新版本来转换语法……(以及在 TypeScript 中使用 useRef,这可能是另一个问题)。

这里是旧语法的一个例子:

使用 react-three/xr 进行平面检测

和

https://codesandbox.io/s/react-xr-usehittest-demo-5iff9?file=/src/App.tsx

但是我不确定(根据这个 react-three/xr 文档):

a. 在 ARCanvas 弃用后,如何将 sessionInit={{ requiredFeatures: ['hit-test'] }} 添加到 Canvas 或 XR 标签。

b. 是否仍然需要 hit.decompose。

c. 是否需要 mesh.applyMatrix4(hitMatrix),或者是否仍然需要像 ref={hitPoint} 这样的东西

d. 如果在 Typescript 中使用 ref,在将其添加到 mesh 时如何解决 Type 'MutableRefObject<undefined>' is not assignable 错误。根据这个答案,也许我需要强制挂载组件之类的操作..

任何帮助或示例都将不胜感激。谢谢

答案#1

好吧,我找到了一个关于 "@react-three/xr": "^5.1.2" 的命中测试示例,也许对你有帮助

import React, { useRef } from "react";
// eslint-disable-next-line
import { XR, Controllers, Hands, ARButton, useHitTest } from "@react-three/xr";
// eslint-disable-next-line
import { Box, OrbitControls } from "@react-three/drei";
import { Canvas } from "@react-three/fiber";
// eslint-disable-next-line
import { Matrix4, Mesh } from "three";


const HitTestExample = () => {
  const ref = useRef(null!);

  useHitTest((hitMatrix: Matrix4, hit: XRHitTestResult) => {
    // @ts-ignore
    hitMatrix.decompose(ref.current.position, ref.current.quaternion, ref.current.scale);
  });

  return (
    <Box ref={ref} args={[0.1, 0.1, 0.1]}/>
  );
};

const App = () => {
  return (
    <>
      <ARButton sessionInit={{ requiredFeatures: ["hit-test"] }}/>
      <Canvas>
        <XR>
          <ambientLight />
          <pointLight position={[10, 10, 10]} />
          <HitTestExample />
          <Controllers />
        </XR>
      </Canvas>
    </>
  );
};

export default App;