class_docstr: Base class for all 3D objects with a geometry and that can participate in physics simulation.
  
  Attributes:
    scale (vec3d): By how much the object is scaled along each of the 3 cardinal directions.
  
    velocity (vec3d): Vector of velocities along (X, Y, Z).
    angular_velocity (vec3d): Angular velocity of the object around the X, Y, and Z axis.
  
    static (bool): Whether this object is considered static or movable (default) by
                   the physics simulation.
    mass (float): Mass of the object in kg.
    friction (float): Friction coefficient used for physics simulation of this object
                      (between 0 and 1).
    restitution (float): Restitution (bounciness) coefficient used for physics simulation of this
                         object (between 0 and 1).
  
    bounds (Tuple[vec3d, vec3d]): An axis aligned bounding box around the object relative to its
                                  center, but ignoring any scaling or rotation.
  
    material (Material): Material assigned to this object.
  
    segmentation_id (int): The integer id that will be used for this object in segmentation maps.
                           Can be set to None, in which case the segmentation_id will correspond to
                           the index of the object within the scene.
docstr: 3D bounding box as an array of 8 corners (shape = [8, 3])
docstr_tok: ["3D","bounding","box","as","an","array","of","8","corners","(","shape","=","[","8",",","3","]",")"]
code: def bbox_3d(self):
      """3D bounding box as an array of 8 corners (shape = [8, 3])"""
      bounds = np.array(self.bounds, dtype=np.float32)
      # scale bounds:
      bounds *= self.scale
      # construct list of bbox corners
      bbox_points = itertools.product(
          bounds[:, 0], bounds[:, 1], bounds[:, 2]
      )
      # rotate the bbox
      obj_orientation = pyquat.Quaternion(*self.quaternion)
      rotated_bbox_points = [
          obj_orientation.rotate(x) for x in bbox_points
      ]
      # shift by self.position and convert to single np.array
      return np.array([self.position + x for x in rotated_bbox_points])
  
imports: import itertools
  import numpy
  import pyquaternion
  import traitlets
  from typing import Optional, Union, Tuple
  from kubric.core import traits
  from kubric.core import assets
  from kubric.core import materials
  from kubric.kubric_typing import ArrayLike
label_desc: Use image node_id 5 for calling the PhysicalObject obj's underlying member method code with example usage: obj.bbox_3d() and returns: np