Autodesk forge 获取相机位置并在Forge Viewer中恢复它,以便进行虚拟访问
我正在尝试将相机正确地设置为Autodesk forge 获取相机位置并在Forge Viewer中恢复它,以便进行虚拟访问,autodesk-forge,Autodesk Forge,我正在尝试将相机正确地设置为dbIddefines 为此,我在javascript控制台中运行此命令,然后按我所希望的方式放置视图: JSON.stringify(v.navigation.getCamera()) 但如果我进行测试并尝试直接加载结果,则会出现错误: v.navigation.setCamera(JSON.parse(“{\'metadata\”:{\'version\”:4.3,\'type\”:\'Object\,\'generator\”:\'Ob…) 错误: camera
dbId
defines
为此,我在javascript控制台中运行此命令,然后按我所希望的方式放置视图:
JSON.stringify(v.navigation.getCamera())代码>
但如果我进行测试并尝试直接加载结果,则会出现错误:
v.navigation.setCamera(JSON.parse(“{\'metadata\”:{\'version\”:4.3,\'type\”:\'Object\,\'generator\”:\'Ob…)
错误:
camera.up未定义
换句话说,如何手动保存相机位置并将其还原
编辑
我尝试使用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.
]);
但它在物体内部和外部放大了很多
编辑2
我已经找到了一个解决方案,使用了restoreState()
和getState()
,但它正在快速发展,而且这些方法似乎没有排队
我想虚拟参观我的大楼
编辑3
我尝试使用您的函数。因此我将其迁移到Javascript文件中使用:
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()
})
}
但当我尝试使用它时,它会让我放大,而不是在我的建筑前。我错过了一些东西,但我看不到什么
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}});
此博客可能会帮助您:
此博客可能会帮助您:
我看到了你的博客(非常有用),但我无法用纯javascript修改它。我会再试一次。例如,我不知道这是什么。runAnimation(true)
。我在Tween
文档和Forge viewer
中搜索过,但没有成功。像targettweenasing
这样的常量也是如此……我不知道它的用途。它是类的一个成员函数,上面的代码只是部分代码,你可以在那里找到完整的代码:我正在尽全力,但相机进入了对象内部我不知道如何链接不同的状态…我在我的原始帖子中有一些细节。你能看一下吗?给我一个方法来找到解决方案吗?我看到了你的博客(非常有用),但我无法用纯javascript修改它。我会再试一次。例如,我不知道这是什么。runAnimation(true)。我在Tween
文档和Forge viewer
中搜索过,但没有成功。像targettweenasing
这样的常量也是如此……我不知道它的用途。它是类的一个成员函数,上面的代码只是部分代码,你可以在那里找到完整的代码:我正在尽全力,但相机进入了对象内部我不知道如何把不同的州联系起来…我在我原来的帖子里有一些细节。你能看一下吗?给我一个解决办法吗?
/////////////////////////////////////////////////////////
// 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)
}