События для прослушивания перед обновлением камеры
Обновление камеры и цели на основе dbid выбранного узла. Код начинается с функции MobileVR. Я обновляю камеру и цель в соответствии с фрагментом сетки, полученным с помощью dbid, а затем перехожу в режим VR В настоящее время у меня есть прослушиватели событий для GEOMETRY_LOADED_EVENT, OBJECT_TREE_CREATED_EVENT и EXTENSION_LOADED_EVENT. В настоящее время он работает с использованием тайм-аута setTimeout(() => { onSpaceObjectTreeCreated(); }, 3000); см. изображение 1, но не без изображения тайм-аута 2. Есть ли какое-то другое событие, которое мне следует подождать перед запуском кода или обновлением камеры?
function onSpaceObjectTreeCreated() {
const nav = viewer.navigation;
const cam = nav.getCamera();
const it = viewer.model.getData().instanceTree;
let xPos, yPos, zPos;
it.enumNodeFragments(nodeId, (frag) => {
const mesh = viewer.impl.getRenderProxy(viewer.model, frag);
xPos = mesh.matrixWorld.elements[12];
yPos = mesh.matrixWorld.elements[13];
zPos = mesh.matrixWorld.elements[14];
console.log('x: ' + xPos + ' y: ' + yPos + ' z: ' + zPos);
}, false);
zPos = -41000;
cam.position.set(xPos, yPos, zPos);
cam.target.set(xPos, yPos + 10000, zPos);
}
function onViewerGeometryLoaded() {
const nav = viewer.navigation;
const cam = nav.getCamera();
if (nodeId == -1) {
viewer.setGroundShadow(false);
let xValue = viewer.getCamera().position.x;
let yValue = viewer.getCamera().position.y;
let zValue = viewer.getCamera().position.z;
let bbz = viewer.model.getData().bbox.min.z;
let zValue2 = zValue - bbz;
zValue = zValue * 0.3;
yValue = (zValue2 * 0.7071) * -1;
let nav = viewer.navigation;
let cam = viewer.getCamera();
cam.position.set(xValue, yValue, zValue);
} else {
setTimeout(() => {
onSpaceObjectTreeCreated();
}, 3000);
}
viewer.impl.sceneUpdated();
viewer.navigation.updateCamera();
document.getElementById("toolbar-vrTool").click();
};
function afterViewerEvents() {
var events = [
Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT,
Autodesk.Viewing.EXTENSION_LOADED_EVENT
];
async.each(events,
function (event, callback) {
var handler = function (ev) {
viewer.removeEventListener(
event, handler);
console.log('Event: ' + event);
console.log('Ev: ' + ev.extensionId);
callback();
};
viewer.addEventListener(
event, handler);
},
function (err) {
onViewerGeometryLoaded();
});
}
function mobileVR(arkUrn: string, lviUrn: string, zOffset: number, spaceId: number) {
let element = document.getElementById("mobileViewer");
viewer = new Autodesk.Viewing.Private.GuiViewer3D(element);
let options = {
'env': 'AutodeskProduction',
'getAccessToken': getToken,
'refreshToken': getToken
};
av.Initializer(
options,
() => {
viewer.initialize();
loadDocument(arkUrn, zOffset);
if (lviUrn != "") {
loadDocument(lviUrn, zOffset);
}
viewer.loadExtension('Autodesk.Viewing.WebVR');
}
);
nodeId = spaceId;
afterViewerEvents();
}
1 ответ
Попробуйте подключить события после инициализации средства просмотра и перед загрузкой документа:
viewer.initialize();
afterViewerEvents();
loadDocument(arkUrn, zOffset);
Также я не понимаю, почему вы используете Autodesk.Viewing.EXTENSION_LOADED_EVENT, несколько расширений автоматически загружаются зрителем при запуске или загрузке модели, это событие будет вызвано несколько раз. Если вы ищете конкретное загружаемое расширение, вам нужно проверить extensionI d и удалить обработчик, только если это расширение, которое вы ждете...
надеюсь, это поможет