获取相机位置并将其还原到Forge Viewer中以进行虚拟访问 [英] Get the Camera position and restore it in Forge Viewer for a virtual visit

查看:81
本文介绍了获取相机位置并将其还原到Forge Viewer中以进行虚拟访问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将相机正确放置在 dbId 定义上.

I'm trying to put the camera correctly on dbId defines.

为此,在放置了所需的视图后,我在javascript控制台中运行了此命令:

For this, I run in the javascript console this command after put the view like I want :

JSON.stringify(v.navigation.getCamera());

但是,如果我进行测试并尝试直接加载结果,则会出现错误:

But if I make a test and try to load the result directly, I have an error :

v.navigation.setCamera(JSON.parse("{\"元数据\:{\"版本\:4.3,\"类型\:\"对象\,\"生成器\":\"Ob ...."))

错误: camera.up未定义

换句话说,我该如何手动保存相机位置并恢复它?

In other words, how can I save the camera position manually and restore it?

我尝试使用 setViewFromArray 来完成此操作:

I try to do this with setViewFromArray :

<代码>viewerApp.myCurrentViewer.setViewFromArray([454.76857106060265,96.01886808305997,212.6431659314611,287.11932000223214,167.19053946002487,97.17925996096139,-0.49285695792051964,0.20923119682030047,0.8445793777416518,2.7467811158798283,45.00000125223908,1,1个]);

但是它会放大到物体的远处,甚至超出……

But it zoom to much IN the object and beyond...

我找到了一个带有 restoreState() getState()的解决方案,但是它发展很快,而且这些方法似乎没有排队.

I've found a solution with restoreState() and getState() but it moving to fast and these methods do not seem to be queued.

我想对我的建筑物进行虚拟访问...

I would like to make a virtual visit of my building...

我已经尝试使用您的功能.因此,我将其迁移以在Javascript文件中使用它:

I've try to use your function. So I've migrate it to use it in a Javascript file :

    var animate = false;

    function tweenCameraTo(viewer, state) {

        var targetTweenEasing = {
            id: TWEEN.Easing.Linear.None,
            name: 'Linear' 
          };
        var posTweenEasing = {
            id: TWEEN.Easing.Linear.None,
            name: 'Linear'
          };
        var  upTweenEasing =  {
            id: TWEEN.Easing.Linear.None,
            name: 'Linear'
        };

        const targetEnd = new THREE.Vector3(
          state.viewport.target[0],
          state.viewport.target[1],
          state.viewport.target[2])

        const posEnd = new THREE.Vector3(
          state.viewport.eye[0],
          state.viewport.eye[1],
          state.viewport.eye[2])

        const upEnd = new THREE.Vector3(
          state.viewport.up[0],
          state.viewport.up[1],
          state.viewport.up[2])

        const nav = viewer.navigation

        const target = new THREE.Vector3().copy(
          nav.getTarget())

        const pos = new THREE.Vector3().copy(
          nav.getPosition())

        const up = new THREE.Vector3().copy(
          nav.getCameraUpVector())

        //nav.setView (posEnd, targetEnd);

        //nav.setCameraUpVector(upEnd);


        var targetTween = createTween({
          easing: targetTweenEasing.id,
          onUpdate: (v) => {
            nav.setTarget(v)
          },
          duration: 25000, //targetTweenDuration,
          object: target,
          to: targetEnd
        }).then((r) => {console.log("targetTween");});

        var posTween = createTween({
          easing: posTweenEasing.id,
          onUpdate: (v) => {
            nav.setPosition(v)
          },
          duration: 25000,//posTweenDuration,
          object: pos,
          to: posEnd
        }).then((r) => {console.log("posTween");});

        var upTween = createTween({
          easing: upTweenEasing.id,
          onUpdate: (v) => {
            nav.setCameraUpVector(v)
          },
          duration: 25000, //upTweenDuration,
          object: up,
          to: upEnd
        }).then((r) => {console.log("upTween");});

        Promise.all([
          targetTween,
          posTween,
          upTween]).then(() => {
          console.log("Fin animation");
            animate = false;
        })

        runAnimation(true);
  }

 // var animId = null;

  var runAnimation = function runAnimation (start) {        
        if(start || animate){
          requestAnimationFrame(runAnimation);
          TWEEN.update()
        }
  }


  function createTween (params) {

    return new Promise((resolve) => {
        console.log("params.to", params.to);
      new TWEEN.Tween(params.object)
        .to(params.to, params.duration)
        .onComplete(() => {resolve();})
        .onUpdate(params.onUpdate)
        .easing(params.easing)
        .start()
    })
  }

