IntersectionChecker

IIntersectionChecker

IIntersectionChecker – базовый интерфейс обработки пересечений объектов. Подробнее: ISceneIntersectionChecker и IModelIntersectionChecker.

export interface IIntersectionChecker<TOptions extends IntersectionCheckOptions> {
  getIntersectionPoint(): THREE.Intersection<THREE.Object3D> | undefined;
  getIntersectionByRay(ray: THREE.Ray, camera: THREE.Camera, options?: TOptions): THREE.Intersection<THREE.Object3D> | undefined;
  getIntersectionIDByRay(ray: THREE.Ray, camera: THREE.Camera, options?: TOptions): { modelId: string, guid: string } | undefined;
  getIntersectionByNdcPt(ndcPos: THREE.Vector2, camera: THREE.Camera, options?: TOptions): THREE.Intersection<THREE.Object3D> | undefined;
  getIntersectionIDByNdcPt(ndcPos: THREE.Vector2, camera: THREE.Camera, options?: TOptions): { modelId: string, guid: string } | undefined;
  getIntersectionIDByFrustumNdcPt(ndcFrustumBox: THREE.Box3, unProjMatrix: THREE.Matrix4, isContainsOnly: boolean, options?: TOptions): { modelId: string; guid: string; }[] | undefined;
}

Методы

getIntersectionPoint()

Метод возвращает последнее рассчитанное пересечение модели.

  getIntersectionPoint(): THREE.Intersection<THREE.Object3D> | undefined;

Возвращает объект типа THREE.Intersection, если пересечение существует. В противном случае возвращает undefined.

getIntersectionByRay()

Метод возвращает ближайшее пересечение объекта модели с лучом.

  getIntersectionByRay(ray: THREE.Ray, camera: THREE.Camera, options?: TOptions): THREE.Intersection<THREE.Object3D> | undefined;

где:
ray – луч, с которым считаются пересечения. Подробнее: THREE.Ray.

camera – камера, используемая в отрисовке. Необходима для проверки пересечений с объектами, не зависящими от глубины кадра: спрайтами, текстовыми метками, точками замечаний и т.д.

options – параметры проверки пересечений. Необязательный параметр. Подробнее: SceneCheckOptions, ModelCheckOptions.
Возвращает объект типа THREE.Intersection, если пересечение существует. В противном случае возвращает undefined.

getIntersectionIDByRay()

Метод возвращает modelId и entityGuid ближайшего объекта модели, пересекающегося с лучом.

  getIntersectionIDByRay(ray: THREE.Ray, camera: THREE.Camera, options?: TOptions): { modelId: string, guid: string } | undefined;

где:
ray – луч, с которым считаются пересечения. Подробнее: THREE.Ray.

camera – камера, используемая в отрисовке. Необходима для проверки пересечений с объектами, не зависящими от глубины кадра: спрайтами, текстовыми метками, точками замечаний и т.д.

options – параметры проверки пересечений. Необязательный параметр. Подробнее: SceneCheckOptions, ModelCheckOptions.
Возвращает объект { modelId: string, guid: string }, если пересечение существует. В противном случае возвращает undefined.

getIntersectionByNdcPt()

Метод возвращает ближайшее пересечение объекта модели с лучом, выпущенным из точки нахождения камеры в направлении точки в Normalized Device Coordinates (NDC пространство).

  getIntersectionByNdcPt(ndcPoint: THREE.Vector2, camera: THREE.Camera, options?: TOptions): THREE.Intersection<THREE.Object3D> | undefined;

где:
ndcPoint – 2D координаты точки в Normalized Device Coordinates (NDC пространство), в которую выпускается луч. Подробнее: THREE.Vector2.

camera – камера, используемая для определения положения начала луча и для перевода Normalized Device Coordinates (NDC пространство) в мировые координаты. Подробнее: THREE.Camera.

options – параметры проверки пересечений. Необязательный параметр. Подробнее: SceneCheckOptions, ModelCheckOptions.
Возвращает объект типа THREE.Intersection, если пересечение существует. В противном случае возвращает undefined.

getIntersectionIDByNdcPt()

Метод возвращает modelId и entityGuid ближайшего объекта модели, пересекающегося с лучом, выпущенным из точки нахождения камеры в направлении точки в Normalized Device Coordinates (NDC пространство).

  getIntersectionIDByNdcPt(ndcPoint: THREE.Vector2, camera: THREE.Camera, options?: TOptions): { modelId: string, guid: string } | undefined;

где:
ndcPoint – 2D координаты точки, в которую выпускается луч, в Normalized Device Coordinates (NDC пространство). Подробнее: THREE.Vector2.

