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


纹理素材如下

目录
相关文章
|
5月前
|
前端开发
HTML+CSS制作七夕跳动的红心动画效果
HTML+CSS制作七夕跳动的红心动画效果
|
6月前
|
iOS开发
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
水波涟漪,使用SwiftUI做一个仿iPhone隔空投送动画~
68 0
|
前端开发 JavaScript
2023跨年代码(烟花+自定义文字+背景音乐+雪花+倒计时)
2023跨年代码(烟花+自定义文字+背景音乐+雪花+倒计时)
1719 7
2023跨年代码(烟花+自定义文字+背景音乐+雪花+倒计时)
|
JSON Android开发 数据格式
原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧
原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧
原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧
实现场景切换的时候淡入淡出的效果(Unity3D)
在游戏中不可避免的要进行场景切换,如果切换的场景要加载的资源太多太大,那么就要耗时很长时间,这对于用户的体验来说很不舒服,也就是常说的游戏卡了。怎么解决这种尴尬呢。比较推荐的就是异步加载场景,然后中间加一个过渡场景,过渡场景做的美观一些,然后加一个进度条,看起来就不会那么尴尬了。然后在场景过渡的时候,加一个淡入淡出的效果,就很nice了今天就实现一个场景切换的时候淡入淡出的效果。剩下的场景异步加载还有中间过渡场景有时间再写。
|
Android开发
简单实现安卓圆形按钮及(圆形)波纹效果
简单实现安卓圆形按钮及(圆形)波纹效果
185 0
简单实现安卓圆形按钮及(圆形)波纹效果
|
存储 图形学
动画系统中的基础动画
动画系统中的基础动画
131 0
动画系统中的基础动画
|
物联网 API
ThingJS:仅需不到5行代码,实现炫酷3D动画
在物联网领域,Thing都有哪些动效呢?
|
C# 内存技术
好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效按钮
原文:好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效按钮 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/46457923 我们先来看看Quartz MS字体动态显示系统时间的效果,难度相较于上一篇也要简单许多。
1853 0
kanzi如何录制动画制作跳动的小球
实现效果如下   1)导入素材,建动画。 在library中,右键Animations > Animation Clips > Animation Clip,打开Animation Clip Editor。
1348 0