但是,当我尝试使用它时,它会以较大的倍率驱动我,而不是例如在我的建筑物前.我错过了一些东西,但看不到.

But When I try to use it, it drive me in a big zoom, not in front of my building for example. I've miss something but I do not see what.

tweenCameraTo(viewer, {"viewport":{"name":"","eye":[888.5217895507812,-257.4985656738281,576.9136962890625],"target":[262.7552795410156,81.58747863769531,73.64283752441406],"up":[0,0,1],"worldUpVector":[0,0,1],"pivotPoint":[262.7552795410156,81.58747863769531,73.64283752441406],"distanceToOrbit":871.6906720725796,"aspectRatio":2.7507163323782233,"projection":"perspective","isOrthographic":false,"fieldOfView":45.00000125223908}}); 

tweenCameraTo(viewer, {"viewport":{"name":"","eye":[243.36675374870242,423.8180714045694,167.78380714288494],"target":[303.9841786300087,-347.23884414908446,-234.26269334678466],"up":[0.03614822612815841,-0.4598073869962326,0.8872826340076113],"worldUpVector":[0,0,1],"pivotPoint":[262.7552795410156,81.58747863769531,73.64283752441406],"distanceToOrbit":347.4897746012467,"aspectRatio":2.7507163323782233,"projection":"perspective","isOrthographic":false,"fieldOfView":45.00000125223908}}); 

推荐答案

此博客可能可以为您提供帮助:

This blog can probably help you: Smooth Camera Transitions in the Forge Viewer

/////////////////////////////////////////////////////////
// Smooth camera transition from current state to
// target state using Tween.js
//
/////////////////////////////////////////////////////////
tweenCameraTo (state) {

    // tween parameters, specific to my app but easy
    // to adapt ...
    const {

      targetTweenDuration,
      posTweenDuration,
      upTweenDuration,

      targetTweenEasing,
      posTweenEasing,
      upTweenEasing

    } = this.react.getState()

    const targetEnd = new THREE.Vector3(
      state.viewport.target[0],
      state.viewport.target[1],
      state.viewport.target[2])

    const posEnd = new THREE.Vector3(
      state.viewport.eye[0],
      state.viewport.eye[1],
      state.viewport.eye[2])

    const upEnd = new THREE.Vector3(
      state.viewport.up[0],
      state.viewport.up[1],
      state.viewport.up[2])

    const nav = this.navigation

    const target = new THREE.Vector3().copy(
      nav.getTarget())

    const pos = new THREE.Vector3().copy(
      nav.getPosition())

    const up = new THREE.Vector3().copy(
      nav.getCameraUpVector())


    const targetTween = this.createTween({
      easing: targetTweenEasing.id,
      onUpdate: (v) => {
        nav.setTarget(v)
      },
      duration: targetTweenDuration,
      object: target,
      to: targetEnd
    })

    const posTween = this.createTween({
      easing: posTweenEasing.id,
      onUpdate: (v) => {
        nav.setPosition(v)
      },
      duration: posTweenDuration,
      object: pos,
      to: posEnd
    })

    const upTween = this.createTween({
      easing: upTweenEasing.id,
      onUpdate: (v) => {
        nav.setCameraUpVector(v)
      },
      duration: upTweenDuration,
      object: up,
      to: upEnd
    })

    Promise.all([
      targetTween,
      posTween,
      upTween]).then(() => {

      this.animate = false
    })

    this.runAnimation(true)
  }

这篇关于获取相机位置并将其还原到Forge Viewer中以进行虚拟访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