微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用三个js在将几何创建的Autodesk Viewer上将摄像机从A点移动到B点

如何解决使用三个js在将几何创建的Autodesk Viewer上将摄像机从A点移动到B点

我正在尝试将相机视图状态从A点移至B点。 为此,我在Autodesk Viewer中使用LineDashedMaterial创建了一条路径,并且能够创建并显示从点A到B的线。

这是代码

geometry = new THREE.Geometry();
geometry.vertices.push(getBoundingBox([2112]).center(),getBoundingBox([2109]).center());
material = new THREE.LineDashedMaterial({color: 0xFF0000,dashSize: 3,gapSize: 1,transparent: true,depthWrite: false,depthTest: true,});

checkLinedistance  = geometry.computeLinedistances();
geometry.linedistancesNeedUpdate = true;
nop_VIEWER.impl.matman().addMaterial('material',material,true);
line= new THREE.Line(geometry,material);   
nop_VIEWER.impl.sceneAfter.skipDepthTarget = true;
nop_VIEWER.impl.sceneAfter.skipIdTarget = true;                                       
nop_VIEWER.impl.sceneAfter.add(line);

这导致我:

this

现在,我遇到了要按照线/路径(A到B)的方向导航或移动相机的问题。 我现在使用的是示例模型,认为这将是一栋具有A和B房间的建筑物。

2。有什么方法可以从行通过的地方获取所有矢量,我基本上需要相机运动的位置,目标和upVector

3。有什么方法可以在伪造查看器api中使用dbid获取从A到B的所有矢量或点吗?

4。我尝试用forge viewer来建立Three.js,但是似乎很困难。

This实际上是我要实现的目标,但我需要在伪造查看器中显示视口,而不是移动的几何图形

解决方法

Forge Viewer的导航系统支持使用setRequestTransition方法对自定义相机状态进行平滑的线性插值,例如:

let newCameraPosition = new THREE.Vector3(1.0,2.0,3.0);
let newCameraTarget = new THREE.Vector3(4.0,5.0,6.0);
let fov = viewer.navigation.getHorizontalFov();
viewer.navigation.setRequestTransition(true,newCameraPosition,newCameraTarget,fov);

此过渡的默认持续时间为1秒,因此,如果您具有要使用相机跟踪的路径的顶点列表,则可以使用以下方法进行操作:

function followPath(viewer,vertices,delayMs) {
    let index = 0;
    let timer = setInterval(function () {
        if (index >= vertices.length) {
            clearInterval(timer);
            return;
        }
        let newPos = vertices[index];
        let newTarget = vertices[index + 1];
        if (!newTarget) {
            let oldPos = viewer.navigation.getPosition();
            let oldTarget = viewer.navigation.getTarget();
            newTarget = new THREE.Vector3(
                newPos.x + (oldTarget.x - oldPos.x),newPos.y + (oldTarget.y - oldPos.y),newPos.z + (oldTarget.z - oldPos.z)
            );
        }
        viewer.navigation.setRequestTransition(true,newPos,newTarget,viewer.navigation.getHorizontalFov());
        index++;
    },delayMs);
}

followPath(viewer,[
    new THREE.Vector3(10,20,30),new THREE.Vector3(40,50,60),new THREE.Vector3(70,80,90),new THREE.Vector3(0,10,0)
],2000);

如果您需要更大的灵活性(例如,在曲线周围进行插值,自定义缓入/缓出等),您仍然可以使用three.js或其他动画库,并且只需控制摄像机的位置并自己定位即可。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。