Threejs实现WebVR全景小行星入场动画/鱼眼效果/球形展开效果
1,功能介绍
使用 Threejs实现WebVR全景,VR全景小行星入场动画、鱼眼效果、由远到近效果、球形展开动画效果。如下效果图:

这种效果其实很简单,通过修改 像机视锥体垂直视野角度fov,和相机的坐标位置实现动画效果,鼠标拖动查看使用轨道控制器OrbitControls.js
2,功能实现
初始化场景和设置相机角度、位置。效果和代码如下:

var camera = new THREE.PerspectiveCamera(170, window.innerWidth / window.innerHeight, 0.1, 10000);
camera.position.set(0, 1200, 0);
// 初始化球体
var geometry = new THREE.SphereGeometry(1200, 1200, 1200);
geometry.scale(-1, 1, 1);
// 创建材质并设置全景图
var material = new THREE.MeshBasicMaterial({
map: new THREE.TextureLoader().load('assets/bgImage/dibaizhumeilahuta.jpg');
});
// 全景图贴在球体上
var mesh = new THREE.Mesh(geometry, material);
// 添加到场景
scene.add(mesh);
加载旋转动画从远到进,动画使用Tweenjs实现,效果和代码如下:

let tween = new TWEEN.Tween({
fov: 170,
ars: 40,
rot: 0,
})
.to({
fov: 100,
ars: 0,
rot: Math.PI * 1.01,
}, 2300)
.easing(TWEEN.Easing.Quadratic.Out)
.onComplete(function() {
TWEEN.remove(tween);
setTimeout(function(){
// 旋转入场动画
enterScene()
}, 1000)
})
.onUpdate(function(t) {
// 视角由大到小
camera.fov = t.fov;
camera.updateProjectionMatrix()
// 旋转
mesh.rotation.y = t.rot;
})
.start();
入场动画也是使用Tweenjs实现,效果和代码如下:

function enterScene() {
// 获取相机坐标
let cameraLook = new THREE.Vector3();
camera.getWorldDirection(cameraLook);
let tween = new TWEEN.Tween({
fov: camera.fov,
z: 0,
cy: camera.position.y,
})
.to({
fov: 70,
z: -1200,
cy: 0,
}, 2000)
.easing(TWEEN.Easing.Linear.None)
.onComplete(function() {
TWEEN.remove(tween);
})
.onUpdate(function(t) {
// 更新相机位置和视角大小
camera.position.y = t.cy;
camera.fov = t.fov;
camera.updateProjectionMatrix();
// 旋转效果
mesh.rotation.y += 0.01;
// 更新看向位置
const target = new THREE.Vector3(0, 0, t.z);
camera.lookAt(target);
})
.start();
}
更多在线案例:左本的博客