第二十七章、燃烧吧!Three.js 小宇宙!(伍)

前言

嗨大家好,今天是铁人赛的第 27 天,也是本系列 Three.js 最後一篇罗,照惯例,最後一天我们要来利用前面所学技术制作小功能。那麽废话不多说,就让我们开始吧!

几何多面体旋转

这边有个小提醒,若你是使用 codepen 即时渲染画面等线上编辑器,记得把 three.js 引入,然後在 Behavior 内关闭即时渲染程序画面的功能,以免爆掉喔~

  • 首先,先给一个初始化渲染环境
    function init() {}
    
  • 接着将 场景、相机类型设定好
    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
    
  • 指定 WebGL 的渲染器方式,将背景颜色设定为透明色(预设值为 false 黑色)。并且设定 渲染器环境大小,这边我们让整张画布大小与 viewport 比利一模一样,然後将整包 renderer 节点插入 body。
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight);
    document.body.appendChild( renderer.domElement );
    
  • 设定物体形状与贴图,由於我们要让好几个多面体以不同的角度旋转,因此我们用一个阵列将这些形状组装起来。
    var shape = [];
    
  • 直接使用 Three.js 内建的 Constructor 绘制多面(20面)体,半径为 2.5 面数为 0 (也就是 20 面)。并且贴上材质,我们用 MeshNormalMaterial Constructor 将材质用法向量投射RGB 颜色的材质。
    geometry = new THREE.IcosahedronGeometry(2.5,0);
    material = new THREE.MeshNormalMaterial();
    shape[0] = new THREE.Mesh( geometry, material );
    shape[1] = new THREE.Mesh( geometry, material );
    shape[2] = new THREE.Mesh( geometry, material );
    
  • 接着我们将绘制好的物件定位,目前先让多个多面体重叠再一起,所以把定位都设在同一点就好
    shape[0].position.set(0,5,0);
    shape[1].position.set(0,5,0);
    shape[2].position.set(0,5,0);
    
  • 把绘制好的物件渲染进场景内
    scene.add(shape[0],shape[1],shape[2]);
    
  • 设定灯光,这边我们使用的是点光源,设定好光源位置後将其渲染到场景内
    var light = new THREE.PointLight(0xfca4c5);
    light.position.set(250,0,0);
    scene.add(light);
    
  • 上述基础设定完後调整一下相机定位
    camera.position.set(3,4,10);
    
  • render 上面所有的设定到场景与相机内,我们就会得到一个多面体物件。
    renderer.render(scene, camera);
    
  • 到了重头戏,在 render 内设定动画。我们利用浏览器自动渲染的 requestAnimationFrame 运作动画,接着针对我们上面绘制的三个多面体物件去透过 旋转矩阵 来调整旋转角度。
    function render() {
      requestAnimationFrame( render );
    
      shape[0].rotation.x += 0.035;
      shape[0].rotation.y -= 0.005;
      shape[1].rotation.y += 0.015;
      shape[1].rotation.z -= 0.005;
      shape[2].rotation.z -= 0.025;
      shape[2].rotation.x += 0.005;
      renderer.render(scene, camera);
    }
    render();
    
  • 最後最後,我们就可以呼叫 init 的 function 啦!!
    init();
    

完成

再次赐予我力量吧 雅典娜!天马回旋碎击拳!


呼~ Three.js 系列就到这边结束啦~
其实如果能把 Three.js 提供的一些内建语法熟悉熟悉,就会发现跟原生 Canvas 等写法相比真的轻松非~常多!

因此如果有兴趣的话都可以上官网看看呦!

当然一样的如果有其他做出来超厉害动画,也都欢迎跟我分享交流讨论喔!

那麽我们明天见!ㄅㄅ!


<<:  [Day30] 结语

>>:  Android x Kotlin : 展开式列表ExpandableListView用法

D19 - 「呐,你想要成为什麽颜色?」:打造一个调色盘吧!

接下来我们要利用「 PWM」与「RGB LED」设计调色盘功能。 首先来认识一下新朋友 - 「RGB...

[13th][Day14] map

移除元素 如果要从切片中移除元素,下面是一个比较简单粗暴的写法 slice := []int{1, ...

【资料结构】前後序求值

前序求值 程序说明 相关函式 get_value():计算并回报结果 说明: 将引入的两个运算元与运...

如何免费写出好的 App description

关於如何写 App 的 description,我目前有两个小技巧可以分享: 关键字优化 用Deep...

物件角色建模 Object Role Modeling

ORM (Object Relational Mapping) 是目前在做资料库应用程序中,用来定义...