Threejs实现开门关门动画

简介: Threejs实现开门关门动画

1,介绍


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

主要实现功能:模拟开门关门动画。效果图如下:



2,动画主要说明


1,使用THREE.BoxGeometry创建几何体

2,引用纹理THREE.TextureLoader进行材质创建THREE.MeshPhongMaterial

3,创建物体THREE.Mesh并引用几何体和材质

4,设置物体绕Y轴旋转实现动画,这里需要注意的是物体旋转是以自身中心进行旋转的,所以这里需要把几何体THREE.BoxGeometry平移自身宽度的一半,这样物体中心就是THREE.BoxGeometry几何体的边缘


createDoor(100, 180, 2, 0, -700, 90, 700, "左门");
createDoor(100, 180, 2, 0, -500, 90, 700, "右门");
//创建门
function createDoor(width, height, depth, angle, x, y, z, name) {
  var loader = new THREE.TextureLoader();
  var doorgeometry = new THREE.BoxGeometry(width, height, depth);
  var doormaterial_left = new THREE.MeshPhongMaterial({
    map: loader.load("assets/textures/door_left.png")
  });
  doormaterial_left.opacity = 1.0;
  doormaterial_left.transparent = true;
  var doormaterial_right = new THREE.MeshPhongMaterial({
    map: loader.load("assets/textures/door_right.png")
  });
  doormaterial_right.opacity = 1.0;
  doormaterial_right.transparent = true;
  var doormaterialArr = [];
  if (name.indexOf("左门") > -1) {
        // 设置偏移
    doorgeometry.translate(50, 0, 0);
    doormaterialArr = [doormaterial_left, doormaterial_left, doormaterial_left,
      doormaterial_left, doormaterial_left, doormaterial_right
    ];
  } else {
        // 设置偏移
    doorgeometry.translate(-50, 0, 0);
    doormaterialArr = [doormaterial_right, doormaterial_right, doormaterial_right,
      doormaterial_right, doormaterial_right, doormaterial_left
    ];
  }
  var door = new THREE.Mesh(doorgeometry, doormaterialArr);
  door.position.set(x, y, z);
  door.rotation.y += angle * Math.PI; //-逆时针旋转,+顺时针
  door.name = name;
  scene.add(door);
}


使用Tween.js实现动画, 监听键盘“O”键实现开门效果,“C”键实现关门效果


document.onkeydown = function(event) {
  var l1 = scene.getObjectByName("左门");
  var r1 = scene.getObjectByName("右门");
  // 打开
  if (event.keyCode == 79) {
    new TWEEN.Tween({
        lv: 0,
        rv: 0,
      })
      .to({
        lv: -0.5 * Math.PI,
        rv: 0.5 * Math.PI,
      }, 1000)
      .easing(TWEEN.Easing.Bounce.Out)
      .onUpdate(function() {
        l1.rotation.y = this.lv;
        r1.rotation.y = this.rv;
      })
      .start();
  }
  // 关闭
  if (event.keyCode == 67) {
    new TWEEN.Tween({
        lv: -0.5 * Math.PI,
        rv: 0.5 * Math.PI,
      })
      .to({
        lv: 0,
        rv: 0,
      }, 1000)
      .easing(TWEEN.Easing.Bounce.Out)
      .onUpdate(function() {
        l1.rotation.y = this.lv;
        r1.rotation.y = this.rv;
      })
      .start();
  }
}


纹理素材如下

目录
相关文章
|
1月前
|
前端开发 程序员
给圆点添加呼吸动画,老板说我很有想法
【10月更文挑战第13天】给圆点添加呼吸动画,老板说我很有想法
给圆点添加呼吸动画,老板说我很有想法
|
2月前
宇宙星星转动特效带背景音乐引导页源码
宇宙星星转动特效带背景音乐引导页源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
57 7
宇宙星星转动特效带背景音乐引导页源码
|
5月前
小鸟飞行游戏【附源码】
小鸟飞行游戏【附源码】
54 2
小鸟飞行游戏【附源码】
|
5月前
|
图形学
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
188 2
|
11月前
|
前端开发
HTML+CSS制作七夕跳动的红心动画效果
HTML+CSS制作七夕跳动的红心动画效果
|
11月前
|
图形学
Unity小游戏——武士和怪物的碰撞检测
Unity小游戏——武士和怪物的碰撞检测
|
iOS开发
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
164 0
飞机大战-我方飞机移动基于事件
飞机大战-我方飞机移动基于事件。
64 0
|
Python
飞机大战-显示我方飞机
用Python进行编写飞机大战,显示我方飞机。
63 0
|
前端开发 JavaScript
2023跨年代码(烟花+背景音乐)
2023跨年代码(烟花+背景音乐)
333 0