reactjs 如何在react three fiber中得到物体的大小?

7dl7o3gd  于 2023-01-02  发布在  React
关注(0)|答案(2)|浏览(196)

我想根据另一个对象的大小来调整react中某个对象的大小。我已经用STL加载器加载了这两个对象,我想使用它们。

const geomUpper = useLoader(STLLoader, upperUrl)
const geomLower = useLoader(STLLoader, lowerUrl)

然后我想用geomUpper的大小来调整geomLower的大小,但是我不知道怎么得到geomUpper的大小,有没有办法得到它的大小?

nvbavucw

nvbavucw1#

    • 已更新**

在一个效果钩子中,你可以得到geomUpper的大小,并使用它来缩放geomLower

function Scene() {
  const geomUpper = useLoader( STLLoader, '/upper.stl' );
  const geomLower = useLoader( STLLoader, '/lower.stl' );

  useEffect(() => {

    if ( ! geomUpper.boundingSphere ) {
      geomUpper.computeBoundingSphere();
    }
    console.log( 'geomUpper radius', 
      geomUpper.boundingSphere.radius );

    if( ! geomLower.boundingSphere ) {
      geomLower.computeBoundingSphere();
    }
    console.log( 'geomLower radius', 
      geomLower.boundingSphere.radius );

    const scale = geomUpper.boundingSphere.radius / 
      geomLower.boundingSphere.radius;

    geomLower.scale( scale, scale, scale );
    console.log( 'geomLower radius (after scaling)', 
      geomLower.boundingSphere.radius );

  })

  return (
    <Suspense>
      <mesh geometry={geomUpper} />
      <mesh geometry={geomLower} />
    </Suspense>
  )
}

我在这里使用boundingShere的半径作为大小的代理,但这只是为了简洁起见。您可以使用boundingBox的 * x y * 和 * z * 维度,并使用更高级的逻辑来满足您的需要。我的console.log()调用只是进行健全性检查,可以删除。

    • 原始答案**(不适用于React Three Fiber,但适用于vanilla Three.js)

如果geomUpper的位置位于其网格内部,则此操作应该有效。

// create a Box3 to hold the dimensions
// initialize it to a zero-size box at geomUpper's position
const bbox = new THREE.Box3(geomUpper.position, geomUpper.position);

// expand the box to include geomUpper's children
// expandByObject mutates bbox
bbox.expandByObject(geomUpper);

// get the size of bbox
let size = new THREE.Vector3();
bbox.getSize(size);
9udxz4iz

9udxz4iz2#

另一种可能更简单的方法是计算对象的边界框并获得其大小。

// Compute the bounding box
const bbox = new THREE.Box3().setFromObject(objectRef.current)
// Init your size variable
const bboxSize = new THREE.Vector3(bbox)
// Get the size
bbox.getSize(bboxSize)
// Now use bboxSize (x,y,z)

相关问题