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();
  }
}


纹理素材如下

目录
相关文章
|
12月前
|
Java Python
星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来
星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来
|
1月前
宇宙星星转动特效带背景音乐引导页源码
宇宙星星转动特效带背景音乐引导页源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
38 7
宇宙星星转动特效带背景音乐引导页源码
|
4月前
|
图形学
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
【unity小技巧】受伤屏幕闪红、死亡动画、死亡黑屏效果
99 2
|
10月前
|
前端开发
HTML+CSS制作七夕跳动的红心动画效果
HTML+CSS制作七夕跳动的红心动画效果
|
10月前
|
图形学
Unity小游戏——武士和怪物的碰撞检测
Unity小游戏——武士和怪物的碰撞检测
飞机大战-我方飞机移动基于事件
飞机大战-我方飞机移动基于事件。
58 0
|
前端开发 JavaScript
2023跨年代码(烟花+背景音乐)
2023跨年代码(烟花+背景音乐)
313 0
|
JavaScript 前端开发
最简单的利用原生js模拟电视机屏保效果
最简单的利用原生js模拟电视机屏保效果 小的时候记得家里刚用彩色电视机时,看电视还要用天线,当天线信号不好时,电视屏幕就会进入到屏保状态,有一串文字在屏幕内“撞来撞去”。下面我们来讲一下如何实现下图这个效果: 在这里插入图片描述 HTML代码: 调速:<input type="number" name="" id="num"> <div id="box"></div> 1 2 CSS代码: * { margin: 0; padding: 0; } #box { width:
最简单的利用原生js模拟电视机屏保效果
逐帧动画案例(奔跑的小人)
逐帧动画案例(奔跑的小人)
229 0
逐帧动画案例(奔跑的小人)
|
前端开发
CSS动画——行走的小人
CSS动画——行走的小人
254 0
CSS动画——行走的小人