pmndrs / use-cannon

👋💣 physics based hooks for @react-three/fiber
https://cannon.pmnd.rs
2.76k stars 155 forks source link

Respect parent position, rotation[, scale?] #311

Open mattblackdev opened 2 years ago

mattblackdev commented 2 years ago

Sometimes you want to do this:

function Thing({ position, rotation }) {
  const [ref] = useBox(() => ({ position, rotation }));
  return (
    <Box ref={ref} />
  );
}

function CoolThing({ position, rotation }) {
  return (
    <group position={position} rotation={rotation}>
      <Thing position={offset1} />
      <Thing position={offset2} />
      <Thing />
      <Thing rotation={offsetRot} />
    </group>
  );
}

But then you learn that the physics world has no consideration of the scene hierarchy.

And you might even try to do this:

<Box onUpdate={self => {
  const v = new Vector3()
  self.getWorldPosition(v)
  api.position.copy(v)
}} />

But in the end you learn that this is a harder problem to solve indeed...

So you create a repro of the issue: https://codesandbox.io/s/use-cannon-not-respecting-parent-rchms?file=/src/App.tsx

And you go back to manually managing world positions:

function CoolThing({ position, rotation }) {
  return (
    <>
      <Thing position={add(position, offset1)} rotation={rotation} />
      <Thing position={add(position, offset2)} rotation={rotation} />
      <Thing position={position} rotation={rotation} />
      <Thing position={position} rotation={add(rotation, offsetRot)} />
    </>
  );
}
bjornstar commented 2 years ago

I don't really understand the problem you are reporting.

You have 4 different physics objects inside of a group, but the group has no physics representation.

What is it supposed to be doing? Is it affecting the positions and rotations of the 4 physics bodies?

This looks to me like a single CompoundBody with 4 shapes. Have you tried using that?

mattblackdev commented 2 years ago

I see what you mean. I implemented parts of structures (walls, floors, etc.) and interior objects as separate components that could be composed interchangeably.

When it came time to position different compositions I tried putting them inside groups to only manage one world position per building. Problem was the groups' position didn't affect the children's colliders, only their meshes.

I get the compound body approach but it doesn't seem ideal for composing components that have their own colliders.

Thanks for giving this some thought. Cheers!