【问题标题】:resize an object in three.js / Autodesk 3D Viewer (Autodesk Forge Viewer)在three.js / Autodesk 3D Viewer(Autodesk Forge Viewer)中调整对象的大小
【发布时间】:2020-01-16 23:36:27
【问题描述】:

如何调整对象的大小、移动或平移对象?

这个变化让我不得不向上或向下移动窗帘

我需要调整大小定位动画对象或在一个地方(没有区别)

viewer3D:LMV v3.3.6

尝试 1:

oViewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, onSelectedCallback);
function onSelectedCallback(event) {
    var fragId = oViewer.getSelection()[0];
    if (typeof fragId == 'undefined') {return; }
    var fragIdsArray = (Array.isArray(fragId) ? fragId : [fragId]);

    fragIdsArray.forEach(function (subFragId) {

        var mesh = oViewer.impl.getRenderProxy(oViewer, subFragId);
        var mtx_for_method1 = mesh.matrixWorld.elements;
        mtx_for_method1[12] += 10;
        mtx_for_method1[13] += 20;
        mtx_for_method1[14] += 30;

    });

    oViewer.impl.invalidate(true);
}

尝试 2:

oViewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, onSelectedCallback);
function onSelectedCallback(event) {
    var fragId = oViewer.getSelection()[0];
    if (typeof fragId == 'undefined') {return; }
    var fragIdsArray = (Array.isArray(fragId) ? fragId : [fragId]);
    fragIdsArray.forEach(function (subFragId) {
        var mesh = oViewer.impl.getRenderProxy(oViewer, subFragId);
            var transMat = new THREE.Matrix4();
            var m1 = new THREE.Matrix4();
            var m2 = new THREE.Matrix4();
            var m3 = new THREE.Matrix4();
            var alpha = 0;
            var beta = Math.PI;
            var gamma = Math.PI / 2;
            m1.makeRotationX(alpha);
            m2.makeRotationY(beta);
            m3.makeRotationZ(gamma);
            transMat.multiplyMatrices(m1, m2);
            transMat.multiply(m3);
            var mtx_for_method2 = mesh.matrixWorld;
            mtx_for_method2.multiply(transMat);
            mtx_for_method2.matrixWorldNeedsUpdate = True;
    });

    oViewer.impl.invalidate(true);
}

这可能吗?

【问题讨论】:

    标签: canvas three.js autodesk-forge autodesk-viewer autodesk


    【解决方案1】:

    您当然可以,但可以看到您的代码存在一些问题,它们是:

    • 使用instanceTree.enumNodeFragments 获取片段,viewer.getSelection 只会获取当前选定组件的dbids

    编辑:

    • 使用片段代理而不是网状代理...
    const model = NOP_VIEWER.model;
    model.getData().instanceTree.enumNodeFragments(
          dbid, fragId => {
            const fragProxy = NOP_VIEWER.impl.getFragmentProxy(model, fragId);
            fragProxy.scale = new THREE.Vector3(1.1,1.1,1.1);
            fragProxy.updateAnimTransform()
        });
    NOP_VIEWER.impl.invalidate(true)
    

    【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2020-03-08
    • 2021-01-16
    • 2020-05-06
    • 2021-05-13
    • 2021-11-26
    • 2018-12-11
    • 2017-06-28
    • 2020-05-15
    相关资源
    最近更新 更多