Source code for py3dtiles.tileset.bounding_volume
from __future__ import annotations
from abc import abstractmethod
from typing import TYPE_CHECKING, Any, Generic, TypeVar
import numpy as np
import numpy.typing as npt
from py3dtiles.typing import (
BoundingVolumeBoxDictType,
BoundingVolumeRegionDictType,
BoundingVolumeSphereDictType,
)
from .root_property import RootProperty
if TYPE_CHECKING:
from typing_extensions import Self
_BoundingVolumeJsonDictT = TypeVar(
"_BoundingVolumeJsonDictT",
BoundingVolumeBoxDictType,
BoundingVolumeRegionDictType,
BoundingVolumeSphereDictType,
)
[docs]
class BoundingVolume(
RootProperty[_BoundingVolumeJsonDictT], Generic[_BoundingVolumeJsonDictT]
):
"""
Abstract class used as interface for box, region and sphere.
"""
def __init__(self) -> None:
super().__init__()
# the following method should probably not be abstract and should construct the correct instance
# considering the dict format
[docs]
@classmethod
@abstractmethod
def from_dict(cls, bounding_volume_dict: _BoundingVolumeJsonDictT) -> Self:
"""
Construct a bounding volume from a dict. The implementor should support each possible format in the 3dtiles spec relevant to the specific flavor of bounding volume.
"""
...
[docs]
@abstractmethod
def get_center(self) -> npt.NDArray[np.float64]:
"""
Returns the center of this bounding volume.
"""
...
[docs]
@abstractmethod
def translate(self, offset: npt.NDArray[np.float64]) -> None:
"""
Translate the volume center with the given offset "vector"
:param offset: the 3D vector by which the volume should be translated
"""
...
[docs]
@abstractmethod
def add(self, other: BoundingVolume[Any]) -> None:
"""
Compute the 'canonical' bounding volume fitting this bounding volume
together with the added bounding volume. The computed fitting bounding volume is generically
not the smallest one (due to its alignment with the coordinate axis).
:param other: another bounding volume to be added with this one
"""
...
[docs]
@abstractmethod
def is_valid(self) -> bool:
"""
Test if the bounding volume is correctly defined.
"""
...
[docs]
@abstractmethod
def get_half_size(self) -> npt.NDArray[np.float64]:
"""
Returns the half size of this volume as a 3 elements array
"""
...
[docs]
@abstractmethod
def to_dict(self) -> _BoundingVolumeJsonDictT:
"""
Serialize this bounding volume into its JSON representation, ready to be embedded in a tileset.
"""
...