binaryguy

前言~~

一只纠结型处女座前端渣渣~ 欢迎关注~

由于第一次翻译,如果有错漏之处,还望各位大大指出!leechingyin09@gmail.com
(确实是呕心沥血之作啊_(:з」∠)_


正文从这里开始~~

本文译自:The Making of “The Aviator”: Animating a Basic 3D Scene with Three.js
一篇关于探讨使用 Three.js 创建 3D 动画场景的基础教程。
  • DEMO
  • 源码下载

  • 今天,我们将使用 Three.js 创建一个简单的 3D 飞机飞行的动画场景。Three.js 是一个 3D 类库,它能让 WebGL 变得更加简单。由于 GSL 语法的复杂性,对于许多开发人员来说 WebGL 是一个未知的领域。但是有了 Three.js,在浏览器中 3D 的实现变得简单。
    译注:WebGL 是一项利用 JavaScriptAPI 渲染交互式 3D 电脑图形和 2D 图形的技术,可兼容任何的网页浏览器,无需加装插件。通过 WebGL 的技术,只需要编写网页代码即可实现 3D 图像的展示。GLSL-OpenGL Shading Language 也称作 GLslang ,是一个以 C 语言为基础的高阶着色语言。它是由 OpenGL ARB 所建立,提供开发者对绘图管线更多的直接控制,而无需使用汇编语言或硬件规格语言。详细麻烦谷歌或百度一下~

    在本教程中,我们将创建一个简单的 3D 场景, 在两个主要的部分会有一些交互。在第一部分,我们会讲解 Three.js 的基础和如何创建一个简单的场景。第二部分会详细讲述如何优化模型,如何为场景中的不同元素增添气氛以及更流畅的运动效果。


    由于完整的游戏超出了本教程的范围,但是你可以下载或 checkout 源码。它包含了许多额外有趣的部分如:碰撞,抓硬币和增加得分。


    在本教程中,我们将重点学习 Three.js 中的一些基础概念。这些基础概念将带你走进 WebGL 这新领域!

    事不宜迟,我们马上开始~


    HTML & CSS

    本教程主要采用 Three.js 类库,Three.js 让 WebGL 变得易于使用。从官网GitHub repocheckout 获取关于 Three.js 更多的信息。

    第一样要做的事情就是在 HTML <header> 标签中引入 Three.js:

    <script type="text/javascript" src="js/three.js"></script>
    

    然后在 HTML 中需要添加一个元素作为容器。

    <div id="world"></div>
    

    你可以像下面那样写一些简单的样式,让它填满整个 viewport:

    #world {
       position: absolute;
       width: 100%;
       height: 100%;
       overflow: hidden;
       background: linear-gradient(#e4e0ba, #f7d9aa);
    }
    

    正如你所见的一样,背景有些渐变的效果,就像天空。

    以上是标签和样式!

    JavaScript

    如果你已经掌握了一些 JavaScript 的基础知识,使用 Three.js 会变得相当简单。来~我们看看实现不同部分的代码。

    The Color Palette

    在开始场景编码之前,我觉得定义一个调色板是很有用的。因为在整个项目中会经常使用到。在这个项目中,我们会选择以下这些颜色:

    var Colors = {
       red:0xf25346,  
       white:0xd8d0d1,  
       brown:0x59332e,  
       pink:0xF5986E,
       brownDark:0x23190f,  
       blue:0x68c3c0
    };
    

    代码结构

    虽然 JavaScript 代码十分冗长,但是它的结构很简单。我们需要创建所有主要的函数并放入初始函数中:

    window.addEventListener(\'load\', init, false);
    function init() {
       // 创建场景,相机和渲染器
       createScene();
       // 添加光源
       createLights();
       // 添加对象
       createPlane();
       createSea();
       createSky();
       // 调用循环函数,在每帧更新对象的位置和渲染场景
       loop();
    }
    

    创建场景

    创建一个 Three.js 的项目,我们至少需要以下这些:

    1. 场景: 把这看作一个舞台,将需要呈现的对象都添加进去;
    2. 相机: 在这情况下,我们将使用透视相机,但它也可能是正投影相机;
    3. 渲染器: 使用 WebGL 渲染器显示所有的场景;
    4. 渲染一个或多个对象: 在我们的例子中,我们会创建飞机,大海,天空(一些云);
    5. 光源: 有不同类型可用的光源。在我们的项目中,我们主要用到营造氛围的半球光和制造阴影的方向光。

    createScene 函数中创建场景,相机以及渲染器。

    译注: 1. Three.js 场景只有一种,THREE.Scene 场景是所有物体的容器; 2. 相机决定了场景中哪个角度的景色会显示出来; 3. 渲染器决定了渲染的结果应该显示在页面的什么元素上,并以怎样的方式绘制。

    有了这三样东西,才能使用相机将对象渲染到页面中。

    var scene, camera, fieldOfView, aspectRatio, nearPlane,
        farPlane, HEIGHT, WIDTH, renderer, container;
    function createScene() {
        // 获得屏幕的宽和高,
        // 用它们设置相机的纵横比
        // 还有渲染器的大小
        HEIGHT = window.innerHeight;  
        WIDTH = window.innerWidth;
    
    <span class="c1">// 创建场景
    

    scene = new THREE.Scene();

    <span class="c1">// 在场景中添加雾的效果;样式上使用和背景一样的颜色
    

    scene.fog = new THREE.Fog(0xf7d9aa, 100, 950);

    <span class="c1">// 创建相机
    

    aspectRatio = WIDTH / HEIGHT;
    fieldOfView = 60;
    nearPlane = 1;
    farPlane = 10000;
    /**
    * PerspectiveCamera 透视相机
    * @param fieldOfView 视角
    * @param aspectRatio 纵横比
    * @param nearPlane 近平面
    * @param farPlane 远平面
    */
    camera = new THREE.PerspectiveCamera(
    fieldOfView,
    aspectRatio,
    nearPlane,
    farPlane
    );

    <span class="c1">// 设置相机的位置
    

    camera.position.x = 0;
    camera.position.z = 200;
    camera.position.y = 100;

    <span class="c1">// 创建渲染器
    

    renderer = new THREE.WebGLRenderer({
    // 在 css 中设置背景色透明显示渐变色
    alpha: true,
    // 开启抗锯齿,但这样会降低性能。
    // 不过,由于我们的项目基于低多边形的,那还好

    分类:

    技术点:

    相关文章:

    • 2021-06-14
    • 2022-12-23
    • 2022-12-23
    • 2021-07-24
    • 2021-09-09
    • 2021-08-17
    • 2021-11-12
    • 2021-12-21
    猜你喜欢
    • 2021-11-14
    • 2022-01-03
    • 2021-05-01
    • 2021-04-21
    • 2020-10-05
    • 2021-11-27
    相关资源
    相似解决方案