更新相机前要收听的事件
Posted
技术标签:
【中文标题】更新相机前要收听的事件【英文标题】:Events to listen to before updating camera 【发布时间】:2018-06-02 18:28:18 【问题描述】:根据选定节点的 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,查看器会在启动或模型加载时自动加载几个扩展,此事件将被多次触发。如果您正在寻找正在加载的特定扩展,则需要检查 extensionId 并仅在这是您等待的扩展时才删除处理程序...
希望对你有帮助
【讨论】:
即使加载了几个扩展,触发回调的扩展似乎是正确的,这就是我在控制台中得到的。事件:extensionLoaded Ev:Autodesk.Viewing.WebVR。我还更改了代码,以便在 viewer.initialize() 之后和 loadDocument 之前连接事件,但这并不能解决问题。还有什么可能是原因吗?还是我的代码中有其他错误?以上是关于更新相机前要收听的事件的主要内容,如果未能解决你的问题,请参考以下文章