Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角

简介: Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角

1,介绍


该示例使用的是 r95版本Three.js库。

主要实现功能:实现相机视角切换,平滑过渡。效果图如下:




2,主要说明


相机视角切换主要使用tween.js库实现,这个库可以很容易实现两个值之间进行过度,中间值都会自动计算出来,例如下方函数创建了TWEEN.Tween对象,这个对象会在1000毫秒内从当前坐标变换到目标坐标,变化方式可以是线性,指数性或者其他方式,可参考Tween.js / graphs   可以通过easing()方法配置变化效果。


// current1 相机当前的位置
// target1 相机的目标位置
// current2 当前的controls的target
// target2 新的controls的target
function animateCamera(current1, target1, current2, target2) {
  var tween = new TWEEN.Tween({
    x1: current1.x, // 相机当前位置x
    y1: current1.y, // 相机当前位置y
    z1: current1.z, // 相机当前位置z
    x2: current2.x, // 控制当前的中心点x
    y2: current2.y, // 控制当前的中心点y
    z2: current2.z // 控制当前的中心点z
  });
  tween.to({
    x1: target1.x, // 新的相机位置x
    y1: target1.y, // 新的相机位置y
    z1: target1.z, // 新的相机位置z
    x2: target2.x, // 新的控制中心点位置x
    y2: target2.y, // 新的控制中心点位置x
    z2: target2.z // 新的控制中心点位置x
  }, 1000);
  tween.onUpdate(function() {
    camera.position.x = this.x1;
    camera.position.y = this.y1;
    camera.position.z = this.z1;
    orbit.target.x = this.x2;
    orbit.target.y = this.y2;
    orbit.target.z = this.z2;
    orbit.update();
  })
  tween.easing(TWEEN.Easing.Cubic.InOut);
  tween.start();
}

点击物体调用animateCamera函数实现切换视角效果


function onDocumentMouseDown(event) {
  // 点击屏幕创建一个向量
  var vector = new THREE.Vector3((event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window
    .innerHeight) * 2 + 1, 0.5);
  vector = vector.unproject(camera); // 将屏幕的坐标转换成三维场景中的坐标
  var raycaster = new THREE.Raycaster(camera.position, vector.sub(camera.position).normalize());
  var intersects = raycaster.intersectObjects(scene.children, true);
  if (intersects.length > 0) {    
    // 随机坐标
    var x = Math.round((Math.random() * 100));
    var y = Math.round((Math.random() * 100));
    var z = 50;
    var x2 = Math.round((Math.random() * 50));
    var y2 = Math.round((Math.random() * 50));
    var z2 = 5;
    var pos = new THREE.Vector3(x, y, z);
    var pos2 = new THREE.Vector3(x2, y2, z2);
    intersects[0].object.material.color.set("#00aa00");
    animateCamera(camera.position, pos, orbit.target, pos2);
  }
}


3,源码和模型


需要学习案例、模型或者其他源码,请进入博客首页查看其他文章或者留言

目录
相关文章
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
2248 0
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
|
JavaScript
Threejs实现标签,自定义样式显示标签
Threejs实现标签,自定义样式显示标签
2295 0
Threejs实现标签,自定义样式显示标签
Threejs实现模拟管道液体流动
Threejs实现模拟管道液体流动
4084 0
Threejs实现模拟管道液体流动
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
4322 0
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现下雨,下雪,阴天,晴天,火焰
3114 0
Threejs实现下雨,下雪,阴天,晴天,火焰
Threejs实现天空盒,全景场景,地面草地
Threejs实现天空盒,全景场景,地面草地
2201 0
Threejs实现天空盒,全景场景,地面草地
|
数据可视化 定位技术
three.js实现烟雾缭绕效果
前言 大家好!我是Fly哥,最近接广告的接的有点多, 感谢大家还是一如既往的支持我!respect, 前几天我在朋友圈分享了一个烟雾缭绕的效果。很多小伙伴都表示非常感兴趣,有的同学说用到了噪声, 有的同学说用到了着色器,还有更过分说用到了ps, 胖虎竟然无语凝噎。其实都是就是简单的贴图。配合一点想象力。我们先看下效果: 然后我就发了一条朋友圈,问这个像什么?? 有的说 云层, 有的说云墨,有的说雾霭, 其实都不是, 我想做的是烟雾。好的话不不多说!, 本篇文章阅读大概5分钟。不耽误大家太多时间,主要是介绍思路, 说太多也没啥意义。如果你对three.js 还没有一点了解都没有,
three.js实现烟雾缭绕效果
|
定位技术
Threejs实现绘制地球,地理位置标注、经纬度转换世界坐标threejs坐标
Threejs实现绘制地球,地理位置标注、经纬度转换世界坐标threejs坐标
2723 0
Threejs实现绘制地球,地理位置标注、经纬度转换世界坐标threejs坐标
|
API
【threejs教程】场景视角切换的神器:轨道控制器
【8月更文挑战第5天】threejs教程:场景视角切换的神器,轨道控制器
1330 1
【threejs教程】场景视角切换的神器:轨道控制器
Threejs实现动画
这篇文章讲解了如何使用Three.js实现动画效果,并介绍了如何控制动画的时间轴。
484 3
Threejs实现动画