Как понять «useBox» в react-три волокна

#javascript #reactjs #react-three-fiber #cannon.js

Вопрос:

Мне интересно узнать, как создавать динамические объекты и группировать их полностью в react/JavaScript. Я рассматриваю стул и стол в этом примере как свою модель:

https://codesandbox.io/s/ragdoll-physics-forked-bntr9

На данный момент меня волнует не столько «физика», сколько то, как создать три объекта, таких как таблица, состоящая из 5 3D-прямоугольников.

Я скачал приведенный выше пример, и это код для таблицы:

 function Table() {
  const [seat] = useBox(() => ({ type: 'Static', position: [9, -0.8, 0], args: [2.5, 0.25, 2.5] }))
  const [leg1] = useBox(() => ({ type: 'Static', position: [7.2, -3, 1.8], args: [0.25, 2, 0.25] }))
  const [leg2] = useBox(() => ({ type: 'Static', position: [10.8, -3, 1.8], args: [0.25, 2, 0.25] }))
  const [leg3] = useBox(() => ({ type: 'Static', position: [7.2, -3, -1.8], args: [0.25, 2, 0.25] }))
  const [leg4] = useBox(() => ({ type: 'Static', position: [10.8, -3, -1.8], args: [0.25, 2, 0.25] }))
  return (
    <>
      <Box scale={[5, 0.5, 5]} ref={seat} />
      <Box scale={[0.5, 4, 0.5]} ref={leg1} />
      <Box scale={[0.5, 4, 0.5]} ref={leg2} />
      <Box scale={[0.5, 4, 0.5]} ref={leg3} />
      <Box scale={[0.5, 4, 0.5]} ref={leg4} />
      <Suspense fallback={null}>
        <Mug />
      </Suspense>
    </>
  )
}
 

И в верхней части программы я вижу это:

 import {
  Physics,
  useBox,
  useCompoundBody,
  useCylinder,
  useSphere,
  usePlane,
  useConeTwistConstraint,
  usePointToPointConstraint
} from '@react-three/cannon'
 

Поиск в Google react-три/кэннон привел меня к https://opensourcelibs.com/lib/use-cannon, и ссылка «github» привела меня к https://github.com/pmndrs/use-cannon, который я скачал.

Есть ли документ в «useBox», или мне просто нужно прочитать код, чтобы понять, как он работает?

Без какого-либо документа я могу выполнять только контролируемые вариации, например, предположим, что я просто хочу сделать ножки стола длиннее или столешницу больше? Я не понимаю, что соединяет ножки со столом, но я полагаю, что это должно быть положение или аргументы:

Я попытался изменить 1.8 на 2.8 следующим образом: с

 const [leg1] = useBox(() => ({ type: 'Static', position: [7.2, -3, 1.8], args: [0.25, 2, 0.25] }))
 

Для

 const [leg1] = useBox(() => ({ type: 'Static', position: [7.2, -3, 2.8], args: [0.25, 2, 0.25] }))
 

и я увидел, как ножка вылезла из-под столешницы.

Я знал, что все ножки стола имеют одинаковую длину, поэтому я попытался изменить какое-то число, которое было одинаковым для всех четырех ножек (позже я заметил, что у двух было 1.l8, а у двух -1,8). Я также предполагаю, что некоторый набор из трех параметров должен быть длиной, шириной, высотой.

Затем я попытался переодеться:

   <Box scale={[0.5, 4, 0.5]} ref={leg1} />
  <Box scale={[0.5, 4, 0.5]} ref={leg2} />
 

Для

   <Box scale={[0.5, 6, 0.5]} ref={leg1} />
  <Box scale={[0.5, 6, 0.5]} ref={leg2} />
 

И это дело действительно длиною в две ноги, но выше верхней части стола.

Таким образом, главный вопрос заключается не в том, как изменить длину ног, а в том, как найти документацию.

Я поискал в библиотеке pmndr «useBox» и увидел множество совпадений: введите описание изображения здесь

Я посмотрел на источникиhooks.ts и нашел это, что мне совсем не помогает:

 export function useBox(fn: GetByIndex<BoxProps>, fwdRef: Ref<Object3D> = null, deps?: DependencyList) {
  const defaultBoxArgs: Triplet = [1, 1, 1]
  return useBody('Box', fn, (args = defaultBoxArgs): Triplet => args, fwdRef, deps)
}
 

Комментарии:

1. schteppe.github.io/cannon.js/docs/classes/Box.html

2. @iLuvLogix Я не вижу этого на странице выше. И каковы отношения между useBox и Box?

3. useBox является ли крючок одной из возможных реализаций класса Box, насколько я понимаю, поскольку react-three-fibre полагается на пушку, как указано здесь: import {useBox} from '@react-three/cannon' . scale может быть использован на возвращенном mesh через scale={foo ? 2 : 1} , например

Ответ №1:

На данный момент меня волнует не столько «физика», сколько то, как создать три объекта, таких как таблица, состоящая из 5 3D-прямоугольников.

useBox предназначен только для физики, он взят из физической библиотеки «cannon», а не из threejs или r3f. он аппроксимирует форму и связывает ее с произвольной геометрией. физический движок теперь управляет буквальным ящиком, кубом, и подвергает его воздействию гравитации и других коллайдеров. если ваша форма напоминает что-то вроде сферы, вы бы использовали вместо нее сферу использования и так далее.

пример, который вы выбрали для изучения либо threejs, либо r3f, является сложным, я бы не стал начинать с физики. пример на главной странице github (https://codesandbox.io/s/rrppl0y8l4?file=/src/App.js) охватывает некоторые основы, объедините это с имеющимися под рукой документами threejs, и у вас будет гораздо более удобный опыт обучения.

поле в трех значениях (в нотации react) — это не более чем это:

 <mesh position={[1, 2, 3]} rotation={[Math.PI / 3, 0, 0]}>
  <boxGeometry />
  <meshBasicMaterial color="red" />
</mesh>
 

и вы формируете такие группы, как:

 <group>
  <mesh>
    ..
 

если вы хотите начать с физики позже, вот несколько более простых:

Комментарии:

1. Причина, по которой я выбрал этот пример, заключается в том, что на нем были показаны стол и стул, которые показывали, как «склеить» кучу 3D-прямоугольников (коробок) вместе, чтобы сформировать более реальный объект (без использования файла .glb). Единственный другой, который я нашел, — это тот, у которого были какие-то заборы: codesandbox.io/s/threejs-journey-ni6v4?file=/src/components/… , но они могут быть из файла .jpg или .glb. Я провожу некоторые исследования, чтобы выяснить, можем ли мы создать интерактивный конструктор сарая, в котором мы сможем динамически изменять размер сарая. Если бы мы использовали файл .glb, то я полагаю, что нам понадобился бы один файл для каждого размера.

2. Оказывается, заборы во втором примере также взяты из файла .glb.

3. Ну, у usebox есть свойства, я уверен, но, по сути, никакой документации