前几天看到前辈操作一个三维软件,按住k键记录当前摄像头位置和视角,记录几个位置后,重复播放。然后要求我也应该实现这样的功能。
在前面的 博客 中,我已经实现了按既定路线漫游的功能,甚至视角也可以动态的调整了。但“并不自♂由”! 用户要可以自行设定浏览的位置和视角,并实现循环播放。
下面的思路是单位前辈提供的,相比之下简单到不能再简单了
思路
- 按键事件监听
这里是监听k键
按下的事件 - 记录
camera
的位置(position
)和视角(heading
,pitch
,roll
)
注意不能直接存下camera.position
,它是一个引用对象,必须保持当前值 - 循环调用
flyto
,依次遍历记录的位置
过渡动画使用cesium.easingfunction.linear_none
,这样在点切换时不会太突兀。
代码
setcustomroam() {
const points = []
const camera = viewer.camera
document.onkeydown = (event) => {
const e = event || window.event || arguments.callee.caller.arguments[0]
if (e && e.keycode === 75) {
points.push({
position: cesium.cartesian3.clone(camera.position),
heading: camera.heading,
pitch: camera.pitch,
roll: camera.roll,
duration: 10
})
}
if (e && e.keycode === 13) {
let index = 0
const fly = () => {
if (index >= points.length) {
index = 0
}
camera.flyto({
destination: points[index].position,
duration: points[index].duration,
orientation: {
heading: points[index].heading,
pitch: points[index].pitch,
roll: points[index].roll
},
complete: function () {
fly()
},
easingfunction: cesium.easingfunction.linear_none
})
index
}
fly()
}
}
}
操作
-
调整好视角后,按下“k”键,然后在下一个位置,重复此操作;
-
按下 “回车”键播放
效果图就不放了,csdn只支持5m大小,是在放不下了。