forge Viewer - Как мы можем добавить CAMERA_CHANGE_EVENT для разметки SVG? - PullRequest
0 голосов
/ 28 февраля 2020

Как мы можем добавить слушателя CMERA_CHANGE_EVENT для разметки, нарисованной на зрителе? Если мы создадим метку для dbid, мы можем сохранить ее координаты и применить worldToClient к координатам, чтобы получить новые координаты. Но как это работает для разметки SVG?

В моем приложении пользователь может связать информацию RFI двумя способами. 1. Просто щелкнув модель obkject / dbid, я позволю пользователю добавить некоторую текстовую информацию через текстовое поле и прикрепить ее в виде метки с этим выбранным объектом / dbid. это работает, когда метка перемещается вместе с выбранным объектом во время события поворота камеры.

Технически, чтобы сделать это, я использую функцию getObjPosition, чтобы получить координаты dbid и сохранить его в элементе управления меткой, и я извлекаю эти значения во время событие смены камеры и обновления текущих клиентских координат с помощью функции ниже getClientCoordinates

function getObjPosition(dbId) {
    const model = viewer.model;
    const instanceTree = model.getData().instanceTree;
    const fragList = model.getFragmentList();

    let bounds = new THREE.Box3();

    instanceTree.enumNodeFragments( dbId, ( fragId ) => {
        let box = new THREE.Box3();
        fragList.getWorldBounds( fragId, box );
        bounds.union( box );
    }, true );

    const position = bounds.center();
    return position;
}

function getClientCoordinates(positionCoordinates){
    var screenpoint = viewer.worldToClient(
                    new THREE.Vector3(positionCoordinates.x,
                                      positionCoordinates.y,
                                      positionCoordinates.z,));
    return screenpoint
}
В этом сценарии я даю пользователю рисовать облачную разметку и связываю метку для вводимой пользователем пользовательской информации при выборе разметки. Поэтому, чтобы получить координаты, я использую следующий код:
var pos = markup.markups [0] .getClientPosition (); и пометьте метку этой созданной разметкой. Оно работает. Для события смены камеры сама разметка теряет свою позицию, поэтому не знаю, как я буду прикреплять ее к модели и применять координаты для метки. Еще одна тревожная часть: как я должен получить все нарисованные наценки на модели во время события смены камеры

Надеюсь, мой вопрос теперь ясен.

оригинальная разметка enter image description here

разметка после смены камеры вверх

enter image description here

1 Ответ

1 голос
/ 02 марта 2020

CAMERA_CHANGE_EVENT работает для всей сцены и всякий раз, когда происходит навигация, поэтому нет способа привязать это к какому-либо конкретному c объекту, и нет смысла это делать.

Если вы пытаетесь чтобы переместить разметки SVG в их новые соответствующие координаты после навигации, просто сохраните их исходные мировые позиции (используя clientToWorld) перед навигацией, а затем используйте worldToClient, чтобы получить их новые координаты после навигации.

...