Aktualisieren von Kamera und Ziel basierend auf dbid eines ausgewählten Knotens. Der Code beginnt mit der MobileVR-Funktion. Ich aktualisiere Kamera und Ziel gemäß frag Mesh, das mit dbid abgerufen wurde, und gehe dann in den VR-Modus. Momentan habe ich einen Ereignis-Listener für GEOMETRY_LOADED_EVENT, OBJECT_TREE_CREATED_EVENT und EXTENSION_LOADED_EVENT. Momentan funktioniert es mit einem Timeout setTimeout (() => {onSpaceObjectTreeCreated();}, 3000); siehe Bild 1, aber nicht ohne das Timeout-Bild 2. Gibt es ein anderes Ereignis, das ich warten sollte, bevor ich den Code ausführe oder die Kamera aktualisiere?Vor dem Aktualisieren der Kamera zu erfassende Ereignisse
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();
}
hilft Obwohl loaded mehrere Erweiterung gibt es scheint die Erweiterung, die den Callback auslöst, der richtige zu sein, das bekomme ich in der Konsole. Ereignis: extensionLoaded Ev: Autodesk.Viewing.WebVR. Ich habe auch den Code geändert, sodass die Ereignisse nach viewer.initialize() und vor loadDocument angeschlossen sind, aber das behebt das Problem nicht. Gibt es noch etwas, das der Grund sein könnte? Oder etwas anderes habe ich falsch in meinem Code? –