camera – камера, используемая для определения положения начала луча и для перевода Normalized Device Coordinates (NDC пространство) в мировые координаты. Подробнее: THREE.Camera.

options – параметры проверки пересечений. Необязательный параметр. Подробнее: SceneCheckOptions, ModelCheckOptions.
Возвращает объект { modelId: string, guid: string }, если пересечение существует. В противном случае возвращает undefined.

getIntersectionIDByFrustumNdcPt()

Метод возвращает список modelId и entityGuid объектов модели, пересекаемых усечённой пирамидой (Frustum).

  getIntersectionIDByFrustumNdcPt(ndcFrustumBox: THREE.Box3, unProjMatrix: THREE.Matrix4, isContainsOnly: boolean, options?: TOptions): { modelId: string; guid: string; }[];

где:
ndcFrustumBox – представление Frsutum в Normalized Device Coordinates (NDC пространство). Подробнее: THREE.Box3.

unProjMatrix – матрица проекции координат Normalized Device Coordinates (NDC пространство) в мировые координаты. Подробнее: THREE.Matrix4.

isContainsOnly – если true, то отбрасываются не полностью содержащиеся внутри пирамиды объекты. В противном случае в вывод включаются как содержащиеся внутри пирамиды объекты, так и касающиеся или пересекающиеся с ней.
Если при расчёте учитываются секущие плоскости, то isContainsOnly также указывает на то, что объект не должен быть обрезан секущими.

options – параметры проверки пересечений, необязательный параметр. Подробнее: SceneCheckOptions, ModelCheckOptions.

Возвращает список объектов { modelId: string, guid: string }, если пересечение существует. В противном случае возвращает пустой массив.

Пример расчёта пересечений с Frustum, образованным областью видимости камеры:

  const camera = viewer3D.navigation.getCamera();
  const unprojectionMatrix = new THREE.Matrix4();
  const ndcFrustumBox = new THREE.Box3();
  //матрица проекции из Normalized Device Coordinates (NDC пространство) в мировые координаты:
  unprojectionMatrix.multiplyMatrices(camera.matrixWorld, camera.projectionMatrixInverse);
  //левый нижний угол усечённой пирамиды в Normalized device coordinates (NDC пространство: x=-1, y=-1), ближняя плоскость камеры (nearPlane): z = -1:
  ndcFrustumBox.min = new THREE.Vector3(-1, -1, -1);
  //правый верхний угол усечённой пирамиды в Normalized device coordinates (NDC пространство: x=1, y=1), дальняя плоскость камеры (farPlane): z = 1:
  ndcFrustumBox.max = new THREE.Vector3(1, 1, 1);

  //Находим все объекты, содержащиеся внутри и/или пересекающие усечённую пирамиду, без учета секущих плоскостей.
  const intersections = intersectionChecker.getIntersectionIDByFrustumNdcPt(ndcFrustumBox, unprojectionMatrix, false, false);

Более сложный пример использования: BoxSelectionExtension.

ISceneIntersectionChecker

ISceneIntersectionChecker – интерфейс обработки пересечений объектов на отдельной сцене. Расширяет IIntersectionChecker.

  export interface ISceneIntersectionChecker extends IIntersectionChecker<SceneCheckOptions> {
    //Возвращает ограничивающий объём сцены. 
    get boundingBox(): THREE.Box3;
  }

SceneCheckOptions

SceneCheckOptions – опции проверки пересечений для ISceneIntersectionChecker.

  export interface SceneCheckOptions {
    //Определяет, учитываются ли секущие плоскости при расчёте пересечений на данной сцене.
    //Если учитываются, то пересечения с объектами за пределами секущего объёма отбрасываются.
    filterByClipping?: boolean;
  }

IModelIntersectionChecker

IModelIntersectionChecker – интерфейс обработки пересечений всех объектов модели. Расширяет IIntersectionChecker.

  export interface IModelIntersectionChecker extends IIntersectionChecker<ModelCheckOptions> {
    // Возвращает ограничивающий объём всей модели. 
    get boundingBox(): THREE.Box3;
    // Возвращает центр ограничивающего объёма модели. 
    get modelCenter(): THREE.Vector3;
  }

ModelCheckOptions

ModelCheckOptions – опции проверки пересечений для IModelIntersectionChecker.

  export interface ModelCheckOptions extends SceneCheckOptions {
    // Наименования сцен, которые участвуют в проверке пересечений.
    //  Если не задано, то пересечения проверяются для всех сцен. 
    sceneNames?: string[],
  }